0

你好亲爱的堆栈溢出的人。我最近在我的 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 上的属性,我可以轻松保存。

我错过了什么 ?

4

2 回答 2

0

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

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

这将selected在您的表单 bean 类中查找一个字段。

如果您使用的集合是表单 bean 中的一个字段,您希望使用<nested:form>,<nested:iterate><nested:checkboxStruts 标记,而不是<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>

请注意,我已经name从 Struts 标签中删除了属性,因为它们不是必需的(根据我的经验,它们实际上会导致各种问题 - 如果您使用<nested:*>标签,请不要使用name属性)。在<nested:iterate>嵌套层级的情况下是form bean本身,所以它知道它需要在form bean中寻找list1属性。

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

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

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

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

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

于 2014-02-05T13:32:43.720 回答
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 更改为嵌套。

再见

于 2014-05-22T09:32:28.590 回答