1

我在请求属性“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) 的列表。

4

1 回答 1

2

#1)你正在使用三个嵌套的迭代器,但是第一个和第二个都有一个名为 IteratorStatus 的实例itStatus;他们必须有不同的名字才能工作。

#2)如果List对应于表名的 s 实际上是一个列表,那么你应该迭代列表,而不是getData()东西(那是什么?)

#3) 为什么使用 request ?为什么不简单地在 Action 上使用 HashMap(使用 getter),使用table names 作为 key 动态添加元素?

#4)#request[<s:property value="#tableName" />].getData()如果放在另一个 Struts2 标记中,这显然不起作用,例如迭代器(不能嵌套 Struts2 标记)。

但是,尝试这样的事情(我剥离了第二个迭代器,让它在之前运行,然后添加东西),看看它是否有效(以及它打印的内容):

<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?操作是按请求创建的...只需将 aprivate List<MyObjects> myObjects与它的 getter ( public List<MyObject> getMyObjects()) 一起使用,然后从 JSP 中调用它<s:iterator value="myObjects">(在您的情况下,<s:iterator value="myObjects.data">.

请注意.getData()inOGNL应该成为.data(我之前没有注意到),删除 get,降低方法的第一个字母,并删除圆括号......

重试并告诉我们。

于 2013-02-11T09:54:04.003 回答