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