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> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map 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 方法,不会拦截静态资源