2007-07-05
关于OGNL的问题
关键字: ognlOGNL(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>
- 14:21
- 浏览 (640)
- 评论 (2)
- 分类: Java Framework
- 相关推荐
评论
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;
}
...
}
class DestObject {
private List<VisibleColumn> visibleColumns;
private List<VisibleColumn> getVisibleColumns() {
return visibleColumns;
}
...
}
class VisibleColumn {
private String fieldDefName;
private String getFieldDefName() {
return this.fieldDefname;
}
...
}
f1hero
2007-12-06
这里的destObjects是一个List变量,里面包含有多个DestObject对象;visibleColumns也是许多个VisibleColumn对象的List集合,VisibleColumn拥有一个重要的属性fieldDefName,表达式"VisibleColumn.fieldDefName"的值又是DestObject的一个属性名称
destObjects和visibleColumns的有关系么?java类里怎么写的?给各具体的点的例子啊?大哥
destObjects和visibleColumns的有关系么?java类里怎么写的?给各具体的点的例子啊?大哥
发表评论
- 浏览: 14950 次
- 性别:

- 来自: 中国广东

- 详细资料
搜索本博客
我的相册
Selenium
共 9 张
共 9 张
最近加入圈子
最新评论
-
利用Javascript向页面中插 ...
柳暗花明,感谢
-- by redasurc -
Web2.0时代的新秀 - Nexaw ...
dennis_zane 写道这个与Mozilla的XUL或者微软的XAML有什么 ...
-- by tailsherry -
Web2.0时代的新秀 - Nexaw ...
这个与Mozilla的XUL或者微软的XAML有什么不同呢?
-- by dennis_zane -
Web2.0时代的新秀 - Nexaw ...
49271743 写道插件怎么加到 MYECLIPSE里呢? Nexaweb的出 ...
-- by tailsherry -
Web2.0时代的新秀 - Nexaw ...
我还是看好jsf,结合netbeans的vwp,生产力很高。
-- by jim19770812






评论排行榜