SpringMVC整体结构介绍!

SpringMVC是一个基于Servlet容器的Web应用框架。

  • Servlet容器通常指Tomcat等服务容器。

Servlet容器会负责监听端口消息并映射为Request/Response对象,然后交给Servlet实例去处理。

SpringMVC框架的作用核心就是Servlet实例。

  • 这个实例在Spring中默认是DispatcherServlet。

Spring MVC结构图

客户端(浏览器)发送请求,直接请求到 DispatcherServlet。

DispatcherServlet 根据请求信息调⽤ HandlerMapping,解析请求对应的 Handler。

解析到对应的 Handler (也就是 Controller 控制器)后,开始由HandlerAdapter 适配器处理。

HandlerAdapter 会根据 Handler 来调⽤真正的处理器开处理请求,并处理相应的业务逻辑。

处理器处理完业务后,会返回⼀个 ModelAndView 对象, Model 是返回的数据对象。

ViewResolver 会根据逻辑 View 查找实际的 View。

DispaterServlet 把返回的 Model 传给 View(视图渲染)。

把 View 返回给请求者(浏览器)。

核心组件DispatcherServlet

在Spring容器启动阶段读取映射规则,如RequestMapping。

在请求到来的时候,按照加载的请求映射规则找到合适的处理方法。

当处理请求的过程中出现了异常,对异常进行处理,如返回合适的界面或状态码。

解析返回View的主题、时区等信息。

渲染返回的视图。

DispatcherServlet功能图

请求映射HandlerMapping

请求映射用于根据请求找到该请求需要调用的所有方法,包含过滤器和处理方法等。

比较常用的一种请求映射是RequestMappingHandlerMapping。

  • 从名称上可以看出来这个HandlerMapping是用于处理@RequestMapping注解请求映射的类。

该类的主要作用是在收到请求之后,按顺序拿到所有需要调用的方法(主要包含拦截器和处理方法),然后一一调用这些方法。

Handler Mapping原理

拦截器HandlerInterceptor

Spring的拦截器可以灵活的在请求处理前、请求处理后和请求完成三个阶段自定义操作,比如用户权限校验等。

Hadler Interceptor

处理方法Handler

处理方法在DispatcherServlet定义为Object类型,如果使用了@RequestMapping来根据请求查找处理方法,那么查找到的处理方法就是HandlerMethod类型,对应于Controller中添加了对应RequestMapping的方法。

处理方法适配器HandlerAdapter

DispatcherServlet从HandlerMapping中获取到的处理方法是Object类型,意味着不同的处理方法可能返回不同的对象。

DispatcherServlet本身是一个调度器,不应该关注如何调用不同的处理方法。

  • 所以Spring提供了HandlerAdapter列表用户处理不同的调度方法。

Hadler

异常处理HandlerExceptionResolver

HandlerExceptionResolver用于处理请求过程中出现的异常。

  • 日常开发中使用比较多的是ExceptionHandlerExceptionResolver,也就是@ExceptionHandler注解。

@ExceptionHander可以放在@ControllerAdvice注解的类中,表示对所有的Controller都会生效。