Struts2标记:获取一个请求属性,其名称本身就是另一个请求属性的值

Struts2标记:获取一个请求属性,其名称本身就是另一个请求属性的值,struts2,iterator,ognl,Struts2,Iterator,Ognl,我在请求属性“BillSummaryTables”中有一个表名列表。我正在遍历该列表,并希望使用每个表名来获取该特定表名的请求属性。对应于每个表名,我在request属性中有另一个列表,我希望遍历它 这就是我正在做的 <s:iterator value='#request.BillSummaryTables' var="tableName" status="itStatus"> <div class="contentbox" role="content"> <

我在请求属性“BillSummaryTables”中有一个表名列表。我正在遍历该列表,并希望使用每个表名来获取该特定表名的请求属性。对应于每个表名,我在request属性中有另一个列表,我希望遍历它

这就是我正在做的

<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>