SpringMVC
表现层开源框架
一、解决的问题
- 根据用户输入来构造 Bean
- 自动转换数据类型
- 校验 用户输入
- URL 到 控制器 的灵活映射
- 支持 Restful 风格
目的 : 简化 Servlet 开发
二、架构
1. 经典三层
- 表现层 Controller : 接收客户端请求、响应结果
- 业务层 Service : 处理业务逻辑、控制事务
- 持久层 Dao : 访问数据库
2. MVC 架构模式
- Model 模型 : 业务模型 - 处理业务、 数据模型 - 封装数据
- View 视图 : 数据展示 - Html、JSP
- Controller 控制器 : 资源流转 - Servlet
三、请求处理流程
1. 流程
- 请求发送至 DispatcherServlet (前端控制器)
- DispatcherServlet 调用 HandlerMapping (处理器映射器)
- 返回 Handler (处理器) 地址 与 HandlerExecutionChain (处理器运行链)
- DispatcherServlet 调用 HandlerAdapter (处理器适配器)
- HandlerAdapter 调用 Handler
- Handler 返回 ModelAndView(视图对象) 到 HandlerAdapter
- HandlerAdapter 返回 ModelAndView 到 DispatcherServlet
- DispatcherServlet 调用 ViewResolver (视图解析器) 解析
- 返回 View (视图对象)
- DispatcherServlet 对 View 进行渲染
- DispatcherServlet 返回响应结果
2. 角色
- DispatcherServlet 前端控制器 : 将请求分派给对应的处理对象
- HandlerMapping 处理器映射器 : 根据 URL 找到对应的 Handler 与 Interceptor
- HandlerAdapter 处理器适配器 : 解决同一个 Handler 使用不同方式配置的问题
- Handler 处理器 : 具体的请求处理
- ViewResolver 视图解析器 : 将 String 类型的视图名解析为 View类型的视图
四、支持参数
- HttpServletRequest
- HttpServletResponse
- HttpSession
- 八大基本数据类型及其包装类型 - 布尔值可以为 true、false、1、0
- POJO 类 - 传值参数名与POJO属性需保持一致,可以用 " . " 进行进一步定位
- 日期 - 需自定义类型转换器
- Multipart - Form表单
- method = post
- enctype = multipart/form-data
- file 组件
五、参数校验
可以作用在 POJO类的属性 或 形参上。
搭配 @Valid 使用,校验失败会抛出 MethodArgumentNotValidException,可以在全局异常处理器中拦截。
- @NotEmpty : 被注解的字符串的不能为 null 也不能为空 (允许空白字符)
- @NotBlank : 被注解的字符串非 null,并且必须包含一个非空白字符
- @Null : 被注解的属性必须为 null
- @NotNull : 被注解的属性必须不为 null
- @AssertTrue : 被注解的属性必须为 true
- @AssertFalse : 被注解的属性必须为 false
- @Pattern(regex=,flag=) : 被注解的属性必须符合指定的正则表达式
- @Email : 被注解的属性必须是 Email 格式
- @Min(value) : 被注解的属性必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) : 被注解的属性必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) : 被注解的属性必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) : 被注解的属性必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=) : 被注解的属性的大小必须在指定的范围内
- @Digits (integer, fraction) : 被注解的属性必须是一个数字,其值必须在可接受的范围内
- @Past : 被注解的属性必须是一个过去的日期
- @Future : 被注解的属性必须是一个将来的日期
@ControllerAdvice(assignableTypes = {PersonController.class})
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
}
}
@Service
@Validated
public class PersonService {
public void validatePerson(@Valid Person person){
// do something
}
}
六、注解
- @RestController("路径") : @Controller + @ResponseBody
- @RequestMapping("路径") : 映射 URL 路径
- @GetMapping("路径")
- @PostMapping("路径")
- @PutMapping("路径")
- @DeleteMapping("路径")
- @PatchMapping("路径")
- @RequestParam("参数名") : 将传值参数与形参进行映射
- @RequestBody : 仅接收 JSON 格式的媒体类型
- @ResponseBody : 返回结果为 JSON 格式字符串,不会再走视图处理器
- @ControllerAdvice : 定义全局异常处理类,捕获所有 Controller 对象 handler() 方法抛出的异常
- @ExceptionHandler : 处理特定异常,如果写在 Controller 中,将只对当前 Controller 生效
- @Valid : 告知此形参需要进行参数校验
- @ModelAttribute : 从Model中取出属性
七、过滤器、监听器、拦截器
- Filter 过滤器 : 作用在 Servlet 运行前,可以对所有资源进行访问
- Listener 监听器 : 只初始化一次,随 Web应用停止而销毁
- 做初始化工作
- 监听特定事件 - Request、Session 创建、销毁 - 在线人数统计
- Interceptor 拦截器 : SpringMVC 框架自己的,只会拦截 Handler 方法,不会拦截静态资源