SpringMVC简介
SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
概述:
SpringMVC是一种基于Java实现的MVC模型的轻量级框架
是一种表现层框架技术
用于进行表现层功能开发
SpringMVC入门
-
导入相关jar包
-
创建SpringMVC控制器类(等同于Servlet功能)
@Controller //将这个类定义成一个bean public class UserController{ //设置当前操作的访问路径 @RequestMapping("/save") //设置当前操作的返回值类型 @ResponseBody public String save(){ sout("user save..."); //返回一个json数据 return "{'info':'springmvc'}"; } }
-
初始化SpringMVC环境,设定SpringMVC加载对应的bean(创建SpringMVC的配置类)
-
再定义一个servlet容器(tomcat)启动的配置类,在里面加载spring的配置,初始化Servlet容器,加载SpringMVC环境,并设置SpringMVC技术处理的请求(让tomcat能够加载SpringMVC配置)
这个配置类需要继承AbstractDispatcherServletInitializer类
AbstractDispatcherServletInitializer类
这是一个SpringMVC提供的快速初始化web容器的抽象类
里面提供了三个接口方法供用户实现
-
createServletApplicationContext()方法:加载springmvc容器配置
protected WebApplicationContext createServletApplicationContext() { //初始化springmvc容器 AnnotationConfigWebApplicationContext app=new AnnotationConfigWebApplicationContext(); //注册加载SpringMvcConfig类 app.register(SpringMvcConfig.class); return app; }
-
getServletMappings():设置哪些请求归属springmvc处理
protected String[] getServletMappings() { return new String[]{"/"}; //表示所有请求都归属springmvc处理 }
-
createRootApplicationContext():加载Spring容器配置
protected WebApplicationContext createRootApplicationContext() { AnnotationConfigWebApplicationContext app=new AnnotationConfigWebApplicationContext(); //注册加载SpringConfig类 app.register(SpringConfig.class); return app; }
-
补充
还可以继承于AbstractAnnotationConfigDispatcherServletInitializer类,这样就只用传递配置类类型就行,不用自己初始化容器
public class ServletInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{ protected Class<?>[] getRootConfigClasses(){ return new Class[]{SpringConfig.class}; } protected Class<?>[] getServletConfigClasses(){ return new Class[]{SpringMvcConfig.class}; } protect Class<?>[] getServletMappings(){ return new String[]{"/"}; } }
bean的加载控制
思考:
因为功能不同,如何避免Spring错误的加载到SpringMVC的bean?
加载Spring的bean时排除掉SpringMVC控制的bean
-
SpringMVC相关的bean(表现层bean)
-
Spring控制的bean
- 业务bean(Service)
- 功能bean(DataSource等)
-
Spring相关bean加载控制
-
方式1:Spring加载的bean设定扫描范围为精准范围,从而防止扫到SpringMVC控制的bean
-
方式2:设定扫描范围依然较大,排除掉SpringMVC控制的bean的包即可(用@Component注解的excludeFilters属性设置要过滤的bean)前提:将要排除的bean的@Configuration注解去掉,才能生效
@Component(value="com.itheima", excludeFilters=@Component.Filter( //指定要根据什么来过滤bean(这里指定的是注解类型) type=FilterType.Annotation, //这里表示要过滤的注解类型 //即只要是带有@Controller注解的bean都会被过滤掉 classes=Controller.class ))
-
-
SpringMVC相关bean控制
- 将SpringMVC控制的bean均放在一个包里
设置请求映射路径
使用@RequestMapping注解来设置
- 位置在方法上:表示这个方法的详细访问路径
- 位置在类上:表示这个类中所有方法的访问路径前缀
get请求和post请求发送参数
普通参数
对于普通参数,不管是get请求还是post都通过在当前操作的方法中设置参数来接收请求参数,相同名称的能够自动映射进去
如果请求参数名和形参名不同
可在形参前加@RequestParam(“请求参数名”)注解,来绑定请求参数与形参之间的关系
post请求中文乱码处理
-
为web容器添加过滤器并指定字符集,Spring-web包中提供了专用的字符过滤器(CharacterEncodingFilter)
//AbstractDispatcherServletInitializer类中提供的加载过滤器的方法 protected Filter[] getServletFilters(){ CharacterEncodingFilter filter=new CharacterEncodingFilter(); filter.setEncoding("utf-8"); return new Filter[]{filter}; }
pojo参数
只要请求参数的属性名与参数中实体类的属性名一样,SpringMVC会自动将请求参数装入对象中
数组参数传递
只要保证请求参数属性名与形参数组名相同即可
集合参数传递
保证请求参数名与形参集合名相同,且在形参集合之前加@RequestParam注解,防止认为集合形参是pojo类,走pojo类型参数的传递流程
JSON数据的传递与接收
- 导jar包
- 在SpringMvcConfig类中,加入@EnableWebMvc注解(开启将json数据转成对象的功能)
- 在参数前加入@RequestBody注解
日期类型参数传递
接收形参时,根据不同的日期格式设置不同的接收方式
默认格式为yyyy/MM/dd 当这个格式不适用时,需要自己去指定
在参数前加 @DateTimeFormat(pattern=“日期格式 如yyyy-MM-dd HH:mm:ss”)
-
Converter接口:实现类型转换功能,保证外面接收的参数能够转成正确类型
public interface Converter<S,T> { @Nullable T convert (S var1); }
该接口作用是转换类型 如
- 请求参数年龄数据 (String->Integer)
- 日期格式转换(String–>Date)
-
这个接口进行类型转换时有默认的转换规则,但有一些转换不能默认开启,这时就需要开启@EnableWebMvc
-
@EnableWebMvc功能之一:根据类型匹配对应的类型转换器
请求与响应
- 响应页面:
在方法前不要加@ResponseBody注解,设置方法返回值为String - 响应字符串:
方法前加@ResponseBody注解,设置方法返回值为String - 响应JSON数据:
方法前加@ResponseBody注解,设置方法返回值为对象,jackson会自动将其转成json数据返回给页面
@ResponseBody注解
作用:设置当前控制器返回值,作为响应体
只有有这个注解,才能开激活类型转换
- 如果返回值是String类型,直接将其作为响应体
- 如果是其他类型,将其转成能够识别的数据,在作为响应体(如对象转json 集合转json)
这里的类型转换用的不是Converter接口
- HttpMessageConverter接口,web专用的类型转换接口
Rest快速开发
可将@ResponseBody提到类前面
在类前面加@ResponseMapping设置访问路径前缀
将@Controller与@ResponseBody合并为@RestController
将方法上的@ResponseMapping中设置http请求动作的method属性简化为@PutMapping @PostMapping 等类似的注解