DispatcherServlet工作原理探究
来源:互联网 发布:网络签约写手的收入 编辑:程序博客网 时间:2024/05/22 01:56
转自:http://blog.csdn.net/waeceo/article/details/53470140
下面类图将主要的类及方法抽离出来,以便查看方便,根据类的结构来说明整个请求是如何工作的
主要使用到的技术有spring的IOC容器和Servlet。
假如我们要实现一个请求home.htm然后返回home.jsp视图资源则
当home.htm请求到达时,我们需要DispatcherServlet来处理该请求,所以首先配置该Servlet
第一步需要在web.xml中配置DispatcherServlet,使该servlet来接收请求并做进一步处理。
这个部分很好理解,如果请求以.htm结尾则交给名为dispatch类为DispatcherServlet的Servlet处理。
从类图中很容易看出DispatcherServlet最终继承的是HttpServlet,也就是说它同样满足Servlet的工作原理
Servlet初始化时需要调用init方法,在HttpServletBean中实现,该init方法调用了initServletBean,该方法在FrameworkServlet中实现
initServletBean主要初始化关于配置文件的内容,比如{servlet-name}-servlet.xml
第二步,需要在/WebRoot/WEB-INF下新建名为{servlet-name}-servlet.xml的spring bean配置文件。(该示例中即为dispatch-servlet.xml)
在初始化过程中会去寻找该配置文件,当然我们也可以自己去设置参数来更改配置文件所在路径
比如我们如果在src下新建的该配置文件dispatch-servlet,在编译后会被复制到WEB-INF/classes文件夹下,
配置文件还是按照命名规范做吧(可以修改为其他名字)
此时的配置就会去寻找/WEB-INF/classes/dispatch-servlet.xml
当请求到达后Servlet将调用service方法进行处理,由于我们是通过输入网址方式的get方法请求,Servlet将调用doGet方法
此处的doGet方法在FrameworkServlet中实现,doGet方法调用processRequest方法,processRequest则调用doService方法处理
而doService在DispatcherServlet中实现,doService再调用了DispatcherServlet的doDispatch方法,
该方法则会根据request找到转发对象,并进行请求转发操作,
下面是获取实际的视图资源部分
这里需要我们自己实现Controller接口并实现handleRequest方法,返回对应的ModelAndView对象。
下面是请求转发的部分
下面是设置model和modelValue第三步,编写实现Controller的类
第四步,在dispatch-servlet.xml中配置该bean提供给spring web使用。
这里name将用来匹配请求的资源(默认的使用BeanNameUrlHandlerMapping处理,由bean Name映射 URL),在home.htm请求到达时,
spring将使用实现了Controller接口的HomeController的handleRequest方法来返回映射的视图资源。
在得到MoldelAndView对象后,需要根据这个MoldelAndView对象得到View name然后来解析得到View对象
此处需要我们配置viewResolver bean给spring使用,指明使用哪个类充当viewResolver并具有什么属性
第五步,配置viewResolver bean
中间可以加上prefix或者suffix
这些配置完成后,spring就会根据请求地址以及配置信息,找到视图资源并做请求转发操作
总结:整个流程分析下来,其实主要就是做两个操作,
首先请求信息到达DispatchServlet,Servlet中根据请求信息与配置文件找到映射的视图资源
然后使用RequestDispatch请求转发到该视图资源。
另外,可以分成多个bean配置文件,在web.xml中配置载入
其中contextConfigLocation这个名字可能是匹配FrameworkServlet的setContextConfigLocation方法
也有可能是匹配ContextLoaderListener继承ContextLoader的CONFIG_LOCATION_PARAM
public static final String CONFIG_LOCATION_PARAM = "contextConfigLocation";
(不确定,不太了解context-param的用法,API上两个类关于这个变量的说明都类似,也分不太清楚,反正可以这么记- -||)
然后配置的viewResolver bean的id为什么要为viewResolver,下面的是DispatcherServlet中一个静态字符串说明了一切
public static final String VIEW_RESOLVER_BEAN_NAME = "viewResolver";
- DispatcherServlet工作原理探究
- DispatcherServlet工作原理探究
- Spring MVC中DispatcherServlet工作原理探究
- Spring MVC中DispatcherServlet工作原理探究
- Spring MVC中DispatcherServlet工作原理探究
- DispatcherServlet 工作原理
- struts2 工作原理探究
- SpringMVC工作原理解读--DispatcherServlet类源码解读(初级)
- Android进阶 - View 工作原理探究
- Spring DispatcherServlet 工作机制
- 亲身探究Windows内核工作原理(06-8-1)
- Nutch源代码浅析(四)探究fetch的工作原理
- 6 Spring入门 DispatcherServlet的工作方式
- jQuery 原理初步探究
- Spring 事务管理原理探究
- Yum原理探究
- memcache 原理探究
- solr replication原理探究
- POJ2253 Frogger
- Git项目转移
- finecmsV5.0.8 \finecms\dayrui\controllers\Api.php getshell
- c#枚举enum
- wkwebview 字体大小调整 网页内容高度计算
- DispatcherServlet工作原理探究
- 敌兵布阵 【hdu-1166】【树状数组】
- open-falcon 前端安装笔记及问题。
- Android xUtils3源码解析之注解模块
- Java Effective 总结(0)
- 百度地图显示多个点
- Weird Rounding (Codeforces-779B)
- 为独立服务器安装 Grid Infrastructure
- 解决方法 [ubuntu phpmyadmin 错误提示: 缺少 mcrypt 扩展,请检查 php 配置]