Ognl有一个上下文<Context>概念,说白了上下文就是一个Map结构,它实现了java.Util.Map接口,在Struts2中上下文的实现为ActionContext,下面为上下文<Context>的结构示意图
OgnlContext
当Struts接受一个请求时,会迅速创建ActionContext,ValueStack,action,然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。
接下来那如何访问上下文的对象:
访问上下文对象,如#application, #session
注意:OGNL会设定一个根对象,即ValueStack,如果要访问根对象的属性,可以省略#命名空间,直接访问该对象属性即可。
在root变量中处于第一位的叫栈顶对象,通常我们在OGNL表达式里直接写上属性的名称即可访问变量里对象的属性,搜索顺序是从栈顶对象开始寻找。
在struts2中,OGNL表达式需要配合Struts标签才可以使用,如<s:property value=”name”/>
也可以通过EL表达式访问${EL},-----à原理:现在request域中查找,查找不到再到值栈中查。
如果要访问其他Context中的对象,由于他们不是根对象,需要添加#前缀。
*application对象:#application.username或者#application[‘username’],相当于ServletContext.getAttribute(“username”).
*parameters对象:用于访问HTTP请求参数,例如#paramters.username.相当于request.getParamter(“username”)
*attr对象:用于按pageàrequestàsessionàapplication顺序访问属性。
采用OGNL表达式创建List/Map集合对象
如果需要一个集合元素的时候,可以使用OGNL中集合想换的表达式。使用如下代码直接生成一个List对象:
<s:set name=”list” value=”{‘zhag’,’wang’,’xiao’}”/>
<s:iterator value=”#list”>
<s:property/>
</s:iterator>
Set标签用于将某个值方入指定范围。通过scope指定。默认放在OGNLContext中。
生成一个Map对象:
<s:set name=”foobar” value=”#{‘foot1’:’bar1’,‘foot2’:’bar2’, ‘foot3’:’bar3’,}”
<s:iterator value=”#foobar”>
<s:property value=”key”/>==<s:property value=”value”/>
</s:iterator>