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)ネストされた 3 つの反復子を使用していますが、最初と 2 番目の両方に と呼ばれる IteratorStatus のインスタンスがありますitStatus。機能するには、異なる名前を付ける必要があります。

#2)テーブル名に対応するLists が事実上リストである場合、ものではなくリストを反復する必要がありますgetData()(それは何ですか?)

#3) request を使用する理由 Action で HashMap を (getter を使用して) 単純に使用して、table names をキーとして動的に要素を追加しないのはなぜですか?

#4) Iterator のような別の Struts2 タグ内に配置されている場合、これ#request[<s:property value="#tableName" />].getData()は明らかに機能しません (Struts2 タグをネストすることはできません)。

ただし、次のようなことを試して (2 番目のイテレータを削除し、前に実行してから追加します)、動作するかどうか (および出力される内容) を確認します。

<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ですか? アクションはリクエストごとに作成されます... private List<MyObjects> myObjectsgetter( public List<MyObject> getMyObjects()) でa を使用し、 <s:iterator value="myObjects">(あなたの場合は<s:iterator value="myObjects.data">.

.getData()inは(以前は気付かなかった) get を削除し、メソッドの最初の文字を下げ、丸括弧を削除するOGNL必要があることに注意してください....data

再試行してお知らせください。

于 2013-02-11T09:54:04.003 に答える