所以我设置了一个带有spring web流的向导界面,逐渐填充单个表单对象/模型。它适用于必须填充单个String或基本属性的前几个步骤以及一个String数组(来自复选框界面)。
然后我有一个List<String>
属性。它可以正确呈现为具有正确初始值的多个文本框。但是当我在浏览器上编辑文本框并提交时,这些值不会对表单bean生效。它仍然具有初始值。
以下是详细设置:
Web flow on-start创建bean:
<on-start>
<evaluate expression="new mypackage.MyFormBean()" result="flowScope.myFormBean" />
</on-start>
以下是我的表单bean的相关部分:
public class MyFormBean implements Serializable {
...
private List<SlotBean> slots;
...
public List<SlotBean> getSlots() {
return slots;
}
public void setSlots(List<SlotBean> slots) {
this.slots= slots;
}
...
}
public class SlotBean {
...
private int quantity;
...
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity= quantity;
}
...
}
我的网络流程中有一系列视图状态,其中包含简单的字符串或数字字段绑定设置,可以初始化,显示和保存,而不会出现问题。
此视图状态生成任意数量的SlotBean对象,然后使用2初始化数量。这些设置为slots属性。
<view-state id="generate-criteria" model="disciplineCatalogue">
...
<transition on="next" to="slots-grid">
<evaluate expression="myService.generateSlots(myFormBean)"/>
</transition>
...
</view-state>
这是jsp片段。它所做的就是渲染一堆文本框。还有一个下一个按钮:
<form:form id="slotsGrid" modelAttribute="myFormBean" action="${flowExecutionUrl}">
...
<c:forEach var="slot" items="${myFormBean.slots}" varStatus="idx">
<form:input path="slots[${idx.index}].quantity" />
</c:forEach>
...
<button type="submit" id="next" name="_eventId_next">Next</button>
...
</form:form>
上面的代码正确显示初始值(2)。它会生成多个文本框,如下所示:
<input id="slots0.quantity" name="slots[0].quantity" type="text" value="2"/>
因此,当此页面在浏览器上时,我将数量文本框的值更改为不同的值,然后单击“下一步”按钮。在我的浏览器的网络调试器上,我看到表单值被发送到服务器:
slots[0].quantity:3
slots[1].quantity:1
slots[2].quantity:2
以下是下一个按钮的相关网络流条目。
<view-state id="slots-grid" model="myFormBean">
<binder>
...
<binding property="slots" />
</binder>
...
<transition on="next" to="finished">
<evaluate expression="myService.create(myFormBean)"/>
</transition>
...
</view-state>
所以我在myService.create(myFormBean)
方法上设置了一个断点,它显示所有数量字段仍然设置为原始“2”。新值未绑定到myFormBean.slots
。
你的设置中有什么东西看起来不对吗?
感谢您随时可以加入
Spring Framework 3.1.1
Spring-Webflow 2.3.1
Tomcat 6.0.18
Eclipse Indigo