一、struts2值栈:
包含两部分:对象栈和map栈
对象栈中存放的是相关的对象,在Action类中可以通过ActionContext.getContext.getValueStack().push(Object)方法将相关的对象放在值栈栈顶,在jsp页面通过ognl表达式或EL表达式将值栈中的数据取出。
map栈中存放的是application.session.request.attr.parameters对象,在Action类中可以通过ActionContext.getContext().put(key,value)将对象存放在request域对象中,通过ActionContext.getContext().getSession().put(k,v)将对象存放在Session域中,以实现与ServletAPI的解耦。
二、Ognl表达式:
在jsp页面中使用ognl表达式获取数据时,底层实际上调用的是ValueStack的findValue(string expr)方法
findValue(String expr)查找的顺序:
1 首先在对象栈中查找指定属性,从栈顶到栈底依次查找,找到后就返回。
2.若对象栈中没有属性,则从map栈中查找对应的key值,找到就返回。
格式:
1.在jsp页面中的格式:%{ognl},只能写在struts2的自定义标签中
2.在struts2配置文件中的格式:${ognl}
语法:
user 相当于 findValue("user") 先在对象栈中查找,找不到则在map栈中查找
#user 相当于 map.get("user"); 在map栈中查找
#user.name 相当于 map.get("user").getName();
表单回显:
1.对象栈栈顶对象的数据会自动回显在Struts2自定义标签中与栈顶对象相关属性相同的标签中
2.EL表达式回显:会自动在page request ValueStack.findValue(String expr) session application域中查找相关对象。
注意:在Struts2的trutsRequestWrapper类中,重写了HttpServletRequestWapper的getAttribute(String key)方法,使得当在request域中找不到对象时,调用findValue(string)方法在值栈中查找。