Struts2中EL表达式[亲测有效]

(35) 2023-06-15 21:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Struts2中EL表达式[亲测有效],希望能够帮助你!!!。

传统
jsp中,例如${person},那么搜索顺序page-request-session-application,依次调用getAttribute(String key)方法
Struts2中
由于是action转到result视图,所以page一般用不到,但是其request的搜索有变化,先看Request(StrutsRequestWrapper)本身的getAttribute()方法:

“`
public Object getAttribute(String key) {
if (key == null) {
throw new NullPointerException(“You must specify a key value”);
}

    if (disableRequestAttributeValueStackLookup || key.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(key);
    }

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

    **if (ctx != null && attribute == null)** {
        boolean alreadyIn = isTrue((Boolean) ctx.get(REQUEST_WRAPPER_GET_ATTRIBUTE));

        // note: we don't let # come through or else a request for
        // #attr.foo or #request.foo could cause an endless loop
        if (!alreadyIn && !key.contains("#")) {
            try {
                // If not found, then try the ValueStack
                ctx.put(REQUEST_WRAPPER_GET_ATTRIBUTE, Boolean.TRUE);
                ValueStack stack = ctx.getValueStack();
                if (stack != null) {
                    **attribute = stack.findValue(key);**
                }
            } finally {
                ctx.put(REQUEST_WRAPPER_GET_ATTRIBUTE, Boolean.FALSE);
            }
        }
    }
    return attribute;
}

``可以看到,在request中搜索不到时,会调用ValueStack的findValue(key)方法。
${person}的搜索顺序如下:request-ValueStack.findValue()-session-application`
(只有request发生变化,其他不变)

上一篇

已是最后文章

下一篇

已是最新文章

发表回复