Struts||IQ
2024-09-03 21:28:06
Here's question about struts2.......
1.struts2原理
- 初始的请求通过一条标准的过滤器链,到达 servlet 容器 ( 比如 tomcat 容器,WebSphere 容器 )。
- 过滤器链包括可选的 ActionContextCleanUp 过滤器,用于系统整合技术,如 SiteMesh 插件。
- 接着调用 FilterDispatcher,FilterDispatcher 查找 ActionMapper,以确定这个请求是否需要调用某个 Action。
- 如果 ActionMapper 确定需要调用某个 Action,FilterDispatcher 将控制权交给 ActionProxy。
- ActionProxy 依照框架的配置文件(struts.xml),找到需要调用的 Action 类。
- ActionProxy 创建一个 ActionInvocation 的实例。ActionInvocation 先调用相关的拦截器 (Action 调用之前的部分),最后调用 Action。
- 一 旦 Action 调用返回结果,ActionInvocation 根据 struts.xml 配置文件,查找对应的转发路径。返回结果通常是(但不总是,也可能是另外的一个 Action 链)JSP 技术或者 FreeMarker 的模版技术的网页呈现。Struts2 的标签和其他视图层组件,帮助呈现我们所需要的显示结果。在此,我想说清楚一些,最终的显示结果一定是 HTML 标签。标签库技术和其他视图层技术只是为了动态生成 HTML 标签。
- 接着按照相反次序执行拦截器链 ( 执行 Action 调用之后的部分 )。最后,响应通过滤器链返回(过滤器技术执行流程与拦截器一样,都是先执行前面部分,后执行后面部)。如果过滤器链中存在 ActionContextCleanUp,FilterDispatcher 不会清理线程局部的 ActionContext。如果不存在 ActionContextCleanUp 过滤器,FilterDispatcher 会清除所有线程局部变量。
示意图流程
ActionMapper
ActionInvocation To get proxy
2 valuestack
- valueStack 的建立是在 doFilter 的开始部分,在 Action 处理之前。即使访问静态资源 ValueStack 依然会建立,保存在 request 作用域。
- 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 作用域。 -
- 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 {
// 省略细节
}
- Struts2 框架,把 ActionContext 设置为 OGNL 上下文。ActionContext 持有 application,session,request,parameters 的引用。ActionContext 也持有 value stack 对象的引用 ( 注意这个时候 value stack 特指 Object stack)。
-
最新文章
- 千回百折:百度Java研发offer斩获记和经验分享
- Struts2 源码分析——调结者(Dispatcher)之action请求
- CSS3 background-size属性
- .NET通用开发框架
- myeclipse打war包
- YTU 2986: 删除区间内的元素(线性表)
- STL--STL和她的小伙伴们:
- Basic Vlan Configure
- MySQL 5.7.9多源复制报错修复
- Visual Studio 2017 Bugs
- 单张滑动tab 组件
- Powerdesigner+PostgreSQL
- 用一个div模拟textarea的实现
- ASP.NET Core中使用GraphQL - 第四章 GraphiQL
- 软件工程---UML理解
- docker基本管理
- Visual Studio资源汇总
- BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)
- Iterator,迭代器模式,C++描述
- 〖Android〗CyanogenMod同步错误的解决