Struts2值栈
[2]context对象中的内容
context对象中的内容可以分为如下几个部分[由于context对象是Map类型下面使用key/vlaue形式展示]:
(1)原生的Web资源对象
Key |
Value |
com.opensymphony.xwork2.dispatcher.HttpServletRequest |
Struts2包装过的Request对象 |
com.opensymphony.xwork2.dispatcher.HttpServletResponse |
原生的response对象 |
com.opensymphony.xwork2.dispatcher.ServletContext |
原生的ServletContext对象 |
补充说明:看到这里大家可能会想,之前获取Web资源时ActionContext给我们提供的是封装相关数据的Map对象呀?怎么还有原生的Web对象呢?原生的Web对象不是从ServletActionContext中获取的吗?其实大家看看ServletActionContext的源码就能够发现,它获取原生Web资源对象本质上也是从ActionContext中获取的。
public static HttpServletRequest getRequest() { return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST); } |
包括Struts2为实现了XxxAware、ServletXxxAware接口的Action对象注入Web资源对象本质上也都是从ActionContext中获取的。
当然ActionContext获取Web资源对象时也都是从context对象这个Map中获取的。
(2)Web资源对应的Map对象
Key |
Value |
com.opensymphony.xwork2.ActionContext.application |
封装Application域数据的Map对象 |
application |
封装Application域数据的Map对象 |
|
|
request |
封装请求域数据的Map对象 |
|
|
com.opensymphony.xwork2.ActionContext.parameters |
封装请求参数数据的Map对象 |
parameters |
封装请求参数数据的Map对象 |
|
|
com.opensymphony.xwork2.ActionContext.session |
封装Session域数据的Map对象 |
session |
封装Session域数据的Map对象 |
|
|
attr |
可以按范围从小到大顺序在所有域对象中查询数据的特殊Map对象 |
补充说明:
[1]除了request的Map对象,其他几个域对象都有两个键指向,一个键较长,一个键较短,嗯,放心吧,他们指向的是同一个对象。
[2]关于attr这个Map,它能够按照范围由小到大的顺序在各个域对象中查询数据,看源码就知道——它的实现类是org.apache.struts2.util.AttributeMap
public Object get(Object key) { PageContext pc = getPageContext();
if (pc == null) { Map request = (Map) context.get("request"); Map session = (Map) context.get("session"); Map application = (Map) context.get("application");
if ((request != null) && (request.get(key) != null)) { return request.get(key); } else if ((session != null) && (session.get(key) != null)) { return session.get(key); } else if ((application != null) && (application.get(key) != null)) { return application.get(key); } } else { try{ return pc.findAttribute(key.toString()); }catch (NullPointerException npe){ return null; } }
return null; } |
(3)ValueStack对象
Key |
Value |
com.opensymphony.xwork2.util.ValueStack.ValueStack |
值栈对象 |
补充说明:看到这个你会不会困惑呢?是的,你没有看错,Struts2确实是把ValueStack值栈对象放入了context这个Map当中,上面显示的key指向的是ValueStack对象的引用。ActionContext对象就是通过这种方式获取ValueStack对象的。其实Struts2还将ValueStack对象的引用又复制了一份放到了请求域中——是不是有点狡兔三窟的感觉?通过很多方式都能够得到ValueStack对象的引用,之所以这样无非是为了在不同情况下方便的获取值栈。稍后我们会盘点获取值栈对象的所有方法。
(4)与Action类运行相关的环境信息
K
ey |
Value |
com.opensymphony.xwork2.ActionContext.name |
当前action的name属性值 |
action |
当前Action类的实例对象 |
com.opensymphony.xwork2.ActionContext.conversionErrors |
{}空Map |
com.opensymphony.xwork2.ActionContext.locale |
en_US或zh_CN等 |
last.property.accessed |
null |
last.bean.accessed |
null |
xwork.NullHandler.createNullObjects |
false |
current.property.path |
null |
com.opensymphony.xwork2.ActionContext.container |
com.opensymphony.xwork2.inject.ContainerImpl对象 |
com.opensymphony.xwork2.ActionContext.actionInvocation |
com.opensymphony.xwork2.DefaultActionInvocation对象 |
xwork.MethodAccessor.denyMethodExecution |
false |
report.conversion.errors |
false |
struts.actionMapping |
ActionMapping Map对象 |
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。