我在请求属性“BillSummaryTables”中有一个表名列表。我正在遍历列表,我想使用每个表名来获取该特定表名的请求属性。对应于每个表名,我在请求属性中有另一个列表,我想迭代它。
这就是我在做的事情。
<s:iterator value='#request.BillSummaryTables' var="tableName" status="itStatus">
<div class="contentbox" role="content">
<table class="rpt">
<s:iterator value="#request.get('%{#tableName}').getData()" var="ocRow" status="itStatus">
<tr style="border:1px solid #CCCCCC">
<s:iterator value='#ocRow' var="cell" status="itStatus2">
<td>
<s:property value="#cell.getValue()"/>
</td>
</s:iterator>
</tr>
</s:iterator>
<tr>
<s:iterator value="#request.get('%{#tableName}').getData()" var="ocTotal">
<td>
<s:property value="#ocTotal"/>
</td>
</s:iterator>
</tr>
</table>
</div>
</s:iterator>
我也试过
#request[<s:property value="#tableName" />].getData()
和
#request['<s:property value="#tableName" />'].getData()
和
#request.%{#tableName}
但无论如何都不会返回任何内容。
但是,如果我对值进行硬编码,则此代码可以正常工作。
即如果我使用:#request['other_charges'].getData()
注意:我可以检索tableName(#request.BillSummaryTables
)列表。
答案 0 :(得分:2)
#1)您正在使用三个嵌套迭代器,但第一个和第二个都有一个名为itStatus
的IteratorStatus实例;他们必须有不同的名字才能发挥作用。
#2)如果表名对应的List
实际上是一个List,那么你应该迭代列表,而不是getData()
的东西(什么)那是吗?)
#3)为什么要使用请求?为什么不简单地在Action上使用HashMap(使用getter),使用table name
作为键动态添加元素?
#4)如果放入另一个Struts2标记(如Iterator(无法嵌套Struts2标记)),此#request[<s:property value="#tableName" />].getData()
显然不起作用。
然而,尝试这样的事情(我剥离了第二个迭代器,让它在之前运行,然后添加东西),看看它是否有效(以及它打印的是什么):
<s:iterator value='#request.BillSummaryTables' var="tableName" status="statusAllTables">
<div class="contentbox" role="content">
<br/>==== START DEBUG ====
<br/>Current table name: [<s:property value="#tableName"/>]
<br/>Corresponding request object: [<s:property value="#request['%{#tableName}']"/>]
<br/>getData on that object: [<s:property value="#request['%{#tableName}'].getData()"/>]
<br/>===== END DEBUG =====
<table class="rpt">
<s:iterator value="#request['%{#tableName}'].getData()" var="ocRow" status="statusThisTable">
<tr style="border:1px solid #CCCCCC">
<s:iterator value='#ocRow' var="cell" status="statusThisField">
<td>
<s:property value="#cell.getValue()"/>
</td>
</s:iterator>
</tr>
</s:iterator>
</table>
</div>
</s:iterator>
修改强>
好的,但是你为什么要使用request.setAttribute
?每个请求都会创建操作...只需使用带有getter(private List<MyObjects> myObjects
)的public List<MyObject> getMyObjects()
,然后使用<s:iterator value="myObjects">
(在您的情况下为<s:iterator value="myObjects.data">
)从JSP调用它。
请注意.getData()
中的OGNL
应该变为.data
(之前我没有注意到),删除获取,降低方法的第一个字母,并删除圆括号...
重试并告诉我们。