首页 > 代码库 > ActionContext表格总结

ActionContext表格总结

  用一张表格来总结:

 

 

变量从ActionContext中获得生命周期用Ongl来读取值使用ServletConfigInterceptor来注入
ActionContext类静态方法ActionContext. getContext()一次Http请求使用“#”加上key,如“#name”无法注入
ValueStack类ActionContext. getValueStack()一次Http请求直接填写来访问栈中对象的方法,或者使用top来直接获得栈中对象无法注入
HttpServletRequest类ActionContext. get( StrutsStatics. HTTP_REQUEST)一次Http请求无方便的方法实现ServletRequestAware接口
request的MapActionContext. get("request")一次Http请求使用“#request”再加上key,如“#request.name”或者“#request[‘name‘]”实现RequestAware接口
parameters的MapActionContext. get( "parameters")一次Http请求使用“# parameters”再加上key,如“#parameters .name”或者“#parameters [‘name‘]”实现ParameterAware接口
HttpServletSession类无(需通过HttpServletRequest来获得)一次Http Session会话无方便的方法无法注入
session的MapActionContext. get("session")每次请求创建,但在一次Http Session会话中数据都是一样的使用“#session”再加上key,如“# session.name”或者“#session [‘name‘]”实现SessionAware接口
ServletContext类ActionContext. get( StrutsStatics. SERVLET_CONTEXT)网站项目启动后一直存在且唯一无方便的方法使用ServletContextAware接口
application的MapActionContext.get( "application")每次请求时创建,但其中的数据是网站项目启动后一直存在且共享使用“# application”再加上key,如“#application .name”或者“#application [‘name‘]”使用ApplicationAware接口

 

附录1 ActionContext中到底有哪些数据

 

keykey的声明处value的类型value.toString()

com. opensymphony. xwork2. dispatcher.

HttpServletRequest

StrutsStatics. HTTP_REQUESTorg. apache. struts2. dispatcher. StrutsRequestWrapperorg. apache. struts2. dispatcher. StrutsRequestWrapper @10984e0
applicationorg. apache. struts2. dispatcher. ApplicationMap
com. opensymphony. xwork2. ActionContext. localeActionContext. LOCALEjava. util. Localezh_CN
com. opensymphony. xwork2. dispatcher. HttpServletResponseStrutsStatics. HTTP_RESPONSEorg. apache. catalina. connector. ResponseFacadeorg. apache. catalina. connector. ResponseFacade @14ecfe8

xwork. NullHandler.

createNullObjects

 Booleanfalse
com. opensymphony. xwork2. ActionContext. nameActionContext. ACTION_NAMEStringindex

com.opensymphony. xwork2.ActionContext.

conversionErrors

ActionContext.

CONVERSION_ERRORS

java. util. HashMap{}
com. opensymphony. xwork2. ActionContext. applicationActionContext. APPLICATIONorg. apache. struts2. dispatcher. ApplicationMap
attrorg. apache. struts2. util. AttributeMaporg. apache. struts2. util. AttributeMap @133a2a8
com. opensymphony. xwork2. ActionContext. containerActionContext. CONTAINERcom. opensymphony. xwork2. inject. ContainerImplcom. opensymphony. xwork2. inject. ContainerImpl @fc02c8
com. opensymphony. xwork2. dispatcher. ServletContextStrutsStatics. SERVLET_CONTEXTorg. apache. catalina. core. ApplicationContextFacadeorg. apache. catalina. core. ApplicationContextFacade @11ad78c
com. opensymphony. xwork2. ActionContext. sessionActionContext. SESSIONorg.apache.struts2. dispatcher.SessionMap{}

com.opensymphony. xwork2.ActionContext.

actionInvocation

