struts2的ActionContext

ActionContext是被存放在当前线程中的,获取ActionContext也是从ThreadLocal中获取的。因此在执行拦截器、 action和result的过程当中,因为他们都是在一个线程中按照顺序执行的,因此能够能够在任意时候在ThreadLocal中获取 ActionContext。
ActionContext包括了不少信息,好比Session、Application、Request、Locale、ValueStack等,其中 ValueStack能够解析ognl表达式,来动态后去一些值,同时能够给表达式提供对象。值栈是创建在ognl的基础之上的。

HttpServletRequest等对象是如何与struts2的ActionContext互通的
是struts2从新实现了HttpServletRequest接口,就是类StrutsRequestWrapper,看下struts2的说明:
All Struts requests are wrapped with this class, which provides simple JSTL accessibility. This is because JSTL works with request attributes, so this class delegates to the value stack except for a few cases where required to prevent infinite loops. Namely, we don't let any attribute name with "#" in it delegate out to the value stack, as it could potentially cause an infinite loop. For example, an infinite loop would take place if you called: request.getAttribute("#attr.foo").
说明struts从新包装了request接口,因此若是用request.getAttribute()的话,是执行了StrutsRequestWrapper类,在这个类里面有访问ActionContext的代码:
public class StrutsRequestWrapper extends HttpServletRequestWrapper {

    /**
     * The constructor
     * @param req The request
     */
    public StrutsRequestWrapper(HttpServletRequest req) {
        super(req);
    }

    /**
     * Gets the object, looking in the value stack if not found
     *
     * @param s The attribute key
     */
    public Object getAttribute(String s) {
        if (s != null && s.startsWith("javax.servlet")) {
            // don't bother with the standard javax.servlet attributes, we can short-circuit this
            // see WW-953 and the forums post linked in that issue for more info
            return super.getAttribute(s);
        }

        ActionContext ctx = ActionContext.getContext();
        Object attribute = super.getAttribute(s);
        ...java

     }app

}


在这里实现了getAttribute方法,然而没有实现所有,因此只有用getAttribute方法才能获取ActionContext中的信息

可是它继承了sun的HttpServletRequestWrapper类,因此其余的方法仍是用的默认实现,也就是不能访问到ActionContext中的信息

jstl标签会触发request等的getAttribute方法,因此jstl也能获取到ActionContext的数据,好比Struts2的Action中的属性等等。
 ide

相关文章
相关标签/搜索