DispatcherServlet的处理流程
前言
上一篇介绍了SpringMVC的启动过程,DispatcherServlet作为一个前端控制器,分发处理http请求
1.DispatcherServlet流程图
具体流程:
1. 用户发请求-->DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制。
2.DispatcherServlet-->HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器,多个HandlerInterceptor拦截器)。
3.DispatcherServlet-->HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器。
4.HandlerAdapter-->处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理,并返回一个ModelAndView对象(包含模型数据,逻辑视图名)
5.ModelAndView的逻辑视图名-->ViewResolver,ViewResoler将把逻辑视图名解析为具体的View。
6.View-->渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构
7.返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户。
2.HandlerMapping
HandlerMapping处理器映射器,功能是根据请求的url找到合适的处理器。
2.1 HandlerMapping结构图
2.2 BeanNameUrlHandlerMapping
BeanNameUrlHandlerMapping处理器映射器,会根据请求的url与spring容器中定义的处理器bean的name属性值进行匹配,从而在spring容器中找到处理器bean实例.
<!-- 注册处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- 注册处理器-->
<bean id="/show.do" class="com.example.handlers.HelloWorldController" />
对于处理器的bean的name属性值必须以"/"开头
2.3 SimpleUrlHandlerMapping
使用BeanNameUrlHandlerMapping映射器有两点不足:
1.处理器Bean的id为一个url请求路径,而不是Bean的名称,有些不伦不类。
2.处理器Bean的定义与请求url绑定在了一起。若出现多个url请求同一个处理器的情况,就需要在spring容器中配置多个该处理器类的<bean/>。这将导致容器会创建多个该处理器类实例。
SimpleUrlHandlerMapping处理器映射器,会根据请求的url与Spring容器中定义的处理器映射器子标签的key属性进行匹配。匹配上后,再将该key的value值与处理器bean的id值进行匹配,从而在Spring容器中找到处理器bean。
<!--注册处理器映射器-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.do">myController</prop>
<prop key="/world.do">myController</prop>
<prop key="/my.do">myController</prop>
</props>
</property>
</bean> <!--注册处理器-->
<bean id="myController" class="com.examaple.handlers.MyController">
2.4 DefaultAnnotationHandlerMapping
主要是针对注解,这个已废弃使用,用RequsetMappingHandlerMapping来代替
2.5 RequestMappingHandlerMapping
针对注解@RequestMapping @Controller的
3.HandlerAdapter
HandlerApdater处理器适配器,作用是根据请求的url找到处理器的调用方法
3.1 HandlerAdapter体系结构图
3.2 RequestMappingHandlerAdapter
实际就是执行@RequestMapping注解的方法。
3.3 AnnotationMethodHandlerAdapter
已被废弃,就不做过多介绍
3.4 SimpleControllerHandlerAdapter
实际就是执行Controller的handleRequest方法。要求handler必须实现Controller接口
3.5 HttpRequestHandlerAdapter
实际就是执行HttpRequestHandler的handleRequest方法。要求handler必须实现HttpRequestHandler接口
3.6. SimpleServletHandlerAdapter
实际就是执行HttpServlet的service方法
DispatcherServlet的处理流程的更多相关文章
- 描述一下 DispatcherServlet 的工作流程 ?
DispatcherServlet 的工作流程可以用一幅图来说明: 1.向服务器发送 HTTP 请求,请求被前端控制器 DispatcherServlet 捕获. 2. DispatcherServl ...
- SpringMVC源码剖析(三)- DispatcherServlet的初始化流程
在我们第一次学Servlet编程,学Java Web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转 ...
- SpringMVC源码分析(3)DispatcherServlet的请求处理流程
<springmvc源码分析(2)dispatcherservlet的初始化>初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的 ...
- spring mvc dispatcherservlet处理request流程
1.dispatcherservlet接收到请求后,doDispatch(request,response) 2.doDispatch()里进行handlermapping,handlermappin ...
- DispatcherServlet 分发流程
0 太长不看版 HTTPServlet 的 Service 方法将请求按类进行分解 主要是根据HTTP方法的类型调用 doXXX 方法 GET 和 HEAD 方法需要对 if-modified-sin ...
- DispatcherServlet作用
DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好 ...
- 6.理解DispatcherServlet
DispatcherServlet的作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,负责职责的分派, 且与Spring IoC容器无缝 ...
- 前端控制器DispatcherServlet 详解
DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...
- 第三章 DispatcherServlet详解
3.1.DispatcherServlet作用 DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring Io ...
随机推荐
- Wyx20162314 2016-2017-2 《程序设计与数据结构》课程总结
20162314 2016-2017-2 <程序设计与数据结构>课程总结 一.每周作业.结对编程博客的链接汇总 预备作业一01 20162314:专业的期许.浅谈师生关系.对未来学习任务的 ...
- [nowcoder]再编号
链接:https://www.nowcoder.com/acm/contest/158/C 每变化一次,tot=tot*(n-1),且每两个数之差delta*=-1,直接根据这两个性质暴力循环1000 ...
- Java Lambda表达
Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...
- ftp禁止切换回上级目录
打开并编辑/etc/vsd/vsd.conf # vi /etc/vsd/vsftpd.conf 取消如下行注释 chroot_list_enable=YES 保存并重启vsftpd # /etc/i ...
- geoserver源码学习与扩展——kml/kmz转shapefile文件
geoserver通过工作空间Workspace-数据源DataStore-图层Layer管理地理数据,默认只支持shapefile格式的文件发布,不支持kml/kmz.csv的文件格式,所以存在将这 ...
- Map 的 key、value 是否允许为null
Map的key和value是否允许null? 直接写程序验证一下: import java.util.HashMap; import java.util.Hashtable; import java. ...
- Entity Framework 6 Code First 系列:无需修改实体和配置-在MySql中使用和SqlServer一致的并发控制
无需修改实体和配置,在MySql中使用和SqlServer一致的并发控制.修改RowVersion类型不可取,修改为Timestamp更不可行.Sql Server的RowVersion生成一串唯一的 ...
- python学习笔记(异常处理)
上次提到正则表达式 当未匹配到数据返回值 None 再使用 match.group 会出现异常 AttributeError 为了避免异常我改成“ match != None” 这次加入异常处理 #! ...
- c#实现验证某个IP地址是否能ping通
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Net ...
- Codeforces Round #250 (Div. 2)D
给你一张无向图,每个点有一个权值,对于一条从l到r 的边权值是l到r路径上最小的点的权值,(多条路取最大的权值),然后求每两个点之间的权值和/点对数 题解:并查集维护,先从点大的边排序,然后依次加边, ...