SpringMVC知识图谱
概念:SpringMVC 是一种用于表现层的Web框架
需要的包
- javax.servlet-api
- spring-webmvc
使用流程
- 定义 SpringMVC配置类 类似于Spring配置类
- 定义 Servlet容器配置类,用于启动容器时加载springmvc配置,设置springmvc的处理路径
- 配置类需 继承 AbstractDispatcherServletInitializer
- 重写 加载springmvc配置的方法
- 返回 AnnotationConfigWebApplicationContext
- 重写 springmvc处理路径的方法
- 重写 spring的配置方法
- 重写 加载springmvc配置的方法
- 配置类需 继承 AbstractDispatcherServletInitializer
启动服务器初始化过程
服务器启动,执行ServletContainersInitConfig类,初始化web容器
执行createServletApplicationContext方法,创建了WebApplicationContext对象
加载SpringMvcConfig执行@ComponentScan加载对应的bean
加载UserController,每个@RequestMapping的名称对应一个具体的方法
执行getServletMappings方法,定义所有的请求都通过SpringMVC
单次请求流程
单次请求过程
发送请求localhost/save
web容器发现所有请求都经过SpringMVC,将请求交给SpringMVC处理
解析请求路径/save
由/save匹配执行对应的方法save()
执行save()
检测到有@ResponseBody直接将save()方法的返回值作为响应体返回
常用注解
- @EnableWebMvc
- 开启自动转换json数据支持,需要导入Jakson包
- 根据类型匹配对应的转换器
- @Controller
- 声明类为一个SpringMVC的控制器,同时也是一个Bean
- @RequestMapping
- 设置请求访问路径
- 可以写在类或者方法上
- @ResponseBody
- 设置响应内容为当前返回值,无需解析
- @RequestBody
- 接收请求体里的内容,一般用于接收json
- @RequestParam
- 映射请求参数和请求处理方法的参数,映射集合必加
- 用于接收url和表单的参数
- @DateTimeFormat
- 用于接收日期 例如2001/10/9
- @EnableWebMvc
请求参数传递
- 请求参数自动转换映射是由Converter接口以及其实现类提供的
- 请求参数名与请求处理方法参数名相同时可自动映射
- 如果不同 可以使用@RequestParam 指定请求参数的名
- 请求参数名与POJO实体类的属性名相同时可自动映射
- 如果嵌套实体类,则请求参数名.xxx就映射到内嵌的实体中
- 请求参数名多个相同,请求处理方法可以用数组接收
- 如果用List等集合接收则需要加@RequestParam
- 如果接收请求体里的参数,则需要在请求处理方法中添加@RequestBody,一般用于json
- 如果接收日期类型,默认请求为2001/10/9直接使用Date类接收,如果请求为2001-10-9则需要使用@DateTimeFormat
响应
- 响应类型自动转换是由HttpMessageConverter接口实现的
- 默认返回页面名
- 如果返回其他数据,可以使用@ResponseBody
REST风格
- REST (Representational State Transfer) ,表现形式状态转换
- 即将请求路径转换为请求参数的风格
- 优点
- 安全,隐藏资源的行为,无法通过地址得知何种操作
- 书写简化
- 行为动作
- Get 查询
- Post 新增
- Put 修改
- Delete 删除
- 常用注解
- @RestController
- 表示一个类是REST风格的控制器
- 包括了@Controller 和 @ResponseBody
- @GetMapping
- 只接受Get请求
- @PostMapping
- 只接受Post请求
- @PutMapping
- 只接受Put请求
- @DeleteMapping
- 只接受Delete请求
- @PathVariable
- 指明参数来自于路径
- /{id} 将请求路径变为请求参数,添加此注解
- @RestController
WebMvcConfigurationSupport 类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23/** 解决跨域问题 **/
void addCorsMappings(CorsRegistry registry) ;
/** 添加拦截器 **/
void addInterceptors(InterceptorRegistry registry);
/** 视图跳转控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 这里配置视图解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 配置内容裁决的一些选项 **/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 视图跳转控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 静态资源处理 避免静态资源被拦截**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默认静态资源处理器 **/
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);异常处理器
- 用于拦截表现层出现的所有异常,统一处理
- @ControllerAdcice
- @RestControllerAdcice 表示类
- @ExceptionHandler 表示处理方法,指定处理的异常类型
- 异常处理方案
- 项目异常分类
- 业务异常 BusinessException
- 规范用户行为异常
- 不规范用户行为异常
- 系统异常 SystemException
- 可预计无法避免的异常
- 其他异常 Exception
- 编程人员未预计到的异常
- 业务异常 BusinessException
- 自定义异常,包装,抛出
- 项目异常分类
拦截器
- (Interceptor )是一种动态拦截方法调用的机制
- 作用
- 在指定方法(控制器)调用前后执行预先定义好的代码
- 阻止原方法的执行
- 制作拦截器
- 实现HandlerIntercepter
- 重写 preHandler 控制器执行前
- 重写 postHandler 控制器执行后
- 重写 afterCompletion 请求完成后
- 配置拦截器
- 或 继承 WebMvcConfigurationSupport 类
- 或 实现 WebMvcConfigurer 接口
- 重写addInterceptors方法,注册拦截器,配置拦截路径
- 拦截器参数
- 基础参数
- request 请求对象
- response 响应对象
- handler 拦截的方法(反射)
- posthandler
- modelAndView 控制器返回的视图和模型
- exception 处理过程中的异常
- 基础参数
- 拦截器链
- 配置多个拦截器时形成拦截器链
- 拦截器的配置顺序就是拦截器的运行顺序
- prehandler是顺序
- posthandler和afterCompletion 逆序
- prehandler返回false就会阻挡后面配置的拦截器