【问题标题】:Struts2 tags: get a request attribute whose name is itself a value of another request attributeStruts2标签:获取一个请求属性,其名称本身就是另一个请求属性的值
【发布时间】:2013-02-10 10:14:29
【问题描述】:

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

【问题讨论】:

  • 您能告诉我们作为 GET 请求传入的请求参数吗?
  • 另外,最好看看action上相关属性的定义。

标签: struts2 iterator ognl


【解决方案1】:

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

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

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

#4) 如果将这个#request[&lt;s:property value="#tableName" /&gt;].getData() 放在另一个 Struts2 标记中,比如迭代器(不能嵌套 Struts2 标记),这个 #request[&lt;s:property value="#tableName" /&gt;].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 呢?操作是按请求创建的...只需使用 private List&lt;MyObjects&gt; myObjects 及其 getter (public List&lt;MyObject&gt; getMyObjects()),并使用 &lt;s:iterator value="myObjects"&gt; 从 JSP 调用它(在您的情况下为 &lt;s:iterator value="myObjects.data"&gt;

请注意OGNL中的.getData()应该变成.data(我之前没有注意到),去掉get,降低方法的第一个字母,去掉圆括号...

重试并告诉我们。

【讨论】:

  • 感谢Andrea的回复,但我想我应该以更好的方式提出我的问题。 BillSummaryTables 为我提供了我想要显示的表格列表。现在假设第一个表名是“other_charges”。我已经使用 request.setAttribute("other_charges",other_chargesTable) 在我的操作中保存了一个名为 Table 的对象。该对象包含一些其他属性以及一个列表,我将使用 getData() 获取该列表,然后遍历该列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多