ActionContext表格总结
用一张表格来总结:
| 变量 | 从ActionContext中获得 | 生命周期 | 用Ongl来读取值 | 使用ServletConfigInterceptor来注入 |
| ActionContext类 | 静态方法ActionContext. getContext() | 一次Http请求 | 使用“#”加上key,如“#name” | 无法注入 |
| ValueStack类 | ActionContext. getValueStack() | 一次Http请求 | 直接填写来访问栈中对象的方法,或者使用top来直接获得栈中对象 | 无法注入 |
| HttpServletRequest类 | ActionContext. get( StrutsStatics. HTTP_REQUEST) | 一次Http请求 | 无方便的方法 | 实现ServletRequestAware接口 |
| request的Map | ActionContext. get("request") | 一次Http请求 | 使用“#request”再加上key,如“#request.name”或者“#request['name']” | 实现RequestAware接口 |
| parameters的Map | ActionContext. get( "parameters") | 一次Http请求 | 使用“# parameters”再加上key,如“#parameters .name”或者“#parameters ['name']” | 实现ParameterAware接口 |
| HttpServletSession类 | 无(需通过HttpServletRequest来获得) | 一次Http Session会话 | 无方便的方法 | 无法注入 |
| session的Map | ActionContext. get("session") | 每次请求创建,但在一次Http Session会话中数据都是一样的 | 使用“#session”再加上key,如“# session.name”或者“#session ['name']” | 实现SessionAware接口 |
| ServletContext类 | ActionContext. get( StrutsStatics. SERVLET_CONTEXT) | 网站项目启动后一直存在且唯一 | 无方便的方法 | 使用ServletContextAware接口 |
| application的Map | ActionContext.get( "application") | 每次请求时创建,但其中的数据是网站项目启动后一直存在且共享 | 使用“# application”再加上key,如“#application .name”或者“#application ['name']” | 使用ApplicationAware接口 |
附录1 ActionContext中到底有哪些数据
| key | key的声明处 | value的类型 | value.toString() |
|
com. opensymphony. xwork2. dispatcher. HttpServletRequest |
StrutsStatics. HTTP_REQUEST | org. apache. struts2. dispatcher. StrutsRequestWrapper | org. apache. struts2. dispatcher. StrutsRequestWrapper @10984e0 |
| application | 无 | org. apache. struts2. dispatcher. ApplicationMap | 略 |
| com. opensymphony. xwork2. ActionContext. locale | ActionContext. LOCALE | java. util. Locale | zh_CN |
| com. opensymphony. xwork2. dispatcher. HttpServletResponse | StrutsStatics. HTTP_RESPONSE | org. apache. catalina. connector. ResponseFacade | org. apache. catalina. connector. ResponseFacade @14ecfe8 |
|
xwork. NullHandler. createNullObjects |
Boolean | false | |
| com. opensymphony. xwork2. ActionContext. name | ActionContext. ACTION_NAME | String | index |
|
com.opensymphony. xwork2.ActionContext. conversionErrors |
ActionContext. CONVERSION_ERRORS |
java. util. HashMap | {} |
| com. opensymphony. xwork2. ActionContext. application | ActionContext. APPLICATION | org. apache. struts2. dispatcher. ApplicationMap | 略 |
| attr | 无 | org. apache. struts2. util. AttributeMap | org. apache. struts2. util. AttributeMap @133a2a8 |
| com. opensymphony. xwork2. ActionContext. container | ActionContext. CONTAINER | com. opensymphony. xwork2. inject. ContainerImpl | com. opensymphony. xwork2. inject. ContainerImpl @fc02c8 |
| com. opensymphony. xwork2. dispatcher. ServletContext | StrutsStatics. SERVLET_CONTEXT | org. apache. catalina. core. ApplicationContextFacade | org. apache. catalina. core. ApplicationContextFacade @11ad78c |
| com. opensymphony. xwork2. ActionContext. session | ActionContext. SESSION | org.apache.struts2. dispatcher.SessionMap | {} |
|
com.opensymphony. xwork2.ActionContext. actionInvocation |
ActionContext. ACTION_INVOCATION | com. opensymphony. xwork2. DefaultActionInvocation | com. opensymphony. xwork2. DefaultActionInvocation @13d4497 |
| xwork. MethodAccessor. denyMethodExecution | 笔者很懒,没有找 | Boolean | false |
| report. conversion. errors | 笔者很懒,没有找 | Boolean | false |
| session | 无 | org. apache. struts2. dispatcher. SessionMap | {} |
| com. opensymphony. xwork2. util. ValueStack. ValueStack | ValueStack.VALUE_STACK | com. opensymphony. xwork2. ognl. OgnlValueStack | com. opensymphony. xwork2. ognl. OgnlValueStack @16237fd |
| request | 无 | org. apache. struts2. dispatcher. RequestMap | 略 |
| action | 笔者很懒,没有找 | com. example. MyAction | 略 |
| struts. actionMapping | 笔者很懒,没有找 | org. apache. struts2. dispatcher. mapper. ActionMapping | org. apache. struts2. dispatcher. mapper. ActionMapping @892cc5 |
| parameters | 无 | java. util. HashMap | {} |
| com. opensymphony. xwork2. ActionContext. parameters | ActionContext.PARAMETERS | java. util. TreeMap | {} |
注意:该表格为了排版在某些地方加了空格。
可以看出,有些相同的对象被以不同的key多次设置到ActionContext中。如果想看看创建ActionContext的源代码,请看org.apache.struts2.dispatcher.Dispatcher的serviceAction方法和两个createContextMap方法。
附录2 Struts2标签中value属性直接对ActionContext访问的问题
经试验并查看相关源代码后发现,在使用<s:property value="..."/>时,该标签的执行类会先根据value中表达式到值栈中执行表达式来查找值。如果在值栈中找到值,就返回该值;如果没有找到,则把该表达式作为ActionContext的key,到ActionContext中去找值。比如<s:property value="request"/>也会得到ActionContext中的request,等价于<s:property value="#request"/>。但是,由于标签的执行类会认为该值时String类型的,并且会直接进行类型转换。于是,如果直接使用<s:property value="request"/>的话其实会让页面抛出异常:Request类型不能转换成String类型。所以,只能用如果不带#的话只能成功读取ActionContext中String类型的值。这种机制使得某些时候栈顶的属性可以覆盖ActionContext中的key,或许你正需要它。然而,鉴于这种机制的不确定性,笔者建议访问ActionContext中的数据一定要带上“#”,可以免去一些麻烦。
关于这种转型异常,笔者认为是Struts2的bug,源代码如下,当“value = getValue(expr, asType);”时,是考虑了asType的,但从context中读取时“value = findInContext(expr);”,就没有考虑asType,并且没有在其他地方看到类型检查操作:
- // 本代码截取Struts2.3.1.2版本com.opensymphony.xwork2.ognl.OgnlValueStack类的第340行-352行
- private Object tryFindValue(String expr, Class asType) throws OgnlException {
- Object value = null;
- try {
- expr = lookupForOverrides(expr);
- value = getValue(expr, asType);
- if (value == null) {
- value = findInContext(expr);
- }
- } finally {
- context.remove(THROW_EXCEPTION_ON_FAILURE);
- }
- return value;
- }
- // 本代码截取Struts2.3.1.2版本com.opensymphony.xwork2.ognl.OgnlValueStack类的第340行-352行
- private Object tryFindValue(String expr, Class asType) throws OgnlException {
- Object value = null;
- try {
- expr = lookupForOverrides(expr);
- value = getValue(expr, asType);
- if (value == null) {
- value = findInContext(expr);
- }
- } finally {
- context.remove(THROW_EXCEPTION_ON_FAILURE);
- }
- return value;
- }
ActionContext表格总结的更多相关文章
- Struts2中 ValueStack、ActionContext、ServletContext、request、session等 表格解析
变量 从ActionContext中获得 生命周期 用Ongl来读取值 使用ServletConfigInterceptor来注入 ActionContext类 静态方法ActionContext. ...
- valuestack,stackContext,ActionContext.之间的关系以及如何存取数值的
2013-03-15 10:54 1722人阅读 评论(1) 收藏 举报 分类: J2EE 版权声明:本文为博主原创文章,未经博主允许不得转载. 三者之间的关系如下图所示: ActionCont ...
- 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Strut ...
- dojo DataGrid实现表格数据编辑的解决方案
在官网上看见的DataGrid编辑非常简单,但我实现的时候总是出现问题.经过N久的摸索,终于搞定了,期间出现了多处困难,下面说些解决办法的流程. 我实现的表格在页面加载时是不显示数据,只有通过表单像服 ...
- ValueStack、ActionContext
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 1. ValueStac ...
- Struts2利用iText导出word文档(包含表格)以提供下载
J2EE ExcelStrutsXML 在公司实习期间,带我的老师让我实现一功能——在显示课表的页面上上点击“导出文件“时能以word文档形式下载课表.将课表导出到excel里的功能他们已经实现了, ...
- extjs 表格为可编辑,保存后为不可编辑状态
画出表格 编辑后 思路:在初始时设置一个状态,panduan='0',此时,就是一个不可编辑的input,当点击编辑时,改变panduan = '1',即可编辑.保存是加入正则表达式的判断,在将pan ...
- java解析导入excel表格转为实体类javabean,根据实体类中的中文名称
最近公司需求解析excel,一开始使用poi做的挺好的,后来直接上了几十万条数据的excel文件,内存直接溢出了,网上查到apache poi还提供了专门处理海量数据的方法,使用sax解析,果然用了内 ...
- ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...
随机推荐
- AD管理命令
repadmin /showrepl 显示复制协议 dcdiag /test:dns
- Centos 6.4 8250/16550 只生成了4个串口
/********************************************************************* * Centos 6.4 8250/16550 只生成了4 ...
- C++学习笔记35:函数模板
函数模板 函数模板的目的 设计通用的函数,以适应广泛的数据型式 函数模板的定义格式 template<模板型式参数列表>返回值型式 函数名称(参数列表): 原型:template<c ...
- Flume NG之Interceptor简介
转载地址:http://www.cnblogs.com/lxf20061900/p/3658172.html 有的时候希望通过Flume将读取的文件再细分存储,比如讲source的数据按照业务类型分开 ...
- Nginx 的线程池与性能剖析
http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt158 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方 ...
- Binary Tree Traversal
1.Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' values. For ex ...
- 集合之List—ArrayList
1.ArrayList概念 1.arrayList常用API: add() remove() iterator() set() toArrays() asList()承上 clear() retain ...
- code::blocks的快捷键汇总
编辑部分: Ctrl + A:全选 Ctrl + C:复制 Ctrl + X: 剪切 Ctrl + V:粘贴 Ctrl + Z:撤销 Ctrl + S:保存 Ctrl + Y / Ctrl + S ...
- ASP.NET Web API与Rest web api:发布到IIS(二)(同发布.NET webservice)
本文档大部分来源于:http://www.cnblogs.com/zqzjs/p/4705994.html 工具VS2010,window环境win7 一:Webservice的创建与方法查看调用 1 ...
- nginx和apache下的url rewrite
将服务器上面的数据同步到本地之后,发现打开首页显示不正常,本地服务器是apache,经过打开url rewrite之后本地首页正常显示. 原因是phpwind本身支持了url rewrite的功能,但 ...