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

时间:2013-02-10 10:14:29

标签: struts2 iterator ognl

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

1 个答案:

答案 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(之前我没有注意到),删除获取,降低方法的第一个字母,并删除圆括号...

重试并告诉我们。