request
Struts2中调用<%request.getAttribute(“”);%>是调用的不是HttpServletRequest对象,而是
调用org.apache.struts2.dispatcher.StrutsRequestWrapper的getAttribute()方法;
源代码如下:
publicObject 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 standardjavax.servlet attributes, we can short-circuit this
// see WW-953 and the forums post linked inthat 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 orelse a request for
// #attr.foo or #request.foo could cause anendless 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;
}