一、SpringMVC简介
1.SpringMVC概述
SpringMVC与Servlet技术具有相同的功能,都属于web层的开发技术。前者是一种基于Java实现MVC模型的轻量级web框架。
2.优点
相比于servlet代码量更少,灵活性强。
二、SpringMVC的使用
1.导入SpringMVC和Servlet坐标
2.创建SpringMVC控制器类(等同于servlet的功能)
1)将该类定义为Bean
表现层的Bean用@Controller
2)定义方法
3)配置该方法的页面访问路径
@RequestMapping("/请求访问路径"),相当于以前的@Servlet("")
4)@ResponseBody
将2)定义的方法的返回值作为响应体发送给浏览器:
3.初始化SpringMVC环境
创建SpringMvcConfig配置类,扫描SpringMVC加载对应的Bean(控制器类)
4.创建servlet容器启动的配置类★
DispatcherServlet是前置控制器,用来拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理。
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化web3.0容器的抽象类。
三、Bean加载控制
1.Controller加载控制和业务Bean记载控制
SpringMVC加载表现层Bean(Controller),Spring加载业务Bean(Service)和功能Bean(DataSource)等。在我们的包结构下这些Bean都放在com包下,因此要控制SpringMVC只加载表现层Bean,Spring加载其控制的Bean的同时时不加载表现层Bean。所以需要在加载Spring控制的Bean时排除掉SpringMVC控制的Bean。
(1)SpringMVC相关Bean加载控制
SpringMVC加载的Bean对应的包均在com.controller包内。
(2)Spring相关Bean加载控制
1)法一:设定精确扫描范围,如service包、dao包等
2)法二:设定扫描范围为com包,然后排除掉controller包
excludeFilters属性的作用是,排除扫描路径中加载的Bean,需要指定排除方式type(即按什么规则排除)和具体项classes(要排除哪些),这里排除方式是FilterType.ANNOTATION(按注解方式排除),具体项是Controller.class(排除所有@Controller注解的Bean)。
2.加载SpringMVC和Spring配置类
(1)普通开发
(2)简化开发
继承AbstractAnnotationConfigDispatcherServletInitializer,只需要提供配置类即可加载。
四、Request请求
1.设置请求访问路径
@RequestMapping:用来设置controller方法的请求访问路径。放在方法定义上方,代表设置当前方法的请求访问路径;放在类定义上方,代表设置当前controller所有方法的请求访问路径前缀。
2.两种请求方式发送数据
(1)Get请求
1)使用PostMan发送数据
采用url地址传参,即:url?数据1&数据2
2)controller接收数据
①请求参数名与形参同名:
②请求参数名与形参名不同:使用@RequestParam进行映射,将name映射到userName:
(2)Post请求
1)使用PostMan发送数据
Post请求方式下,数据在请求体(Body)里,所以要点Body按钮。
2)controller接收数据
在形参定义接收数据的同名参数:
(3)处理中文乱码问题
使用过滤器(Filter)处理中文乱码问题。
1)在Servlet启动配置类中配置字符过滤器(CharacterEncodingFilter)
2)设置字符集setEncoding("UTF-8")
3.请求参数的传递
(1)普通参数(同上)
(2)pojo参数
1)发送参数
同普通参数
2)接收参数
将pojo类定义为形参
(3)pojo嵌套pojo
如User中嵌套Address:
1)发送参数
2)接收数据(同pojo参数)
(4)数组参数
1)发送参数
多个“KEY”同名:
2)接收数据
(5)集合参数
1)发送参数
同数组参数
2)接收数据
(6)★json数据参数传递
1)导处理json数据的坐标(jackson-databind)
2)在SpringMvcConfig上开启json与pojo的转换功能
3)发送json数据
①json数组
②json对象
③json对象数组
4)接收数据
因为json数据在请求体(requestbody)里,在形参前加@RequestBody,表示将requestbody中的json数据传递给请求形参:
①json数组
②json对象
③json对象数组
【tips】@RequestParam与@RequestBody的区别
①@RequestParam:用于接收url地址传参和表单传参(application/x-www-form-urlencoded);
②@RequestBody:用于接收json数据(application/json)
(7)日期类型(Date)参数传递
1)发送数据
2)接收数据
用@DateTimeFormat( pattern = "发送的日期类型格式" )来接收指定格式的日期类型参数:
五、Response响应
响应页面和数据时,不加@ResponseBody,表示响应页面;加上,表示响应数据。
1.响应页面
不需要加@ResponseBody,直接返回要访问的页面:
2.响应数据
(1)响应文本数据
加@ResponseBody,返回文本数据:
(2)★响应json数据(pojo对象、pojo集合对象)
加@ResponseBody,将返回值类型设为要响应的数据类型,直接返回要相应的数据: