SpringMVC

SpringMVC

对于SpringMVC的理解

MVC 是模型(Model)、视图(View)、控制器(Controller)的简写

MVC 是一种设计模式,Spring MVC 可以帮助我们进行更简洁的 Web 层的开发,Spring MVC 下我们一般把后端项目分为 Service 层(处理业务)、Dao 层(数据库操作)、Entity 层(实体类)、Controller 层(控制层,返回数据给前台页面)。

SpringMVC的核心组件以及工作原理

核心组件:

  • DispatcherServlet :核心的中央处理器,负责接收请求、分发,并给予客户端响应。
  • HandlerMapping :处理器映射器 ,根据 URL 去匹配查找能处理的 Handler ,并会将请求涉及到的拦截器和 Handler 一起封装。
  • HandlerAdapter :处理器适配器 ,根据 HandlerMapping 找到的 Handler ,适配执行对应的 Handler;
  • Handler :请求处理器,处理实际请求的处理器。
  • ViewResolver :视图解析器 ,根据 Handler 返回的逻辑视图 / 视图,解析并渲染真正的视图,并传递给 DispatcherServlet 响应客户端

流程说明:

  1. 客户端(浏览器)发送请求, DispatcherServlet拦截请求。
  2. DispatcherServlet 根据请求信息调用 HandlerMapping 。HandlerMapping 根据 URL 去匹配查找能处理的 Handler(也就是我们平常说的 Controller 控制器) ,并会将请求涉及到的拦截器和 Handler 一起封装。
  3. DispatcherServlet 调用 HandlerAdapter适配器执行 Handler 。
  4. Handler 完成对用户请求的处理后,会返回一个 ModelAndView 对象给DispatcherServlet,ModelAndView 顾名思义,包含了数据模型以及相应的视图的信息。Model 是返回的数据对象,View 是个逻辑上的 View。
  5. ViewResolver 会根据逻辑 View 查找实际的 View。
  6. DispaterServlet 把返回的 Model 传给 View(视图渲染)。
  7. 把 View 返回给请求者(浏览器)

开后端分离开发:

  • 后端通常不再返回具体的视图,而是返回纯数据(通常是 JSON 格式),由前端负责渲染和展示。

  • View 的部分在前后端分离的场景下往往不需要设置,Spring MVC 的控制器方法只需要返回数据,不再返回 ModelAndView,而是直接返回数据,Spring 会自动将其转换为 JSON 格式。相应的,ViewResolver 也将不再被使用。

  • 使用 @RestController 注解代替传统的 @Controller 注解,这样所有方法默认会返回 JSON 格式的数据,而不是试图解析视图。

    如果你使用的是 @Controller,可以结合 @ResponseBody 注解来返回 JSON

统一异常处理

使用注解的方式统一异常处理,具体会使用到 @ControllerAdvice + @ExceptionHandler 这两个注解

复制代码
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

    @ExceptionHandler(BaseException.class)
    public ResponseEntity<?> handleAppException(BaseException ex, HttpServletRequest request) {
      //......
    }

    @ExceptionHandler(value = ResourceNotFoundException.class)
    public ResponseEntity<ErrorReponse> handleResourceNotFoundException(ResourceNotFoundException ex, HttpServletRequest request) {
      //......
    }
}

这种异常处理方式下,会给所有或者指定的 Controller 织入异常处理的逻辑(AOP),当 Controller 中的方法抛出异常的时候,由被@ExceptionHandler 注解修饰的方法进行处理。

ExceptionHandlerMethodResolver 中 getMappedMethod 方法决定了异常具体被哪个被 @ExceptionHandler 注解修饰的方法处理异常。

getMappedMethod()会首先找到可以匹配处理异常的所有方法信息,然后对其进行从小到大的排序,最后取最小的那一个匹配的方法(即匹配度最高的那个)

相关推荐
ashiho19 天前
【Spring】RequestParam/PathVariable/RequestBody详解
java·后端·spring·servlet·springmvc
罗超驿1 个月前
SpringMVC请求参数获取与响应处理|全套注解详解
springmvc·springboot·javaweb·请求参数·后端开发
he___H2 个月前
SpringMVC与异常
springmvc
月落归舟2 个月前
谈谈SpringMVC底层原理
后端·springmvc
AI人工智能+电脑小能手3 个月前
【大白话说Java面试题 第161题】【06_Spring篇】第21题: SpringMVC工作流程
java·springmvc·工作流程·dispatcherservlet·处理器映射
装不满的克莱因瓶4 个月前
Servlet 到 Spring MVC 架构演进:Java Web 开发二十年技术变迁史
java·spring·servlet·架构·springmvc
lee_curry4 个月前
tomcat+springmvc+spring源码流通过程
java·spring·tomcat·springmvc
jasnet_u4 个月前
SpringMVC 请求处理深度解析:从 DispatcherServlet 到视图渲染
spring·springmvc·springboot
Cyan_RA95 个月前
SpringMVC 数据格式化处理 详解
java·开发语言·spring·mvc·ssm·springmvc·数据格式化
一只大袋鼠5 个月前
SpringMVC 框架中的拦截器
java·springmvc·javaweb·拦截器