【问题标题】:Struts2 Populate ListsStruts2 填充列表
【发布时间】:2012-03-26 13:04:24
【问题描述】:

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

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

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

public class Bar { 私有列表 foos; }

public class StrutsAction extends 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 个 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>

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

【问题讨论】:

    标签: java list collections struts2 ognl


    【解决方案1】:

    我认为你可以使用 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

    【讨论】:

    • 仅在 OP 创建表单时显示。
    • 嗨。这是为了获得财产。我需要从可变长度表中设置值
    • 创建表格时Foo的列表已经填好了吗?是空的吗?
    • 它是空的。 Javascrip 将创建行
    【解决方案2】:

    你说你的行数是可变的。让我们将其命名为 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>
    

    你可以找到关于迭代器标签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 将正确地进行转换...您只需要注意,缺少索引的对象将是空的...因此您应该在操作中将它们过滤掉。

    【讨论】:

    • 是的,行数是可变的。我遇到的问题是我需要使用 JQuery 即时构建 html,因此在通过渲染阶段时不能使用 struts 标签。此外,我正在使用 ModelDriven 所以不确定这是否会使它进一步复杂化
    • 在阅读迭代器标签文档时,这似乎是在谈论迭代现有值。我没有现有的价值观。我有一个具有许多属性的可变行号表
    • 您可以在没有现有值的情况下使用迭代器标签...您可以模拟一个简单的循环来...我会更正答案...。
    • 非常感谢您的回答。这可行,但是我遇到的困难是我需要从添加和删除索引的表中添加和删除元素。例如,我可能会添加 5 个表行,然后删除第 3 行,然后添加另一个,这将导致重新调整索引时出现问题。一旦html生成,这个解决方案仍然使用索引,这会给我带来问题。
    猜你喜欢
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多