前段日子对ognl表达式不是很理解,看了几本书上关于ognl表达式的描述后还是感觉很难,前几天学习了struts2中值栈的内容,现在感觉ognl表达式其实很容易。
struts2中利用值栈来存储数据,在struts2中,把数据存在值栈中,然后在jsp页面用ognl表达式取出。
在struts2中的action有三种方法获取值栈
ValueStack valueStack=ActionContext.getContext().getValueStack(); ValueStack valueStack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack"); ValueStack valueStack=ServletActionContext.getValueStack(ServletActionContext.getRequest());
可以看到我们可以利用request来获取值栈,而request的生命周期为一次请求,所以值栈的生命周期也为一次请求。
ValueStack 是一个接口,它的实现类是ognlvalueStack。
在valueStack中有两个数据结构,一个名字为context,另一个为root。
context的类型是OgnlContext,OnglContext实现了Map接口,所以context本质上是一个Map。
valueStack中的另一个数据结构root,它的类型是CompoundRoot,CompoundRoot继承了ArrayList类,所以它本质上是一个ArrayList,我们称它为对象栈。
map栈中有一个名称为_values的对象,它是一个HashMap,在这里存放了request,response,session,application等servlet容器的内容,我们称它为map栈。
map栈中还有一个名称为_root的对象,它和我们上面说的valueStack中的另一个数据结构root相同,都是对象栈,为什么valueStack中会有两个对象栈呢,这是因为struts2继承了以前一些框架的内容导致的。
对象栈中保存了两个对象,一个是ValueStackAction,它代表的是当前请求的Action,
另一个是DefaultTextProvider,它是用于struts2国际化的。
我手动用一个粗糙的涂鸦图解下:
所以在jsp页面中,如果要输出的内容在对象栈中,直接指定属性名字,如果在map栈中,要用#来指定
例如
String name="aaa"; String Bname="bbb"; ActionContext.getContext().getValueStack().push(name); //把字符串放入对象栈中 ActionContext.getContext().put("Bname", Bname); //把字符串放入map栈中
在jsp页面中取出的对应的值:
<s:property value="name"/> <s:property value="#Bname"/>
有错误请指出