Here's question about struts2.......

1.struts2原理

  

  1. 初始的请求通过一条标准的过滤器链,到达 servlet 容器 ( 比如 tomcat 容器,WebSphere 容器 )。
  2. 过滤器链包括可选的 ActionContextCleanUp 过滤器,用于系统整合技术,如 SiteMesh 插件。
  3. 接着调用 FilterDispatcher,FilterDispatcher 查找 ActionMapper,以确定这个请求是否需要调用某个 Action。
  4. 如果 ActionMapper 确定需要调用某个 Action,FilterDispatcher 将控制权交给 ActionProxy。
  5. ActionProxy 依照框架的配置文件(struts.xml),找到需要调用的 Action 类。
  6. ActionProxy 创建一个 ActionInvocation 的实例。ActionInvocation 先调用相关的拦截器 (Action 调用之前的部分),最后调用 Action。
  7. 一 旦 Action 调用返回结果,ActionInvocation 根据 struts.xml 配置文件,查找对应的转发路径。返回结果通常是(但不总是,也可能是另外的一个 Action 链)JSP 技术或者 FreeMarker 的模版技术的网页呈现。Struts2 的标签和其他视图层组件,帮助呈现我们所需要的显示结果。在此,我想说清楚一些,最终的显示结果一定是 HTML 标签。标签库技术和其他视图层技术只是为了动态生成 HTML 标签。
  8. 接着按照相反次序执行拦截器链 ( 执行 Action 调用之后的部分 )。最后,响应通过滤器链返回(过滤器技术执行流程与拦截器一样,都是先执行前面部分,后执行后面部)。如果过滤器链中存在 ActionContextCleanUp,FilterDispatcher 不会清理线程局部的 ActionContext。如果不存在 ActionContextCleanUp 过滤器,FilterDispatcher 会清除所有线程局部变量。

示意图流程

ActionMapper  

ActionInvocation To get proxy

  

2 valuestack

  

    1. valueStack 的建立是在 doFilter 的开始部分,在 Action 处理之前。即使访问静态资源 ValueStack 依然会建立,保存在 request 作用域。
    2. ValueStack 在逻辑上包含 2 个部分:object stack 和 context map,object stack 包含 Action 与 Action 相关的对象。context map 包含各种映射关系。request,session,application,attr,parameters 都保存在 context map 里。
      parameters: 请求参数
      atrr: 依次搜索 page, request, session, 最后 application 作用域。
        1. Struts2 框架,把 ActionContext 设置为 OGNL 上下文。ActionContext 持有 application,session,request,parameters 的引用。ActionContext 也持有 value stack 对象的引用 ( 注意这个时候 value stack 特指 Object stack)。
          上述对象的引用,ActionContext 不直接持有,而是通过自己的属性 Map<String, Object> context
          持有引用。处理 OGNL 表达式最顶层的对象是 Map<String, Object> context。

          public interface ValueStack {
          public abstract CompoundRoot getRoot();
          // 省略细节
          public abstract Object peek();
          public abstract Object pop();
          public abstract void push(Object o);
          } public class CompoundRoot extends ArrayList {
          // 省略细节
          }

最新文章

  1. 千回百折:百度Java研发offer斩获记和经验分享
  2. Struts2 源码分析——调结者(Dispatcher)之action请求
  3. CSS3 background-size属性
  4. .NET通用开发框架
  5. myeclipse打war包
  6. YTU 2986: 删除区间内的元素(线性表)
  7. STL--STL和她的小伙伴们:
  8. Basic Vlan Configure
  9. MySQL 5.7.9多源复制报错修复
  10. Visual Studio 2017 Bugs
  11. 单张滑动tab 组件
  12. Powerdesigner+PostgreSQL
  13. 用一个div模拟textarea的实现
  14. ASP.NET Core中使用GraphQL - 第四章 GraphiQL
  15. 软件工程---UML理解
  16. docker基本管理
  17. Visual Studio资源汇总
  18. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
  19. Iterator,迭代器模式,C++描述
  20. 〖Android〗CyanogenMod同步错误的解决

热门文章

  1. 利用IDEA构建springboot应用-配置文件
  2. Java练习 SDUT-1580_闰年
  3. Python基础:13装饰器
  4. Flask学习之十三 日期和时间
  5. day2_python之数据类型常用操作方法
  6. hdu 1434 幸福列车 (Leftist Tree)
  7. Google Colab——用谷歌免费GPU跑你的深度学习代码
  8. codeforces1238-div2
  9. js实现div的碰壁反弹效果
  10. H3C 高级ACL部署位置示例