Spring mvc DispatchServlet 实现机制
来源:互联网 发布:美工需要学什么软件 编辑:程序博客网 时间:2024/06/05 12:48
在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherServlet中进行的,DispatcherServlet是实现servlet接口的实现类。
DispatcherServlet 在 web.xml 中的配置如下:
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern><!-- 如果写斜杠的话那就表示请求是否加后缀都可以 --></servlet-mapping>
DispatcherServlet 源码解析
DispatcherServlet 的 init() 方法在 HttpServletBean() 中实现的
init()
1. 解析DispatcherServlet 配置的参数,封装成 ServletConfigPropertyValues对象。
2. 将当前Servlet 类型的实例转换成BeanWrapper类型的实例。以便使用Spring中提供的注入功能进行对应的属性注入。这些属性如contextAttribute、contextClass、nameSpace、contextConfigLocation 等,都可以在web.xml 文件中以初始化参数的方式配置在servlet 的声明中。
3. 调用 initServletBean() 初始化servletBean。
onRefresh() 方法
在初始化servletBean的时候,最终会调用 onRefresh() 方法,该方法主要是刷新Spring在web功能实现中所必须使用的全局变量。
- initMultipartResolver(context);
初始化文件上传的处理类 - initLocaleResolver(context);
初始化国际化配置的处理类 - initThemeResolver(context);
初始化主题资源的处理类 - initHandlerMappings(context);
初始化处理请求的类,主要负责处理请求调用Controller的处理类。 - initHandlerAdapters(context);
初始化HandlerAdapter的适配器 - initHandlerExceptionResolvers(context);
初始化异常处理类。 - initRequestToViewNameTranslator(context);
初始化视图转换器,用于直接将请求转换为逻辑视图名。 - initViewResolvers(context);
初始化视图解析器,定义了如何通过view 名称来解析对应View实例的行为 - initFlashMapManager(context);
初始化Flash Map,提供一个请求存储属性,可供其它请求使用。
DispatchServlet的请求处理逻辑
servlet 接受到请求后,会调用service() 方法,然后service根据HTTP响应的请求方法进行调用响应的逻辑处理。
从类结构中,可以看出SpringMVC 支持 GET、POST、PUT、DELETE、OPTIONS、TRACE方法
从代码中,我们发现这几个方法交给 processRequest() 来进行处理请求。
processRequest()->doService()->doDispatch()
通过跟踪代码,最终处理请求的核心代码在doDispatch()方法中。
doDispatch() 方法
1. 检查该请求是否是文件上传请求,如果是则把request转换为 MultipartHttpServletRequest类型。
2. 根据request信息查找对应的Handler,如果没有找到对应的Handler,则通过response反馈错误信息。
3. 通过当前的handler 查找对应的HandlerAdapter
4. 判断该HTTP请求是不是HEAD或GET请求,如果是则检查HTTP请求头部的LastModified属性,来判断该页面是否需要重新加载。
1. applyPreHandle() 执行该请求所匹配的拦截器,并调用所有匹配拦截器的preHandle()方法,进行处理
2. 调用handle() 方法去根据请求路径去调用用户实现的Controller实现逻辑
3. applyPostHandle()执行该请求所有匹配的拦截器,并调用所有匹配拦截器的postHandle()方法,进行处理
4. processDispatchResult()处理页面跳转和调用拦截器的afterCompletion() 方法
processDispatchResult() 方法
1. 处理异常信息
2. 如果Controller成功返回了ModelAndView,则通过render()方法进行响应相应的页面信息
3. 执行完毕后,执行该请求所有匹配的拦截器,并调用所有匹配拦截器的afterCompletion()方法,进行处理
本人简书blog地址:http://www.jianshu.com/u/1f0067e24ff8
点击这里快速进入简书
GIT地址:http://git.oschina.net/brucekankan/
点击这里快速进入GIT
- Spring mvc DispatchServlet 实现机制
- SPRING MVC的实现机制
- SPRING MVC的实现机制
- Spring mvc HandlerMapping 实现机制
- 实现DispatchServlet比spring的好用,哈哈
- spring mvc 配置DispatchServlet 的<url-pattern>/</url-pattern>的写法
- 如何让Spring MVC DispatchServlet拦截所有的.do请求,比如/system/*.do!
- spring mvc框架源码分析(一)-封装请求拦截器DispatchServlet
- Spring MVC 机制
- Spring mvc视图机制
- Spring mvc ViewResolver视图解析器实现机制
- spring中Dispatchservlet中doDispath方法分析
- Spring MVC的工作机制
- spring MVC异常捕获机制
- spring mvc 实现原理
- spring mvc注解实现
- spring mvc注解实现
- spring mvc注解实现
- C#信号的使用方法---c#中AutoResetEvent
- DOM操作之确定元素大小
- Async/Await替代Promise的6个理由
- 利用tomcat在linux服务器发布项目
- 20170930 编译型语言和解释型语言
- Spring mvc DispatchServlet 实现机制
- sublime text 3 注册码
- Java排序算法总结(汇总版)
- CSRF是什么?
- 趣图丨论精简代码和臃肿代码的区别
- ida pro so文件f5后伪c后的 jni函数优化
- ado连接oracle提示 未找到提供程序,可能程序未正确安装
- JSP页面输入框验证
- IE8下 iframe子页面document.documentElement报错(未指明的错误。)