SpringMVC
SpringMVC简介
SpringMVC概述
- SpringMVC技术与Servlet技术功能等同,均属于web层开发技术
- SpringMVC是一种基于Java实现MVC模型的轻量级Web框架
- 优点
- 使用简单,开发便捷(相比于Servlet)
- 灵活性强
SpringMVC入门案例
-
使用SpringMVC技术需要先导入SpringMVC坐标与Servlet坐标
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.12</version> </dependency>
-
创建SpringMVC控制器类(等同于Servlet功能)
//定义controller //使用@Controller定义@Bean @Controller public class UserController { //设置当前操作的访问路径 @RequestMapping("/save") //设置当前操作的返回值 @ResponseBody public String save(){ System.out.println("user save..."); return "{'module':'springmvc'}"; } }
-
初始化SpringMVC环境(同Spring环境),设定SpringMVC加载对应的bean
//创建springmvc的配置文件,加载controller对应的bean @Configuration @ComponentScan("com.xhj.controller") public class SpringMvcConfig { }
-
初始化Servlet,加载SpringMVC环境,并设置SpringMVC技术处理的请求
//定义一个servlet容器启动的配置,在里面加载spring的配置 public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { //加载springMVC容器配置 @Override protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext annotationConfigWebApplicationContext = new AnnotationConfigWebApplicationContext(); annotationConfigWebApplicationContext.register(SpringMvcConfig.class); return annotationConfigWebApplicationContext; } //设置哪些请求归属springMVC处理 @Override protected String[] getServletMappings() { return new String[]{"/"}; } //加载spring容器配置 @Override protected WebApplicationContext createRootApplicationContext() { return null; } }
使用的注解
名称:@Controller
类型:类注解
位置:SpringMVC控制器定义上方
作用:设定 SpringMVC的核心控制器bean
范例:
@Controller public class UserControll }
名称:@RequestMapping
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器请求访问路径
范例:
//设置当前操作的访问路径 @RequestMapping("/save") //设置当前操作的返回值 @ResponseBody public String save(){ System.out.println("user save..."); return "{'module':'springmvc'}"; }
相关属性
- value(默认):亲求访问路径
名称:@ResponseBody
类型:方法注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法响应内容为当前返回值,无需解析
范例:
//设置当前操作的访问路径 @RequestMapping("/save") //设置当前操作的返回值 @ResponseBody public String save(){ System.out.println("user save..."); return "{'module':'springmvc'}"; }
-
SpringMVC入门开发总结(1+N)
- 一次性工作
- 创建工程,设置服务器,加载工程
- 导入坐标
- 创建web容器启动类,加载SpringMVC配置,并设置SpringMVC请求拦截路径
- SpringMVC核心配置类(设置配置类,扫描controller包,加载Controller控制器bean)
- 多次工作
- 定义处请求的控制器类
- 定义处理请求的控制器方法,并配置映射路径(@RequestMappping)与返回json数据(@ResponseBody)
- 一次性工作
-
AbstractDispatcherServletInitializer类是SpringMVC提供的快速初始化web3.0容器的抽象类
-
AbstractDispatcherServletInitializer提供三个接口方法提供用户实现
-
createServletApplicationContext()方法,创建Servlet容器时,加载SpringMVC对应的bean并放入webApplicationContext对象范围中,而webApplicationContext的作用范围为ServletContext范围,即整个web容器范围
-
getServletMapping()方法,设定对应的请求映射路径,设置为/表示拦截所有请求,任意请求都将转入到SpringMVC进行处理
-
createRootApplicationContext()方法,如果创建Servlet容器时需要加载非SpringMVC对应的bean,使用当前方法进行,使用方式同createServletApplicationContext()
-
入门案例工作流程分析
-
启动服务器初始化过程
- 服务器启动,执行ServletContainersInitConfig类,初始化web容器
- 执行createServletApplicationContext方法,创建了webApplicationContext对象
- 加载SpringMvcConfig
- 执行@ComponentScan加载对应的bean
- 加载UserController,每个@RequestMapping的名称对应一个具体的方法
- 执行getServiceMapping,定义所有的请求都通过SpringMVC
-
单次请求过程
- 发送请求loaclhost:8080/save
- web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
- 解析请求路径/save
- 由/save匹配执行对应的方法save()
- 执行save()
- 检测到由@ResponseBody直接将save()方法的返回值作为响应体返回给请求方
Controller加载控制与业务bean加载控制
- SpringMVC相关bean(表现层bean)
- Spring控制的bean
- 业务bean(Service)
- 功能bean(DataSource等)
- SpringMVC相关bean加载控制
- SpringMVC加载的bean对应的包均在com.xhj.controller包内
- Spring相关bean加载控制
- 方式一:Spring加载的bean设定扫描范围为com.xhj,排除掉controller包内的bean
- 方式二:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
- 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中
请求与响应
请求映射路径
名称:@RequestMapping
类型:方法注解,类注解
位置:SpringMVC控制器方法定义上方
作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀
范例:
@Controller public class BookController { @RequestMapping("/save") @ResponseBody public String save(){ System.out.println("book save..."); return "{'module':'book save'}"; } @RequestMapping("/delete") @ResponseBody public String delete(){ System.out.println("book delete..."); return "{'module':'book delete'}"; } }
属性:
- value(默认):请求访问路径或访问路径前缀
请求方式
- Get请求
- Post请求
Post请求中文乱码处理
-
为web容器添加过滤器并指定字符集,Spring——web包中提供了专用的字符过滤器
@Override protected Filter[] getServletFilters() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); return new Filter[]{filter}; }
请求参数
- 参数种类
- 普通参数
- POJO类型参数
- 嵌套POJO类型参数
- 数组类型参数
- 集合类型参数
请求与响应
-
添加json数据转换相关坐标
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.3</version> </dependency>
-
设置发送json数据
-
开启自动转换json数据支持
- 设置接收json数据
@RequestBody与@RequestParam区别
- 区别
- @RequestParam用于url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
- 应用
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送数据非json格式数据,选用@RequestParam接收请求参数