你好亲爱的堆栈溢出。 我最近在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上的属性,我没有遇到任何问题。
我错过了什么?
答案 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更改为嵌套。
再见