由于ValueStack(值栈)是Struts2中Ognl的根对象,如果用户需要访问值栈中的对象,在JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性。
$(foo) //获得值栈中某对象的foo属性
若访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。
如,session对象,用来访问HttpSession。例如,
#session.userName
或者
#session['userName']
,相当于调用ServletContext
的
getAttribute("userName");
为何EL表达式能够访问valueStack中对象的属性
是因为Struts2对HttpServletRequest作了进一步的封装。
public class StrutsRequestWrapper extends HttpServletRequestWrapper{
public StrutsRequestWrapper(HttpServletRequest req){
super(req);
}
public Object getAttribute(String s){
......
ActionContext ctx = ActionContext.getContext();
// 先尝试从request范围获取属性值
Object attribute = super.getAttribute(s);
if (ctx != null){
if (attribute == null)// 如果从request范围没有找到属性值,则从ValueStack中查找对象的属性值
.......
ValueStack stack = ctx.getValueStack();
attribute = stack.findValue(s);
......
}
return attribute;
}
}