Struts2标记:获取一个请求属性,其名称本身就是另一个请求属性的值
我在请求属性“BillSummaryTables”中有一个表名列表。我正在遍历该列表,并希望使用每个表名来获取该特定表名的请求属性。对应于每个表名,我在request属性中有另一个列表,我希望遍历它 这就是我正在做的Struts2标记:获取一个请求属性,其名称本身就是另一个请求属性的值,struts2,iterator,ognl,Struts2,Iterator,Ognl,我在请求属性“BillSummaryTables”中有一个表名列表。我正在遍历该列表,并希望使用每个表名来获取该特定表名的请求属性。对应于每个表名,我在request属性中有另一个列表,我希望遍历它 这就是我正在做的 <s:iterator value='#request.BillSummaryTables' var="tableName" status="itStatus"> <div class="contentbox" role="content"> <
<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>
但在任何情况下都不会返回任何内容。
但是,如果我硬编码这些值,这段代码就可以正常工作。
i、 e.如果我使用:#请求['other_charges'].getData()
注意:我可以检索tableName列表(#request.BillSummaryTables
)。#1)您使用的是三个嵌套迭代器,但第一个和第二个迭代器都有一个名为itStatus
的迭代器状态实例;他们必须有不同的名字才能工作
#2)如果与表名对应的列表实际上是一个列表,那么您应该迭代该列表,而不是getData()
内容(这是什么?)
#3)为什么使用请求?为什么不简单地在操作上使用HashMap(使用getter),使用table name
s作为键动态添加元素呢
#4)如果将此#请求[]。getData()
放入另一个Struts2标记(如迭代器)中,则显然不起作用(无法嵌套Struts2标记)
但是,请尝试类似的方法(我剥离了第二个迭代器,使其在之前运行,然后添加内容),然后查看它是否有效(以及打印的内容):
==开始调试====
当前表名:[]
对应的请求对象:[]
获取该对象上的数据:[]
====结束调试=====
编辑
好的,但是为什么要使用request.setAttribute
?操作是根据请求创建的。。。只需使用带有getter(public List getMyObjects()
)的私有列表myObjects
),并使用
从JSP调用它(在您的例子中,
)
请注意,OGNL
中的.getData()
应该变成.data
(我以前没有注意到),删除get,降低方法的第一个字母,并删除圆括号
重试并让我们知道。您可以向我们显示作为GET请求传入的请求参数吗?另外,查看操作上相关属性的定义也会很好。感谢Andrea的回复,但我想我应该以更好的方式提出我的问题。BillSummaryTables为我提供了一个我想要显示的表列表。现在假设第一个表名为“other_charges”。我已经使用request.setAttribute(“other_charges”,other_chargesTable)在操作中保存了一个名为table的对象。该对象包含一些其他属性以及一个列表,我将使用getData()获取该列表,然后遍历该列表。
#request[<s:property value="#tableName" />].getData()
#request['<s:property value="#tableName" />'].getData()
#request.%{#tableName}
<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>