这个问题与此非常相似: Collection/List property won't bind or update on form submit
我要做的是将JSP中的一组Checkbox映射到Webflow中的Map。绑定例如字符串到模型工作完全正常。但是,地图没有。这是一些示例代码: 模特:
public class MyForm {
private String selectedOrderBy;
private Map<String, boolean> selected = new HashMap<>();
private List<MyClass> items = new ArrayList<>();
//Now setters and getters for the members
}
public MyClass {
private String hash = "<some hash>"; //plus getter and setter
}
流程:
<flow xmlns="http://www.springframework.org/schema/webflow"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
<var name="model" class="MyForm"/>
<var name="selectedOrderBy" class="java.lang.String"/>
<view-state id="selection" model="model">
<binder>
<binding property="selectedOrderBy"/>
<binding property="selected"/>
</binder>
<transition on="submit" to="saveSelection"/>
</view-state>
<action-state id="saveSelection">
<evaluate expression="MyService.saveSelection(model, externalContext.nativeRequest)"/>
<transition to="selection"/>
</action-state>
</flow>
JSP:
<form:form modelAttribute="model" method="post" enctype="application/x-www-form-urlencoded" acceptCharset="utf-8">
...here is some more code including a selectbox mapping to selectOrderBy...
<table>
<c:foreach items="${model.items}" var="item">
<tr><td>
<form:checkbox path="selected['${item.hash}']" value="true"/>
...
</td></tr>
</c:foreach>
</table>
</form:form>
最后服务:
@Named
public class MyService {
public void saveSelection(MyForm model, HttpServletRequest request){...}
}
复选框成功显示地图中的值。但是,在提交时,更改的值不会绑定到模型(而String“selectOrderBy”可以工作)。所以我调试到MyService#saveSelection,我发现模型中的地图仍然具有旧值。同时,新值实际上在请求中。
目前,我从请求中手动提取它们:
String selected = request.getParameter("selected['" + hash + "']");
但这是一些非常丑陋的解决方法。有没有人知道为什么会这样?
问候, 萨沙。
答案 0 :(得分:1)
我无法解决最初的问题。但是,通过使用List而不是Map来绑定值,我能够以更清晰的方式实现类似的结果。 JSP现在说:
<form:checkbox path="selectedList" value="${myClass.hash}"/>
表格:
public class MyForm {
private String selectedOrderBy;
private List<String> selectedList = new ArrayList<>(); //selected Items hashes
private List<MyClass> items = new ArrayList<>(); //All items, regardless of selectionstate
//Now setters and getters for the members
}
在服务中,模型现在包含所选项目的列表。通过将它与可用项目列表(哈希)进行比较,您基本上可以得到相同的结果。
问候。
答案 1 :(得分:0)
删除绑定限制可使您的示例正常工作。我发现了一些改进请求,允许在版本3.0.0(https://jira.spring.io/browse/SWF-913)中添加似乎添加的绑定属性的通配符。
因此,为了使您的示例正常工作,我只需删除绑定限制。
<view-state id="selection" model="model">
<transition on="submit" to="saveSelection"/>
</view-state>
另外,请注意,通过设置value =“true”,您将默认选择所有类。