Как установить выбранное значение в форме 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 в форме. Я, очевидно, что-то пропустил.

Ответ 1

Похоже, что проблема не была связана с моей настройкой. Проблема заключалась в том, что itemValue был установлен в свойство id компании, в то время как сравнение выполнялось с именем компании в моей форме bean. Таким образом, они не были равны, и поэтому ни один элемент не был выбран для выбора.

Приведенный выше код работает очень хорошо, и установка значения в userForm для определенного свойства будет устанавливать это значение как выбранное в поле формы формы, если значение одного из элементов в коллекции элементов равно форме стоимость. Я изменил свое поле формы, чтобы выглядеть так, что вытаскивает имя_компании вместо идентификатора.

<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>

Ответ 2

Самое простое решение - переопределить метод toString() в классе модели. В этом случае просто измените класс UserForm, переопределив toString(), как показано ниже:

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

Spring затем автоматически выберет правильное значение в форме: option

Ответ 3

Я боролся некоторое время по той же проблеме. Это поле выбора, которое у меня было

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

Поскольку у меня был PropertyEditor для моего объекта, я не мог написать что-то вроде

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

который работал нормально, но не был проанализирован PropertyEditor.

Итак, думая о Spring, нужно определить равенство между сущностями, я вышел, реализуя equals и hashcode в моем объекте Origin, используя только свойство idOrigin, и это сработало!

Ответ 4

Вы также можете попробовать это

<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>

Ответ 5

это не так сложно. Вам понадобится 2 beans: поддержка формы 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 framework автоматически выбирает значение поля "gender".