ActionContext. ACTION_INVOCATIONcom. opensymphony. xwork2. DefaultActionInvocationcom. opensymphony. xwork2. DefaultActionInvocation @13d4497
xwork. MethodAccessor. denyMethodExecution笔者很懒,没有找Booleanfalse
report. conversion. errors笔者很懒,没有找Booleanfalse
sessionorg. apache. struts2. dispatcher. SessionMap{}
com. opensymphony. xwork2. util. ValueStack. ValueStackValueStack.VALUE_STACKcom. opensymphony. xwork2. ognl. OgnlValueStackcom. opensymphony. xwork2. ognl. OgnlValueStack @16237fd
requestorg. apache. struts2. dispatcher. RequestMap
action笔者很懒,没有找com. example. MyAction
struts. actionMapping笔者很懒,没有找org. apache. struts2. dispatcher. mapper. ActionMappingorg. apache. struts2. dispatcher. mapper. ActionMapping @892cc5
parametersjava. util. HashMap{}
com. opensymphony. xwork2. ActionContext. parametersActionContext.PARAMETERSjava. util. TreeMap{}

 

注意:该表格为了排版在某些地方加了空格。

 

可以看出,有些相同的对象被以不同的key多次设置到ActionContext中。如果想看看创建ActionContext的源代码,请看org.apache.struts2.dispatcher.Dispatcher的serviceAction方法和两个createContextMap方法。

附录2 Struts2标签中value属性直接对ActionContext访问的问题

    经试验并查看相关源代码后发现,在使用<s:property value="http://www.mamicode.com/..."/>时,该标签的执行类会先根据value中表达式到值栈中执行表达式来查找值。如果在值栈中找到值,就返回该值;如果没有找到,则把该表达式作为ActionContext的key,到ActionContext中去找值。比如<s:property value="http://www.mamicode.com/request"/>也会得到ActionContext中的request,等价于<s:property value="http://www.mamicode.com/#request"/>。但是,由于标签的执行类会认为该值时String类型的,并且会直接进行类型转换。于是,如果直接使用<s:property value="http://www.mamicode.com/request"/>的话其实会让页面抛出异常:Request类型不能转换成String类型。所以,只能用如果不带#的话只能成功读取ActionContext中String类型的值。这种机制使得某些时候栈顶的属性可以覆盖ActionContext中的key,或许你正需要它。然而,鉴于这种机制的不确定性,笔者建议访问ActionContext中的数据一定要带上“#”,可以免去一些麻烦。

    关于这种转型异常,笔者认为是Struts2的bug,源代码如下,当“value = http://www.mamicode.com/getValue(expr, asType);”时,是考虑了asType的,但从context中读取时“value = findInContext(expr);”,就没有考虑asType,并且没有在其他地方看到类型检查操作:

 

 

Java代码 复制代码 收藏代码
  1. // 本代码截取Struts2.3.1.2版本com.opensymphony.xwork2.ognl.OgnlValueStack类的第340行-352行 
  2.     private Object tryFindValue(String expr, Class asType) throws OgnlException {  
  3.         Object value = http://www.mamicode.com/null;  
  4.         try {  
  5.             expr = lookupForOverrides(expr);  
  6.             value = http://www.mamicode.com/getValue(expr, asType);
  7.             if (value =http://www.mamicode.com/= null) {  
  8.                 value = http://www.mamicode.com/findInContext(expr);
  9.             }  
  10.         } finally {  
  11.             context.remove(THROW_EXCEPTION_ON_FAILURE);  
  12.         }  
  13.         return value;  
  14.     } 
[java] view plaincopyprint?
  1. // 本代码截取Struts2.3.1.2版本com.opensymphony.xwork2.ognl.OgnlValueStack类的第340行-352行 
  2.     private Object tryFindValue(String expr, Class asType) throws OgnlException { 
  3.         Object value = http://www.mamicode.com/null; 
  4.         try { 
  5.             expr = lookupForOverrides(expr); 
  6.             value = http://www.mamicode.com/getValue(expr, asType);
  7.             if (value =http://www.mamicode.com/= null) { 
  8.                 value = http://www.mamicode.com/findInContext(expr);
  9.             } 
  10.         } finally { 
  11.             context.remove(THROW_EXCEPTION_ON_FAILURE); 
  12.         } 
  13.         return value; 
  14.     } 

ActionContext表格总结