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中: @ ...
随机推荐
- 有个性的手动计划模式(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 任务工作表里默认的标题"工期"."开始时间"."结束时间"这些 ...
- Kubernetes 集群无损升级实践 转至元数据结尾
一.背景 活跃的社区和广大的用户群,使 Kubernetes 仍然保持3个月一个版本的高频发布节奏.高频的版本发布带来了更多的新功能落地和 bug 及时修复,但是线上环境业务长期运行,任何变更出错都可 ...
- MVC中的打印功能
HTML页面: @{ Layout = "~/Views/Shared/_IframeLayout.cshtml";}@Scripts.Render(ViewBag.ScriptP ...
- 前端实现list排序
需求 针对list中某个字段,实现list的升序和降序 效果图 代码 我是用在angular1.X中项目的,根据list中的sort字段进行排序. # sort.html <style> ...
- Excel转Json升级版-Python
Excel转Json升级版 将excel文件夹中所有xslx文件全部转换json文件,存放在data文件夹中: excel中的格式,从序号为2的行开始,2行为key:1行可以自由写注释: 使用时用双击 ...
- UDP&串口调试助手用法(3)
发送参数配置 下面以 UDP 通道为例介绍 发送数据配置 概览 选择数据源 文件: 选择发送的文件 源码: 自己手动键入发送数据,默认输入的为16进制数据, 定时器发送周期 单位为毫秒. 发送帧计数 ...
- c++之Linux获取可用串口
1.关于 这份代码来自: stackoverflow 2. 测试 2.1 测试环境: vmware + ubuntu, vmware添加串口(虚拟机关机后再添加) 2.2 测试输出 3. 源码 #in ...
- Brute-force Algorithm(hdu3221)
Brute-force Algorithm Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- MacOS使用Docker创建MySQL主主数据库
主从同步配置可以参考上一篇MacOS使用Docker创建MySQL主从数据库 一.创建MySQL数据库容器配置文件对应目录 我们在当前用户下创建一组目录,用来存放MySQL容器配置文件,(Linux下 ...
- IDEA 延长使用
压缩包下载地址:https://i.cnblogs.com/files 1.先以试用的形式进入idea,然后help -> Edit Custom VM Options 2.插入 :-javaa ...