关于OGNL的问题

OGNL(Object Graph Navigation Language )在Struts2.0中得到了普遍的应用,我们经常用它来访问Action中的properties,下面是一些常见的例子:

<s:property value="#session.mySessionPropKey"/>  
  
<s:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" />  
  
<s:if test="'foo' in {'foo','bar'}">  
   muhahaha   
</s:if>  
<s:else>  
   boo   
</s:else>  

 

其中我们用的比较复杂的应该就是一些属性之间的包含和父子关系了,还有就是我们用到的比较多的#取值符号和%{}值运算符号。

 

实际工作过程中,遇到如下一个比较抽象的问题,把这里的经验分享给大家。先看下面的一段代码:

<s:iterator status="stat" value="destObjects">    
<tr>    
   <s:iterator value="visibleColumns">    
     <td>    
       <s:property value="destObjects[%{#stat.index}].%{fieldDefName}" />    
     </td>    
   </s:iterator>    
</tr>    
</s:iterator> 

 

这里的destObjects是一个List变量,里面包含有多个DestObject对象;visibleColumns也是许多个VisibleColumn对象的List集合,VisibleColumn拥有一个重要的属性fieldDefName,表达式"VisibleColumn.fieldDefName"的值又是DestObject的一个属性名称。

 

这里的关系比较混乱,不过仔细看看,应该就能明白其中的关系。这种模型也是我们在日常数据库结构设计中常常用到的,即一个定义表用来描述所有字段性质,而这些字段事实上又组成了一张或多张实用表。

 

通过以上Struts页面代码,我却得不到任何结果。为了寻找最终的解决途径,我查询了多方面的资料,也试过了许多种方式,比如:

<s:property value="destObjects[%{#stat.index}].%{fieldDefName}" />    
<!-- OR -->  
<s:property value="%{destObjects[#stat.index].%{fieldDefName}}" />    
<!-- OR -->  
<s:property value="%{fieldDefName}" />    
<!-- OR -->  
<s:iterator value="destObjects" id="do">    
  <s:iterator value="visibleColumns" id="vc">    
    <s:property value="#do.%{vc.fieldDefName}"/>    
  </s:iterator>    
</s:iterator>  
 

可惜,一切都是徒劳。OGNL是一个比较抽象混杂的语言,有时候多一个%或者#可能意义就不一样了。

 

最后给出一个正解,在我看来只是一个"["符号的作用,却改变了输出的结果:

<s:iterator id="do" value="destObjects">    
<tr>    
    <s:iterator value="visibleColumns">    
      <td>    
        <s:property value="%{#do[fieldDefName]}"/>    
      </td>    
    </s:iterator>    
  </tr>    
</s:iterator>  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值