1

这个问题与这个问题非常相似: Collection/List property won't bind or update on form submit

我想要做的是将 JSP 中的一组复选框映射到 webflow 中的地图。将例如字符串绑定到模型完全可以正常工作。但是,地图没有。下面是一些示例代码: 模型:

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){...}
}

复选框成功显示在地图中找到的值。但是,在提交时,更改的值不会绑定到模型(而字符串“selectOrderBy”有效)。所以我调试到 MyService#saveSelection,我发现模型中的地图仍然有旧值。同时,新值实际上在请求中。

所以目前,我手动从请求中提取它们:

String selected = request.getParameter("selected['" + hash + "']");

但这是一些非常丑陋的解决方法。有人知道为什么会这样吗?

问候,萨沙。

4

2 回答 2

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
}

在服务中,模型现在包含选定项目的列表。通过将其与可用项目(哈希)列表进行比较,您基本上会得到相同的结果。

问候。

于 2013-10-23T06:20:26.317 回答
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" 您将默认选中所有类。

于 2014-10-29T20:27:14.497 回答