1

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

这是我的示例(省略了获取器/设置器):

公共类 Foo { 私有字符串 attr1; 私有字符串 attr2; }

公共类酒吧 { 私人列表 foos; }

公共类 StrutsAction 扩展 ActionSupport { 私人酒吧栏;}

我在 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 个 foo 而不是 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>

我想知道是否可以在不对索引进行硬编码的情况下完成它?

4

2 回答 2

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

[]s

于 2012-03-26T13:35:25.943 回答
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 标记的文档...查看页面底部。


如果你没有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 将正确地进行转换...您只需要注意,缺少索引的对象将为空...因此您应该在操作中将它们过滤掉。

于 2012-03-26T13:48:57.400 回答