<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
首先需要了解 ModelAndView Model ModelMap 三者区别
ModelAndView 返回值类型是ModelAndView
可以用来存储数据 :modelAndView.addObject("msg","hello");
设置返回视图:modelAndView.setViewName("/pages/message.jsp");也就是要转发的页面
Model返回值类型是String
可以用来存储数据:model.addAttribute("msg","hello");
配合返回值String类型 来进行转发
ModelMap String
可以用来存储数据:modelMap.addAttribute("msg","hello");
配合返回值String类型 来进行转发
spring配置:
一.入门案例及介绍
1.<!--配置组件扫描,让Spring容器去加载组件-->
<context:component-scan base-package="com.itheima"/>
2.配置web.xml
<servlet>
<servlet-name>DispacherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置初始化的配置文件springmvc.xml路径地址-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-*.xml</param-value>
</init-param>
<!--表示容器在应用启动时就加载并初始化这个servlet,如果是负数或没有,随意时机加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--设置Servlet拦截的请求路径-->
<servlet-mapping>
<servlet-name>DispacherServlet</servlet-name>
<!--
当前servlet拦截的请求路径
含义:拦截所有以.do结尾的请求url地址
-->
<url-pattern>*.do</url-pattern> 后续会使用Restful风格拦路径需要修改为“/”
</servlet-mapping>
3.创建处理器(也就以前的controller层)
举例:
@Controller//使用@Controller注解的类称为处理器
public class HelloController {
/**
* 处理器里面可以原有多个使用@RequestMapping注解的方法
* 每个方法映射为一个HTTP接口
*
* modelAndView是spring提供的数据视图对象
* 用于为指定视图(jsp页面)以及提供数据
*/
@RequestMapping("/sayHello") //可以通过/sayHello.do来访问
public ModelAndView sayHello(ModelAndView modelAndView){
// 设置模型数据
modelAndView.addObject("nowDate",new Date());
modelAndView.addObject("msg","hello");
// 设置视图(真实路径)
modelAndView.setViewName("/pages/message.jsp");
return modelAndView;
}
}
二.请求流程
1.浏览发起请求到前端控制器DispatcherServlet
mvc:annotation-driven/
2.前端控制器请求HandlerMapping查找Handler
3.处理器映射器(HandlerMapping)向前端控制器返回HandlerExecutionChain(处理器链)
4.前端控制器调用处理器适配器HandlerAdaper执行Handler
5.处理器适配器会根据适配结果去执行Handler
6.Handler执行完成后会返回给处理器适配器ModelAndView
7.Handler执行完成后,处理器适配器会返回ModelAndView(中包裹Model和View)给前端控制器
8.前端吧控制器会请求视图解析器去进行视图解析 可以在spring-mvc.xml中配置视图解析器
9.视图解析器向前端控制器返回View
10前端控制器进行视图渲染 将数据填充到request中
11.前端控制器向用户响应结果
三.注解讲解
@RequestMapping:
请求映射
设置请求路径
在一个方法上配置多个路径@RequestMapping(value = {"sayHello1","sayHello2"})
有个method属性可以指定请求方式:Get请求,Post请求,Delete请求,Put请求
举例: method = RequestMethod.GET
可以标记在类上 :窄化请求映射
可以标记在方法上:下面例访问路径为 localhost:8080//hello/sayHellp
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/sayHello")
public ModelAndView sayHello(){
// ……
}
}
四.请求参数获取 注意都在参数上获取
简单类型:
直接参数名与name相同就可以获取参数
参数名与name不相同可以通过注解来指定 举例:@RequestParam("user_id") Integer id就能获取前端的user_id并赋值给id
逐个接收:定多个方法变量,接收多个参数
参数格式:id=1&username=zhangsan
Pojo类型:(实体类):
可以直接写实体类名获取: User user
复杂类型: pojo内有pojo属性 可以通过改变前端name来获取
数组类型: String[] args 前端都叫args
list集合
@RequestParam("args") List
五.类型转换
举例日期类型转换
会自动识别2002/10/12 不会识别2020-12-12
有两种方式解决
1.注解方式比较简单
@DateTimeFomat标记在属性上方 可以写在 pojo属性上方 也能写在参数Date类型
自定义类型转换器 (后修改xml)
实现Converter<String,Date>接口 重写convert方法
举例:
public class DateStringConverter implements Converter<String,Date> {
//重写接口的抽象方法,参数由泛型决定
public Date convert(String source) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
//类型转换器无法预计使用过程中出现的异常,因此必须在类型转换器内部捕获,不允许抛出,框架无法预计此类异常如何处理
try {
date = df.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
<!--3. mvc的注解驱动-->
<!--类型转换器工厂对象需要使用 mvc注解驱动加载-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!--创建类型转换器的工厂对象-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.itheima.StringToDateConverter"></bean>
</set>
</property>
</bean>
编码过滤器这里不进行代码演示 CharacterEncodingFilter类
通过在web.xml中配置Filter 初始化参数加上编码