struts2 中的ognl

Ognl有一个上下文(Context)概念,说白了上下文就是一个Map结构,它实现了java.util.Map接口,在struts2中context的实现为ActionContext,下面是它的结构示意图:


当struts2接受一个请求时,会迅速创建出ActionContext,ValueStack,action,然后把action存放进ValueStack,所以action的实例变量可以被ognl访问。

action属性注入,所以从页面传递过来的参数实际是保存在值栈中的。

struts2为action的属性提供了依赖注入功能,在struts2的配置文件中,可以很方便的为action中的属性值注入值。注意,属性必须有setter方法。



访问上下文中的对象需要使用#标注命名空间,如#application,#session等。

ognl有一个根对象(root对象),在struts2中根对象就是ValueStack,如果要访问根对象中对象的属性,则可以省略#命名空间,直接访问该对象的属性即可。

在struts2中,根对象ValueStack的实现为OgnlValueStack,该对象不是只存放单个值,而是存放一组对象。在OgnlValueStack中有一个List类型的root变量,就是使用它存放一组对象。

在root变量中处于第一位的对象叫做栈顶对象。通常在OGNL表达式里面直接写上属性的名称即可访问root变量里对象的属性,搜索顺序是从栈顶对象开始,依次往下搜索,直到找到为止。

需要注意的一点是,struts2中ognl表达式要配合struts标签才可以使用。如:<s:property value="name"/>

由于ValueStack是Struts2中的ognl的根对象,如果用户需要访问ValueStack中的对象,在jsp页面可以通过下面的EL表达式访问ValueStack中对象的属性。

${foo}//获得ValueStack中某个对象的foo属性

如果访问Context中的别的对象,由于它们不是根对象,所以在访问是需要添加#前缀。
(1)application对象:用于访问ServletContext,例如#application.userName或#application['userName'],相当于调用session的getAttribute("userName")
(2)session对象:用于访问HttpSession,例如#session.userName或#session['userName'],相当于调用ServletContext的getAttribute("userName")
(3)request对象:用于访问HttpServletRequest对象,例如#request.userName或#request['userName'],相当于调用request的getAttribute("userName")
(4)parameters对象:用于访问Http的请求参数,例如#parameters.userName或#parameters['userName'],相当于调用request的getParameter("userName")
(5)attr对象:用于按page->request->session->application的顺序访问其属性。

采用ognl表达式创建List/Map集合对象:如果需要一个集合元素的时候(例如list或map),可以使用ognl中通集合相关的表达式,使用如下代码可以直接生成一个list对象:
  1. <s:set var="list" value="{'第一个','第二个','第三个'}"></s:set><!-- 默认放在OGNL context中 -->  
  2. <!--s:iterator中有一个特点,会把当前迭代的对象放在栈顶中  -->  
  3. <s:iterator value="#list">  
  4.     <s:property/><br/>  
  5. </s:iterator>  

set标签用于将某个值放入某个范围。
scope指定变量被放置的范围,该属性可以接受application、session、request、page和action。如果没有该属性,则默认放在OGNL context中。
value赋给变量的值,如果没有该属性,则将ValueStack栈顶的值放入赋给变量。

生成一个map对象:
  1. <s:set var="maps" value="#{'key1':90,'key2':35,'key3':12}"></s:set>  
  2. <s:iterator value="#maps">  
  3.     <s:property value="key"/>=<s:property value="value"/><br/>  
  4. </s:iterator>  

采用ognl表达式判断对象是否在集合中:对于集合类型,ognl表达式可以使用in和not in两个符号,其中in表示指定的元素是否在集合中,而not in表示指定的元素是否不再集合中。如下所示:
  1. <s:if test="'foo' not in {'xxx','foo1','foo2'}">  
  2.     不在  
  3. </s:if>  
  4. <s:else>  
  5.     在  
  6. </s:else>  

OGNL表达式的投影功能:
除了in和not in外,ognl还允许使用某个规则获得集合对象的子集,常用的有以下三个操作符:
?:获得所有符合逻辑的元素
^:获得符合逻辑的第一个元素
$:获得符合逻辑的最后一个元素
例如:
  1. <s:iterator value="books.{?#this.price>60}">  
  2.     <s:property value="name"/>,价格:<s:property value="price"/><br/>  
  3. </s:iterator>  

在上面的代码中,直接在集合后跟.{}运算符表明用于取出该集合的子集,{}内的表达式用于获取符合条件的元素,this表示为了从大集合books中筛选数据到小集合,需要对大集合books进行迭代,this代表当前迭代的元素。本例中用与获取集合中价格大于60的书的集合。

原文出自:http://blog.csdn.net/hudie1234567/article/details/6730481


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值