文章目录
SpringMVC简介
SpringMVC是一种基于Java实现MVC模型的轻量级web框架
SpringMVC技术与Servlet技术等同,都属于web层开发技术
具有使用简单,开发便捷,灵活性强的优点
使用入门
导入MVC坐标和servlet坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
初始化SpringMVC环境,设定加载对应的bean
@Configuration
@ComponentScan("com.test.controller")
public class SpringMvcConfig {
}
创建SpringMVC控制器类
@Controller // 定义bean
@RequestMapping("/users") // 设置模块名作为请求路径前缀
public class UserController {
@RequestMapping("/add"); // 调用路径
@ResponseBody
public void add() {
System.out.println("add");
}
}
初始化Servlet容器,加载SpringMVC环境,设置处理请求
public class ServletContainerInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"}; // 拦截所有
}
// 处理乱码
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
}
启动服务器初始化过程
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了WebApplicationContext对象
- 加载SpringMvcConfig
- 执行@ComponentScan加载对应的bean
- 加载UserController,每个@RequestMapping的名称对应一个具体的方法
- 执行getServletMappings方法,定义所有的请求都通过SpringMVC
单次请求过程
- 发送请求localhost/add
- web容器处理所有请求交给SpringMVC处理
- 解析请求路径/add
- 匹配执行对应的方法add()
- 检测到@ResponseBody直接将add方法的返回值作为响应体返回给请求方
小结
导入坐标,创建web容器启动类,加载mvc配置,设置拦截路径,扫描controller包等操作项目中都只需设置一次,属于一次性工作;需要多次工作的是定义处理请求的控制器类,控制器方法,配置映射路径(@RequestMapping),返回json数据(@ResponseBody)等。
避免Spring错误地加载到SpringMVC的bean
加载Spring控制的bean的时候,排除掉SpringMVC控制的bean
@Configuration
//@ComponentScan({"com.zhexun.mapper", "com.zhexun.service"})
@ComponentScan(value = "com.zhexun",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
请求参数传递
普通参数
@RequestMapping("/commonParam")
@ResponseBody
// 使用RequestParm注解处理前后端参数名不同的参数
public String commonParam(@RequestParm("name") String userName , int age){
System.out.println("userName ==> "+userName);
System.out.println("age ==> "+age);
return "{'module':'common param different name'}";
}
POJO类型参数
请求参数key的名称要和POJO中属性的名称一致,否则无法封装
//请求参数与形参对象中的属性对应即可完成参数传递
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("user ==> "+user);
return "{'module':'pojo param'}";
}
数组类型参数
//同名请求参数可以直接映射到对应名称的形参数组对象中
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] likes){
System.out.println("likes ==> "+ Arrays.toString(likes));
return "{'module':'array param'}";
}
集合类型参数
//同名请求参数可以使用@RequestParam注解映射到对应名称的集合对象中作为数据
@RequestMapping("/listParam")
@ResponseBody
public String listParam(@RequestParam List<String> likes){
System.out.println("likes ==> "+ likes);
return "{'module':'list param'}";
}
JSON数据类型参数
SpringMVC默认使用的是jackson来处理json的转换,需要在pom.xml添加jackson依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
开启SpringMVC注解支持
@Configuration
@ComponentScan("com.test.controller")
//开启json数据类型自动转换
@EnableWebMvc
public class SpringMvcConfig {
}
参数前添加@RequestBody
//使用@RequestBody注解将外部传递的json数组数据映射到形参的集合对象中作为数据
// JSON普通数组
@RequestMapping("/Json")
@ResponseBody
public String Json(@RequestBody List<String> likes){
System.out.println("json list ==> "+likes);
return "{'module':'json param'}";
}
// JSON对象数据
@RequestMapping("/pojoParamForJson")
@ResponseBody
public String pojoParamForJson(@RequestBody User user){
System.out.println("pojo(json)user ==> "+user);
return "{'module':'pojo for json param'}";
}
// JSON对象数组
@RequestMapping("/listPojoParamForJson")
@ResponseBody
public String listPojoParamForJson(@RequestBody List<User> list){
System.out.println("list pojo(json) list ==> "+list);
return "{'module':'list pojo for json param'}";
}
@RequestBody与@RequestParam
-
区别
- @RequestParam用于接收url地址传参,表单传参
- @RequestBody用于接收json数据
-
应用
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数