【Java劝退师】SpringMVC 知识脑图 - 表现层开源框架

2,325 阅读4分钟

SpringMVC

SpringMVC

表现层开源框架

一、解决的问题

  1. 根据用户输入来构造 Bean
  2. 自动转换数据类型
  3. 校验 用户输入
  4. URL 到 控制器 的灵活映射
  5. 支持 Restful 风格

目的 : 简化 Servlet 开发

二、架构

1. 经典三层

  1. 表现层 Controller : 接收客户端请求、响应结果
  2. 业务层 Service : 处理业务逻辑、控制事务
  3. 持久层 Dao : 访问数据库

2. MVC 架构模式

  1. Model 模型 : 业务模型 - 处理业务、 数据模型 - 封装数据
  2. View 视图 : 数据展示 - Html、JSP
  3. Controller 控制器 : 资源流转 - Servlet

三、请求处理流程

1. 流程

  1. 请求发送至 DispatcherServlet (前端控制器)
  2. DispatcherServlet 调用 HandlerMapping (处理器映射器)
  3. 返回 Handler (处理器) 地址 与 HandlerExecutionChain (处理器运行链)
  4. DispatcherServlet 调用 HandlerAdapter (处理器适配器)
  5. HandlerAdapter 调用 Handler
  6. Handler 返回 ModelAndView(视图对象) 到 HandlerAdapter
  7. HandlerAdapter 返回 ModelAndView 到 DispatcherServlet
  8. DispatcherServlet 调用 ViewResolver (视图解析器) 解析
  9. 返回 View (视图对象)
  10. DispatcherServlet 对 View 进行渲染
  11. DispatcherServlet 返回响应结果

2. 角色

  1. DispatcherServlet 前端控制器 : 将请求分派给对应的处理对象
  2. HandlerMapping 处理器映射器 : 根据 URL 找到对应的 Handler 与 Interceptor
  3. HandlerAdapter 处理器适配器 : 解决同一个 Handler 使用不同方式配置的问题
  4. Handler 处理器 : 具体的请求处理
  5. ViewResolver 视图解析器 : 将 String 类型的视图名解析为 View类型的视图

四、支持参数

  1. HttpServletRequest
  2. HttpServletResponse
  3. HttpSession
  4. 八大基本数据类型及其包装类型 - 布尔值可以为 true、false、1、0
  5. POJO 类 - 传值参数名与POJO属性需保持一致,可以用 " . " 进行进一步定位
  6. 日期 - 需自定义类型转换器
  7. Multipart - Form表单
    1. method = post
    2. enctype = multipart/form-data
    3. file 组件

五、参数校验

可以作用在 POJO类的属性 或 形参上。

搭配 @Valid 使用,校验失败会抛出 MethodArgumentNotValidException,可以在全局异常处理器中拦截。

  1. @NotEmpty : 被注解的字符串的不能为 null 也不能为空 (允许空白字符)
  2. @NotBlank : 被注解的字符串非 null,并且必须包含一个非空白字符
  3. @Null : 被注解的属性必须为 null
  4. @NotNull : 被注解的属性必须不为 null
  5. @AssertTrue : 被注解的属性必须为 true
  6. @AssertFalse : 被注解的属性必须为 false
  7. @Pattern(regex=,flag=) : 被注解的属性必须符合指定的正则表达式
  8. @Email : 被注解的属性必须是 Email 格式
  9. @Min(value) : 被注解的属性必须是一个数字,其值必须大于等于指定的最小值
  10. @Max(value) : 被注解的属性必须是一个数字,其值必须小于等于指定的最大值
  11. @DecimalMin(value) : 被注解的属性必须是一个数字,其值必须大于等于指定的最小值
  12. @DecimalMax(value) : 被注解的属性必须是一个数字,其值必须小于等于指定的最大值
  13. @Size(max=, min=) : 被注解的属性的大小必须在指定的范围内
  14. @Digits (integer, fraction) : 被注解的属性必须是一个数字,其值必须在可接受的范围内
  15. @Past : 被注解的属性必须是一个过去的日期
  16. @Future : 被注解的属性必须是一个将来的日期

mp.weixin.qq.com/s/hGBTtXlnc…

@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
    }
}

六、注解

  1. @RestController("路径") : @Controller + @ResponseBody
  2. @RequestMapping("路径") : 映射 URL 路径
    1. @GetMapping("路径")
    2. @PostMapping("路径")
    3. @PutMapping("路径")
    4. @DeleteMapping("路径")
    5. @PatchMapping("路径")
  3. @RequestParam("参数名") : 将传值参数与形参进行映射
  4. @RequestBody : 仅接收 JSON 格式的媒体类型
  5. @ResponseBody : 返回结果为 JSON 格式字符串,不会再走视图处理器
  6. @ControllerAdvice : 定义全局异常处理类,捕获所有 Controller 对象 handler() 方法抛出的异常
  7. @ExceptionHandler : 处理特定异常,如果写在 Controller 中,将只对当前 Controller 生效
  8. @Valid : 告知此形参需要进行参数校验
  9. @ModelAttribute : 从Model中取出属性

七、过滤器、监听器、拦截器

  1. Filter 过滤器 : 作用在 Servlet 运行前,可以对所有资源进行访问
  2. Listener 监听器 : 只初始化一次,随 Web应用停止而销毁
    1. 做初始化工作
    2. 监听特定事件 - Request、Session 创建、销毁 - 在线人数统计
  3. Interceptor 拦截器 : SpringMVC 框架自己的,只会拦截 Handler 方法,不会拦截静态资源