Struts2填充列表

时间:2012-03-26 13:04:25

标签: java list collections struts2 ognl

我在填写Struts2中的用户定义对象属性列表时遇到问题。

这是我的例子(省略了getters / setters):

  

public class Foo {private String attr1; private String attr2;   }

     

public class Bar {private list foos; }

     

公共类StrutsAction扩展了ActionSupport {private bar bar; }

我在JSP中有如下代码(摘录):

<tr><td><input type="text" name="bar.foos.attr1"/></td><td><input type="text" name="bar.foos.attr2"</td></tr>
<tr><td><input type="text" name="bar.foos.attr1"/></td><td><input type="text" name="bar.foos.attr2"</td></tr>

我需要每个表行在List中使用每个属性创建1个foo项,但是我的代码在传递时为每个属性创建一个新的foo对象,最终得到4个foos而不是2个!

我知道我可以通过将索引硬编码到html中来解决问题,如下所示:

<tr><td><input type="text" name="bar.foos[0].attr1"/></td><td><input type="text" name="bar.foos[0].attr2"</td></tr>
<tr><td><input type="text" name="bar.foos[1].attr1"/></td><td><input type="text" name="bar.foos[1].attr2"</td></tr>

我想知道如果不对索引进行硬编码就可以完成吗?

2 个答案:

答案 0 :(得分:0)

我认为您可以使用Struts 2迭代器标记:

<s:iterator var="foo" value="bar.foos">
   <tr><td><s:property value="attr1"/> .....
</s:iterator>

如果它不起作用,我们可以在其他解决方案中思考。

您可以在此处找到更多信息:http://struts.apache.org/2.3.1/docs/iterator.html

[]中

答案 1 :(得分:0)

你说你的行数可变。我们将其命名为numOfRows ...尝试重写您的示例:

<table>
<s:iterator status="stat" value="(numOfRows).{ #this }" >
    <tr>
        <td><input type="text" name="bar.foos[%{#stat.index}].attr1"/></td>
        <td><input type="text" name="bar.foos[%{#stat.index}].attr2"/></td>
    </tr>
</s:iterator>
</table>

您可以找到有关Iterator代码there的文档...请查看页面底部。


如果您在渲染阶段没有numOfRows,那么我担心生成文本字段的唯一方法是在客户端使用javascript ....

[编辑]

关于索引......如果你有这样的索引,你不必费心:

<table>
    <tr>
        <td><input type="text" name="bar.foos[0].attr1"/></td>
        <td><input type="text" name="bar.foos[0].attr2"/></td>
    </tr>
    <tr>
        <td><input type="text" name="bar.foos[3].attr1"/></td>
        <td><input type="text" name="bar.foos[3].attr2"/></td>
    </tr>
    <tr>
        <td><input type="text" name="bar.foos[5].attr1"/></td>
        <td><input type="text" name="bar.foos[5].attr2"/></td>
    </tr>
</table>

Struts会做正确的转换...你只需要知道,索引缺失的对象将为null ...所以你应该在动作中过滤它们。