ActionContext

1、ActionContext翻译成中文就是Action的上下文(为什么说是上下文,是应为他的生命周期长,和我们的项目的生命周期是相同的,我们很多公共的东西都放在里面,方便存取 )ActionContext是struts2的上下文对象。

2、ActionContext其本质就是一个容器,是一个Map结构的对象。

3、ActionContext 是 Action 的上下文,存放 Action 执行过程中数据信息。ActionContext 存放 Action 的数据,ActionInvocation, request 的数据, session的数据,application 的数据,locale 的数据,conversion errors 等。每次请求时会为当前线程创建一个 新的ActionContext 。 而 ActionContext 采 用 了 ThreadLocal 的 方 式 来 存 放 ActionContext 所以 ActionContext 是线程安全

4、 ActionContext贯穿于整个Action的执行生命周期。每次接受请求后都会新建一个ActionContext对象,将ServletAP中的数据存入到ActionContext中实现struts2和servlet的解耦。由于每次请求都重新创建ActionContext对象,导致执行效率比servlet更低。

5、解耦的好处: 测试Servlet每次都需要启动容器,就是启动服务器,应为Servlet依赖于容器。但是struts2有了ActionContext它就和servlet解耦了,两者之间就没有关系了,游览器请求的数据全部放在了ActionContext里面,struts2拿到了数据后,一旦进入到struts2的执行流程后,后面都不需要servlet,就可以运行,使得测试可以不依赖于容器(测试需要专门发起请求的工具)。

6、获取 ActionContext ActionContext.getContext()获取。由于 ActionContext 是线程安全的,并且是通过静态方法获取的,所以在本线程中的非 Action 类中也可以直接访问。

7、注意点:ActionContext 是基于请求创建的,所以在非请求的线程中是不能使用 ActionContext 对象的。如:filter 的 init()方法。

8、 源码分析

每次请求都会创建一个 ActionContext

 

 把5个区域的值存入ActionContext中

 还有一个值栈

 

9、、ActionContext 中包含 6 大对象 

 

request: 这里的request和servlet中的request不一样,它是一个Map结构,存放HttpServletRequest域中的数据。HttpServletRequest里面有两种数据,请求+手动放入的(通过setAttribute方法),但是这里的request仅仅只是存放的手动设置的数据。(request比较特殊)

session: 和servlet里面的session一样,存放的是HttpSessin域中的数据。

application: 和servlet里面的ServletContext一样,存放的是ServletContext域中的数据。

parameters:存放的是请求参数。

attr:存放的是  request session  application(也比较特殊)   attr(page-->request--->session--->application)

ValueStack(值栈):存放的是业务处理类的相关数据(属性)。

比如我的一个User对象它会被放入值栈

 attr存取的是page-->request--->session--->application  先找到的那个数据

查看AttributeMap可以看到

  public Object get(Object key) {
        PageContext pc = getPageContext();

        if (pc == null) {   //PageContext里面找不到
            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)) {//request里面找
                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;
    }

猜你喜欢

转载自blog.csdn.net/qq_40794973/article/details/85215412