文章目录

  • 请求处理流程图
  • 流程说明

请求处理流程图

流程说明

第 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,再其它过滤器,最后FilterDispatcherFilterDispatcher 是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,则可以通过StrutsPrepareFilterStrutsExecuteFilter 进行替换。

扩展:

Struts 2 的核心控制器 FilterDispatcher,有 3 个重要的方法:destroy()doFilter()init(),执行顺序是:init()doFilter()destroy()

第 3 步:

接着 FilterDispatcher 被调用,即容器会创建 FilterDispatcher 实例,然后调 doFilter() 方法,在这个方法中,FilterDispatcher 询问 ActionMapper 是否需要调用某个 Action 来处理这个(HttpServletRequest)请求,如果 ActionMapper 决定需要调用某个 ActionActionMapper 会通知 FilterDispatcher 需要处理这个请求,FilterDispatcher 会停止过滤器链以后的部分,(这也就是为什么 FilterDispatcher 应该出现在过滤器链的最后的原因)。FilterDispatcher 则把请求的处理交给 ActionProxy,即建立一个 ActionProxy 实例,这个对象作为Actionxwork 之间的中间层,会代理 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请求处理的内部流程说明(版本二)相关推荐

  1. Struts2请求处理的内部流程说明(版本一)

    流程说明: 1.客户端浏览器(Client)向服务器发送一个 http 请求(HttpServletRequest) 2.Container(容器) 通过 web.xml 映射请求,并获得控制器(Co ...

  2. Struts2请求处理流程及源码分析

    Struts2请求处理流程及源码分析 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助(Site ...

  3. struts2请求处理过程源代码分析(1)

    2019独角兽企业重金招聘Python工程师标准>>> 转载自:http://www.see-source.com/ 源码解析网 网上对于struts2请求处理流程的讲解还是比较多的 ...

  4. 【Google Play】正式版上架流程 ( 创建版本 | 设置国家地区 | 发布正式版 )

    Google Play 上架完整流程 系列文章目录 [Google Play]创建 Google 开发者账号 ( 注册邮箱账号 | 创建开发者账号 ) [Google Play]创建并设置应用 ( 访 ...

  5. 学编程前博主是做测试的,当初在测试部作为一个小官还写了不少流程呢,今天突然翻到来跟大家分享一下测试流程(之测试内部流程)

    ··· 这个测试内部流程写于2010年6月,那个时候刚从大公司出来进了一个小公司.待惯大公司的人再去小公司真的不习惯,大公司分工分明,流程清晰:小公司就不一样了,什么都不明确,逮着什么干什么,逮着着谁 ...

  6. SQL Server 内存中OLTP内部机制概述(二)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  7. 企业内部流程运转受阻?免费又高效不愧是它

    编者按:企业日常管理中会遇到各种各样的问题,其中企业内部流程管理问题,便是企业一个比较大的心病.此文,我们就来看看,MyApps平台匠心打造的工作流引擎,对企业内部流程管理的超神赋能作用. 工作流引擎 ...

  8. 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)

    [Activity学习五]--基于SSM整合Activiti之请假流程实现(二) 1.部署流程资源 2.查询流程定义信息 3.发布请假流程 4.查询用户任务 5.提出请假 6.老板查看请假任务 7.老 ...

  9. EOS测试链加入流程(代码版本与主网同步)

    测试网络 EOS 测试链加入流程 (代码版本与主网同步) caokun_8341 · 4 分钟前 · 5 次阅读 准备:测试链目前的版本是v1.7.3 一.生成一个密钥对,私钥一定保存好,不要泄露,公 ...

最新文章

  1. jni返回byte[]
  2. Linux下的Shell编程之Helloworld.sh看过来
  3. arduino 蓝牙示例_,arduino 蓝牙例子,
  4. Android 系统(104)---浅谈ANR及log分析ANR
  5. js:{}与new Object()的区别是什么
  6. UVa 10129 - Play on Words (欧拉回路, DFS)
  7. 威纶通触摸屏如何打开并升级EB8000旧版本项目并更换触摸屏型号?
  8. 测试用例设计方法————正交表法
  9. 佐罗一键新机数据导出导入文件夹
  10. voip和rtc_VoIP语音通话研究【进阶篇(四):freeswitch+webrtc+sip.js的通话】
  11. Python 流程控制
  12. 中学-知识与能力【9】
  13. JS实现双十一倒计时抢购效果
  14. 安卓车机数字时间屏保
  15. 相机的连拍和水印的功能
  16. 装饰器模式:藏在漫威电影里的设计模式
  17. 浅谈 「现代 Web 开发」 范式
  18. 博尔德大学计算机专业本科,2020美国大学计算机专业本科排名
  19. 在VS中使用Wind数据终端API的经验(一)
  20. Excel?国产开源在线表格Luckysheet走红GitHub

热门文章

  1. lua加密教程_我们相信加密! 教程
  2. javaone_JavaOne 2015 –又一年,又向前迈进了一步
  3. 通用编程_通用编程准则
  4. ssm 返回json配置_摆脱困境:将运行时配置作为JSON返回
  5. java ee maven_针对新手的Java EE7和Maven项目–第7部分
  6. angular java_带有Angular JS的Java EE 7 –第1部分
  7. jpa 手动预编译_编译时检查JPA查询
  8. java jax-rs_在Java EE 7和WildFly中使用Bean验证来验证JAX-RS资源数据
  9. Java中的双重检查锁定
  10. Http基本身份验证在Spring Security中如何工作?