SpringMVC 解析(一)概览
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 解析(一)概览的更多相关文章
- springmvc 解析xml数据
springmvc 解析xml数据 http://blog.csdn.net/zhi_jun/article/details/37925475
- Okhttp解析—Okhttp概览
Okhttp解析-Okhttp概览 Okhttp作为目前Android使用最为广泛的网络框架之一,我们有必要去深入了解一下,本文是Okhttp解析的第一篇,主要是从宏观上认识Okhttp整个架构是如何 ...
- SpringMVC解析5-DispatcherServlet逻辑细节
MultipartContent类型的request处理 对于请求的处理,spring首先考虑的是对于Multipart的处理,如果是MultipartContent类型的request,则转换req ...
- SpringMVC解析3-DispatcherServlet组件初始化
在spring中,ContextLoaderListener只是辅助功能,用于创建WebApplicationContext类型实例,而真正的逻辑实现其实是在DispatcherServlet中进行的 ...
- SpringMVC解析1-使用示例
Spring MVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行定制.Spring的MVC是基于servlet功能实现的,通过实现Servlet接口的Dispatch ...
- Druid SQL 解析器概览
概览 Druid 的官方 wiki 对 SQL 解析器部分的讲解内容并不多,但虽然不多,也有利于完全没接触过 Druid 的人对 SQL 解析器有个初步的印象. 说到解析器,脑海里便很容易浮现 par ...
- SpringMVC解析2-ContextLoaderListener
对于SpringMVC功能实现的分析,我们首先从web.xml开始,在web.xml文件中我们首先配置的就是ContextLoaderListener,那么它所提供了功能有哪些又是如何实现的?当使用编 ...
- SpringMVC解析Json字符串
不同第三方jar对json串的解析效果不同. 1. json包 <dependency> <groupId>org.json</groupId> <artif ...
- 微信推送给服务器的XML消息解析-springmvc 解析xml数据流
微信推送给服务器的XML消息解析: 可以使用request.getInputStream(); 获取输入的消息流:但是需要自己解析流: spring mvc自带解析功能: controller中: @ ...
随机推荐
- Git忽略提交规则 .gitignore文件
在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.简单来说一个场景:在你使用git add .的时候,遇到 ...
- 甘特图中与任务有关的操作(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 任务建好了不是马上就没事了,后面还有各种事,比如像我这种粗心的,冷不丁就会冒出个"通假字"什么的,难道 ...
- VMware 安装Linux (以CentOS7-2009为例)
1.VMware下载安装 链接:https://pan.baidu.com/s/11Y-AFB3aaAFxafdGPw4zaw 提取码:hskj 2.CentOS镜像官网下载:https://www. ...
- 如何完成符合ISO 26262要求的基于模型设计(MBD)的测试
背景介绍 随着汽车行业的迅速发展,汽车的复杂程度不断增加,越来越多的汽车电子控制系统具有与安全相关的功能,因此对ECU的安全要求也越来越高.复杂的软件功能,将会带来大量的软件风险问题,如何保证软件的安 ...
- 同步IO与一部IO、IO多路复用(番外篇)select、poll、epoll三者的区别;blocking和non-blocking的区别 synchronous IO和asynchronous IO的区别
Python之路,Day9 , IO多路复用(番外篇) 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. ...
- js中的jQuery Validate增加手机号码验证
$.validator.addMethod("isPhone", function(value,element) { var length = value.length; var ...
- 【LeetCode】1170. Compare Strings by Frequency of the Smallest Character 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 双重循环 日期 题目地址:https://leetc ...
- 1193 - Dice (II)
1193 - Dice (II) PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 32 MB You h ...
- Codeforces 919D:Substring(拓扑排序+DP)
D. Substring time limit: per test3 seconds memory limit: per test256 megabytes inputstandard: input ...
- Wavelet Transforms
目录 目标 小波变换 Scaling Functions Wavelet Functions 二者的联系 离散的情形 高效变换 二维的情形 示例 目标 首先, 既然是变换, 那么就是从一个域到另一个域 ...