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)了解更多。