Struts 1:表单可以读取bean值但是在提交时不会写入

时间:2014-02-05 13:25:20

标签: java jsp struts actionform

你好亲爱的堆栈溢出。 我最近在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上的属性,我没有遇到任何问题。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

可能在呈现的HTML中声明了不正确的name属性。如果您查看页面生成的源代码,它可能如下所示:

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

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

如果您正在使用表单bean中的字段集合,那么您希望使用<nested:form><nested:iterate><nested:checkbox Struts标记,而不是<html:form>, 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属性,因为它们不需要(根据我的经验,它们实际上会导致各种问题 - 如果您使用<nested:*>标记“使用name属性)。在<nested:iterate>的情况下,嵌套级别是表单bean本身,因此它知道它需要在表单bean中查找list1属性。

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

渲染的HTML看起来像这样(对于第一个元素):

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

表示表单bean的selected字段引用的集合中第一个元素(索引0)的list1字段。

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

答案 1 :(得分:0)

在我的情况下我必须将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更改为嵌套。

再见