`
tailsherry
  • 浏览: 136216 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

关于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>  
  
分享到:
评论
2 楼 tailsherry 2007-12-18  
这个destObjects中的DestObject的定义大致如下:
class DestObject {
  private List<VisibleColumn> visibleColumns;

  private List<VisibleColumn> getVisibleColumns() {
    return visibleColumns;
  }

  ...
}

class VisibleColumn {
  private String fieldDefName;
 
  private String getFieldDefName() {
    return this.fieldDefname;
  }
  ...
}

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


destObjects和visibleColumns的有关系么?java类里怎么写的?给各具体的点的例子啊?大哥

相关推荐

    ognl.jar资源包

    camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...

    ognl表达式 ognl表达式

    ### OGNL表达式的理解和应用 #### 一、OGNL简介与基本概念 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架中的默认表达式语言,同时也被广泛...

    开发工具 ognl-3.1.12

    开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12开发工具 ognl-3.1.12...

    struts2.0中的ognl

    四、OGNL的安全性问题 虽然OGNL为Struts2提供了极大的便利,但其强大的表达式解析能力也可能带来安全风险。例如,恶意用户可能通过构造特殊的OGNL表达式注入攻击,执行服务器上的任意代码。因此,在使用OGNL时,需要...

    ognl-3.2.21-API文档-中文版.zip

    赠送jar包:ognl-3.2.21.jar; 赠送原API文档:ognl-3.2.21-javadoc.jar; 赠送源代码:ognl-3.2.21-sources.jar; 赠送Maven依赖信息文件:ognl-3.2.21.pom; 包含翻译后的API文档:ognl-3.2.21-javadoc-API文档-...

    ognl源码和ognl帮助文档.rar

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,常用于Java应用,特别是Struts2框架中,用于数据绑定和动态方法调用。在这个压缩包中,包含的是OGNL的源码和帮助文档,这对于深入理解OGNL的工作...

    ognl英文帮助文档

    8. **错误处理和调试**:如何识别和解决使用OGNL时遇到的问题,以及如何进行有效的调试。 9. **版本更新和兼容性**:可能会提及不同版本的OGNL之间的差异,以及与Struts2不同版本的兼容性问题。 总之,这份“ognl...

    OGNL教程,简单,看完懂OGNL语言

    它的设计初衷是解决UI组件和控制器之间的数据绑定问题,使得视图和控制器之间的交互更为简便。随着时间的发展,OGNL逐渐演变为处理复杂数据关系的语言,广泛应用于多个知名Web框架,如WebWork(Struts2的前身)和...

    ognl.jar(ognl-2.6.11.jar)

    标题中的“ognl.jar(ognl-2.6.11.jar)”指的是OGNL(Object-Graph Navigation Language)...通过这种方式,开发者可以在遇到问题时直接查看OGNL的源代码,更深入地理解其工作原理,有助于提高开发效率和解决问题的能力。

    ognl图形导航语言

    然而,由于其灵活性和丰富的功能,OGNL也可能带来一些问题,尤其是在符号的使用上。 首先,OGNL支持对象方法调用,可以直接通过`objName.methodName()`的形式来执行对象的方法。这使得在代码中动态调用对象的方法变...

    OGNL中文版详细文档

    OGNL特有的对象索引属性(Object Indexed Properties) 调用方法 变量引用 带括号的表达式 子表达式(Subexpressions)链 构造集合(Collection) 列表(Lists) 数组 映射表(Maps) 对集合的投影(Project) 在集合...

    ognl源码及API

    当OGNL表达式执行出错时,它会抛出`OgnlException`,通常伴随着详细的错误信息,帮助开发者定位问题。此外,ognl还支持自定义类型转换和方法解析策略,以适应不同的应用场景。 在实际使用中,ognl的API提供了很多...

    ognl-2.6.11.jar 官方源码

    2. **安全性增强**:考虑到OGNL在Web应用中的安全问题,这个版本可能包含了一些防止OGNL注入攻击的改进,比如对表达式的严格检查和过滤。 3. **API调整**:可能会有新的API接口或者对原有接口的改进,以提供更好的...

    OGNL表达式的使用及文档

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它被广泛应用于Spring框架和其他许多Java应用中,用于数据绑定和表达式评估。本篇将详细介绍OGNL的使用方法及其...

    ognl源码

    通过源码分析,我们可以深入理解OGNL的工作原理,这对于优化应用性能和解决可能出现的问题至关重要。 OGNL源码的学习主要包括以下几个核心概念: 1. **表达式解析**:OGNL的解析器将用户输入的表达式如`obj....

    OGNL语言中文资料

    OGNL,全称为Object-Graph Navigation Language,是一种强大的表达式语言,主要被用于获取和设置Java对象的属性。它在Java开发中广泛应用于Spring框架、Struts2等,提供了简洁而灵活的方式来访问和操作对象的属性。...

    ognl-2.7.3-src

    通过研究 `ognl-2.7.3-src`,开发者可以深入理解 OGNL 的工作原理,这对于优化应用程序性能、调试 OGNL 相关问题以及扩展 OGNL 功能都大有裨益。同时,对于理解其他类似的表达式语言和框架也有一定的借鉴意义。

    struts2中的OGNL的源码

    通过深入学习OGNL的源码,开发者可以更好地定制和优化Struts2应用,提升性能,增强安全性,并能解决遇到的特定问题。这是一项值得投入时间和精力的任务,特别是对于那些希望在Web开发领域有深入理解的人来说。

    ognl的jar包

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,主要用在Java应用程序中,用于获取和设置对象的属性。它的设计目标是提供一种简洁、直观的方式来操纵对象图,包括对象的方法调用、属性访问以及...

    ognl-3.0.21.jar ognl.jar

    标题中的“ognl-3.0.21.jar”和“ognl.jar”是指OGNL(Object-Graph Navigation Language)的特定版本...了解并熟练使用OGNL能够提升Java应用的灵活性和可维护性,但同时也需要注意安全问题,防止潜在的代码注入攻击。

Global site tag (gtag.js) - Google Analytics