【问题标题】:Struts 1: form can read bean value but on submit does not write in itStruts 1:表单可以读取 bean 值但提交时不写入
【发布时间】:2014-02-05 13:25:20
【问题描述】:

大家好,堆栈溢出的各位。 我最近在我的 Struts 应用程序中遇到了一个问题。 我有一个正确显示一些bean值的jsp(我只粘贴了代码的相关部分,我简化到了极致):

<table>
    <logic:iterate name="bean" property="list1" id="listItem">
    <tr>
        <td>
            <html:checkbox name="listItem" property="selected">
            </html:checkbox>
        </td>
    </logic:iterate>
</table>

我的 bean 有一个 list1 属性及其 getter 和 setter

private List<RandomObject> list1;

public List getList1() {
    return list1;
    }


public void setList1(List list1) {
    this.list1=list1;
    }

我的子 bean 有一个选定的属性:

private boolean selected;
public boolean isSelected() {
    return selected;
}

public void setSelected(boolean selected) {
    this.selected = selected;
}

现在,当输入这个 jsp 时,我得到的值是正确的,即:如果我在 DB 中的映射对象为 selected=true,则选中该复选框。我不明白的是如何保存我在此表单中所做的更改。当我提交时,所有更改都将丢失。这是纯 struts 相关的,因为在调试中,当我输入链接到提交的 StrutsAction 时,我得到的 ActionForm 已经丢失了所有有趣的值。另外我觉得这与我想要保留的值不是直接存储在主 bean 上,而是子 bean 的属性有关,因为在同一页面上还有很多其他的直接在主 bean 上的属性,我可以轻松保存。

我错过了什么?

【问题讨论】:

    标签: java jsp struts actionform


    【解决方案1】:

    它可能在呈现的 HTML 中声明了不正确的 name 属性。如果您查看为您的页面生成的源代码,它可能看起来像这样:

    <input type="checkbox" name="selected" ...>
    

    它将在您的表单 bean 类中查找 selected 字段。

    如果您使用的集合是表单 bean 中的一个字段,您希望使用 &lt;nested:form&gt;&lt;nested:iterate&gt;&lt;nested:checkbox Struts 标记,而不是 &lt;html:form&gt;,and` 标记。所以它看起来像这样:

    <nested:form action="foo">
    ...
    
        <nested:iterate property="list1" id="listItem">
        <tr>
            <td>
                <nested:checkbox property="selected">
                </nested:checkbox>
            </td>
        </tr>
        </nested:iterate>
    
    ...
    </nested:form>
    

    请注意,我已经从 Struts 标记中删除了 name 属性,因为它们不是必需的(根据我的经验,它们实际上会导致各种问题 - 如果您使用 &lt;nested:*&gt; 标记,请不要使用 @ 987654332@ 属性)。在&lt;nested:iterate&gt; 的情况下,嵌套级别是表单bean 本身,因此它知道它需要在表单bean 中查找list1 属性。

    该标记创建自己的嵌套级别,因此&lt;nested:checkbox 知道它需要在迭代中查找当前元素的selected 属性。

    呈现的 HTML 将如下所示(对于第一个元素):

    <input type="checkbox" name="list1[0].selected" ...>
    

    这意味着您的表单 bean 的 list1 字段所引用的集合中第一个元素(索引 0)的 selected 字段。

    当然,您需要确保您使用的是会话范围的表单 bean,而不是请求范围的。

    【讨论】:

      【解决方案2】:

      在我的情况下,我必须将 name 属性放入迭代中,否则它会给我错误(无法在任何 bean 中找到属性...)

      我解决了将属性名称删除到复选框中:似乎它在页面范围内创建了一个与表单无关的新对象。

      这是我的代码:

      <nested:iterate id="apertura" type="it.puglia.innova.view.actionform.AperturaForm" indexId="index"  name="strutturaRuraleForm"  property="listAperturaForm">
           <nested:checkbox styleId="checkbox_${index}" property="flagContinuato" onchange="changeOrarioContinuato(${index})"/>
      

      就是这样 :-) 也不需要将 html:form 更改为嵌套。

      再见

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        相关资源
        最近更新 更多