Struts2请求处理的内部流程说明(版本二)
文章目录
- 请求处理流程图
- 流程说明
请求处理流程图
流程说明
第 1 步:
客户端初始化一个指向 Servlet
容器(例如 Tomcat
)的请求,例如:在浏览器中输入 http:localhost:8080/Struts2/helloworld/helloworldAction.action
就是提交一个HttpServletRequest
请求。
请求会被 Tomcat
接收到,Tomcat
服务器来选择处理这个请求的 Web 应用,那就是由 helloworld
这个 web 工程来处理这个请求。
第 2 步:
Web 容器会去读取 helloworld 这个工程的 web.xml,在 web.xml 中进行匹配,最后发现需要经过一堆的过滤器。
这个请求经过一系列的过滤器(Filter),例如:ActionContextCleanUp
、其他过滤器(SiteMesh
等)、FilterDispatcher
注意:
这里是有顺序的,先 ActionContextCleanUp
,再其它过滤器,最后FilterDispatcher
。FilterDispatcher
是Struts 2 的调度中心,是 Struts 2 的控制器的核心,也就是 Struts 2 框架中的控制层(Controller
)的核心
FilterDispatcher
必须放在滤器链的最后,如果在 FilterDispatcher
前出现了如SiteMesh
这种特殊的过滤器,还必须在 SiteMesh
前引用 Struts 2 的ActionContextCleanUp
过滤器。
Struts 2.1.3 版本后核心控制器 FilterDispatcher
被弃用了,替换成 StrutsPrepareAndExecuteFilter
,因为 FilterDispatch
在执行 Action
之前不能插入自定义的过滤器, 而 StrutsPrepareAndExecuteFilter
可以在执行 Action
之前添加自己的过滤器。如果要使用 ActionContextCleanUp
,则可以通过StrutsPrepareFilter
和 StrutsExecuteFilter
进行替换。
扩展:
Struts 2 的核心控制器 FilterDispatcher
,有 3 个重要的方法:destroy()
、doFilter()
、init()
,执行顺序是:init()
⟹ doFilter()
⟹ destroy()
第 3 步:
接着 FilterDispatcher
被调用,即容器会创建 FilterDispatcher
实例,然后调 doFilter()
方法,在这个方法中,FilterDispatcher
询问 ActionMapper
是否需要调用某个 Action
来处理这个(HttpServletRequest
)请求,如果 ActionMapper
决定需要调用某个 Action
,ActionMapper
会通知 FilterDispatcher
需要处理这个请求,FilterDispatcher
会停止过滤器链以后的部分,(这也就是为什么 FilterDispatcher 应该出现在过滤器链的最后的原因)。FilterDispatcher
则把请求的处理交给 ActionProxy
,即建立一个 ActionProxy
实例,这个对象作为Action
与 xwork
之间的中间层,会代理 Action
的运行过程。
第 4 步:
ActionProxy
通过 ConfigurationManager
询问框架的配置文件(struts.xml
),找到需要调用的 Action
类
注意:
在服务器启动的时候,ConfigurationManager
就会把 struts.xml
中的所有信息读到内存里,并缓存,当 ActionProxy
带着 URL
向他询问要运行哪个 Action
的时候,就可以直接查找并返回
第 5 步:
ActionProxy
创建一个 ActionInvocation
实例,同时 ActionInvocation
通过代理模式调用 Action
。但在调用之前,ActionInvocation
会根据配置加载 Action
相关的所有 Interceptor
(拦截器),即调用 Action
的过程前后,涉及到相关拦截器的调用
第 6 步:
一旦 Action
执行完毕,ActionInvocation
负责根据 struts.xml
中的配置找到对应的返回结果 result
。返回结果通常是一个需要被表示的 JSP
或者 FreeMarker
的模版(不一定是页面,也可能是另外的一个 Action
链)。在表示的过程中可以使用 Struts 2 框架中继承的标签。在这个过程中需要涉及到 ActionMapper
。
第 7 步:
最后,ActionInvocation
对象倒序执行拦截器。ActionInvocation
对象执行完毕后,已经得到响应对象(HttpServletResponse
)了,最后按与过滤器配置定义相反的顺序依次经过过滤器,向客户端展示出响应的结果,即通过 HTTPServletResponse
返回客户端一个响应。
Struts2请求处理的内部流程说明(版本二)相关推荐
- Struts2请求处理的内部流程说明(版本一)
流程说明: 1.客户端浏览器(Client)向服务器发送一个 http 请求(HttpServletRequest) 2.Container(容器) 通过 web.xml 映射请求,并获得控制器(Co ...
- Struts2请求处理流程及源码分析
Struts2请求处理流程及源码分析 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(Site ...
- struts2请求处理过程源代码分析(1)
2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://www.see-source.com/ 源码解析网 网上对于struts2请求处理流程的讲解还是比较多的 ...
- 【Google Play】正式版上架流程 ( 创建版本 | 设置国家地区 | 发布正式版 )
Google Play 上架完整流程 系列文章目录 [Google Play]创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 ) [Google Play]创建并设置应用 ( 访 ...
- 学编程前博主是做测试的,当初在测试部作为一个小官还写了不少流程呢,今天突然翻到来跟大家分享一下测试流程(之测试内部流程)
··· 这个测试内部流程写于2010年6月,那个时候刚从大公司出来进了一个小公司.待惯大公司的人再去小公司真的不习惯,大公司分工分明,流程清晰:小公司就不一样了,什么都不明确,逮着什么干什么,逮着着谁 ...
- SQL Server 内存中OLTP内部机制概述(二)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- 企业内部流程运转受阻?免费又高效不愧是它
编者按:企业日常管理中会遇到各种各样的问题,其中企业内部流程管理问题,便是企业一个比较大的心病.此文,我们就来看看,MyApps平台匠心打造的工作流引擎,对企业内部流程管理的超神赋能作用. 工作流引擎 ...
- 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)
[Activity学习五]--基于SSM整合Activiti之请假流程实现(二) 1.部署流程资源 2.查询流程定义信息 3.发布请假流程 4.查询用户任务 5.提出请假 6.老板查看请假任务 7.老 ...
- EOS测试链加入流程(代码版本与主网同步)
测试网络 EOS 测试链加入流程 (代码版本与主网同步) caokun_8341 · 4 分钟前 · 5 次阅读 准备:测试链目前的版本是v1.7.3 一.生成一个密钥对,私钥一定保存好,不要泄露,公 ...
最新文章
- jni返回byte[]
- Linux下的Shell编程之Helloworld.sh看过来
- arduino 蓝牙示例_,arduino 蓝牙例子,
- Android 系统(104)---浅谈ANR及log分析ANR
- js:{}与new Object()的区别是什么
- UVa 10129 - Play on Words (欧拉回路, DFS)
- 威纶通触摸屏如何打开并升级EB8000旧版本项目并更换触摸屏型号?
- 测试用例设计方法————正交表法
- 佐罗一键新机数据导出导入文件夹
- voip和rtc_VoIP语音通话研究【进阶篇(四):freeswitch+webrtc+sip.js的通话】
- Python 流程控制
- 中学-知识与能力【9】
- JS实现双十一倒计时抢购效果
- 安卓车机数字时间屏保
- 相机的连拍和水印的功能
- 装饰器模式:藏在漫威电影里的设计模式
- 浅谈 「现代 Web 开发」 范式
- 博尔德大学计算机专业本科,2020美国大学计算机专业本科排名
- 在VS中使用Wind数据终端API的经验(一)
- Excel?国产开源在线表格Luckysheet走红GitHub
热门文章
- lua加密教程_我们相信加密! 教程
- javaone_JavaOne 2015 –又一年,又向前迈进了一步
- 通用编程_通用编程准则
- ssm 返回json配置_摆脱困境:将运行时配置作为JSON返回
- java ee maven_针对新手的Java EE7和Maven项目–第7部分
- angular java_带有Angular JS的Java EE 7 –第1部分
- jpa 手动预编译_编译时检查JPA查询
- java jax-rs_在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据
- Java中的双重检查锁定
- Http基本身份验证在Spring Security中如何工作?