2013-02-10 43 views
1

我有一个请求属性“BillSummaryTables”中的表名称列表。我遍历整个列表,我想使用每个表名来获取特定表名的请求属性。对应于每个表名,我在请求属性中有另一个列表,我想遍历它。Struts2标签:获取请求属性,其名称本身是另一个请求属性的值

这就是我正在做的。

<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)的列表。

+0

,你能否告诉我们,作为传递的请求参数GET请求? – Quaternion 2013-02-10 16:35:42

+0

此外,最好还是看看相关属性的定义。 – Quaternion 2013-02-10 22:05:24

回答

2

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

#2)如果对应于表名称,有效,一个列表,那么你应该遍历列表中的List S,不是getData()东西(那是什么?)

#3)为什么使用请求?为什么不简单地在Action上使用HashMap(使用getter),使用table name s作为关键字动态添加元素?

#4)如果换一种Struts2的标签里面,就像一个Iterator这#request[<s:property value="#tableName" />].getData()会显然是不行的(不能嵌套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?操作是每个请求创建...只是使用其吸气剂(public List<MyObject> getMyObjects())一private List<MyObjects> myObjects,并从JSP与<s:iterator value="myObjects">调用它(在你的情况,<s:iterator value="myObjects.data">

请注意,在.getData()OGNL成为.data(我没“T之前注意到了这一点),除去GET,降低了该方法的第一个字母,并移除圆括号...

重试,让我们知道。

+0

感谢Andrea的回复,但我想我应该以更好的方式提出我的问题。 BillSummaryTables给了我一个我想要展示的表格列表。现在假设第一个表名是“other_charges”。我已经使用request.setAttribute(“other_charges”,other_chargesTable)在我的操作中保存了一个名为Table的对象。 该对象包含一些其他属性以及我将使用getData()获取的列表,然后遍历该列表。 – nevin 2013-02-11 13:52:09

+0

+1为一般信息。 – 2013-02-11 17:25:28