如何在Spring MVC表单中设置所选值:从控制器中选择?

时间:2011-05-30 22:32:52

标签: spring forms spring-mvc

在我的控制器中:

@Controller
public class UserController {

    @RequestMapping(value="/admin/user/id/{id}/update", method=RequestMethod.GET)
    public ModelAndView updateUserHandler(@ModelAttribute("userForm") UserForm userForm, @PathVariable String id) {

        Map<String, Object> model = new HashMap<String, Object>();
        userForm.setCompanyName("The Selected Company");
        model.put("userForm", userForm);

        List<String> companyNames = new ArrayList<String>();
        companyNames.add("First Company Name");
        companyNames.add("The Selected Company");
        companyNames.add("Last Company Name");

        model.put("companyNames", companyNames);

        Map<String, Map<String, Object>> modelForView = new HashMap<String, Map<String, Object>>();
        modelForView.put("vars", model);

        return new ModelAndView("/admin/user/update", modelForView);
    }
}

我视图中的选择表单字段:

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm">
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="id" itemLabel="companyName" />
</form:form>

据我了解,表单支持bean将根据表单中的modelAttribute属性进行映射。我显然在这里遗漏了一些东西。

5 个答案:

答案 0 :(得分:11)

问题似乎与我的设置无关。问题是itemValue被设置为company id属性,而对我的表单支持bean上的公司名称属性进行了比较。所以这两者并不相等,因此没有设定项目。

上面的代码工作得很好,并且在userForm中为特定属性设置值将在select表单字段中设置该值,只要items集合中某个项的值等于表单的值即可值。我将表单字段更改为如下所示,它会拉取companyName而不是id。

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm">
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="companyName" itemLabel="companyName" />
</form:form>

答案 1 :(得分:8)

最简单的解决方案是覆盖模型类中的toString()方法。 在这种情况下,只需通过覆盖toString()来更改类UserForm,如下所示:

@Override
public String toString() {
    return this.getCompanyName();
}
然后,

Spring会自动在表单中选择正确的值:option

答案 2 :(得分:6)

我在同一个问题上苦苦挣扎。 这是我选择的字段

<form:select path="origin" items="${origins}" itemValue="idOrigin" itemLabel="name" />

因为我的实体有一个PropertyEditor,所以我写不出像

这样的东西
<form:select path="origin.idOrigin" items="${origins}" itemValue="idOrigin" itemLabel="name" />

运行正常,但未被PropertyEditor解析。

因此,考虑到Spring需要确定实体之间的相等性,我只使用idOrigin属性在Origin实体中实现了equals和hashcode,并且它有效!

答案 3 :(得分:6)

您也可以尝试这样

<form:select id="selectCategoryId" path="categoryId"
      class="selectList adminInput admin-align-input" multiple="">
      <option value="0">-- Select --</option>
      <c:forEach items="${categories}" var="category">
            <option <c:if test="${category.key eq workflowDTO.categoryId}">selected="selected"</c:if>    value="${category.key}">${category.value} </option>
        </c:forEach>
</form:select>

答案 4 :(得分:3)

它并不复杂。您需要2个bean:表单支持bean和域模型中的选择模型。

这是我的模型,一个字符串列表,用于:

/* in controller: my select model is a list of strings. However, it can be more complicated, then you had to use PropertyEditors for String <-> Bean conversions */

    List<String> mySelectValues = new ArrayList<String>();
    mySelectValues.add("M");
    mySelectValues.add("F");
    modelMap.addAttribute("mySelectValues", mySelectValues);

这是你的表格,基本上是:

<form:form command="user">
  <form:select path="gender">
     <form:options items="${mySelectValues}"></form:options>                                                                                                       
  </form:select>    
</form:form>

这里是我的支持对象:

public class User {
    private String gender;
    /* accessors */
}

Spring框架使用“gender”字段的值自动选择。