Сохранить значение в атрибуте модели для весеннего MVC
Когда я использую контроллер Spring MVC, и я отправляю форму, устанавливая значение в modelAttribute
Я теряю некоторые поля модели, которые не отображаются в форме. В этом примере, поскольку я не отображал возраст и адрес, поля этих пользователей теряются, и поэтому они имеют null
значение. Я не хочу позволять пользователю менять свой возраст и адрес, поэтому эти поля не в форме.
Метод контроллера для публикации формы редактирования пользователя:
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editionUser(Model model, @ModelAttribute("accountForm") User user,
BindingResult bresult,
RedirectAttributes redirectAttributes) {
//user.getAge() and user.getAddress are null
//Save the information...
}
Метод контроллера для редактирования пользовательской страницы:
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String initEdit(Model model) {
// the user fields are all filled
User user = userService.getUserById(...);
model.addAttribute("accountForm", user);
return "edition";
}
class User {
Long id;
String email;
String age;
String address;
String nickname;
// ...
}
edition.jsp
<form:form class="form" method="POST" action="edition" modelAttribute="accountForm">
<form:label path="email">email</form:label>
<form:input path="email" name='email'/>
<form:label path="nickname">nickname</form:label>
<form:input path="nickname" name='nickname'/>
<form:hidden path="id" />
<input name="submit" type="submit" value="valid" />
</form:form>
Каковы наилучшие решения, чтобы не потерять ценность этих полей? (возраст и адрес)
Использовать скрытый путь для каждого поля? Сохранить пользователя в сеансе перед перенаправлением на страницу редактирования и настроить получение сеанса пользователя в пост-методе контроллера, чтобы изменять только измененные поля? Есть ли общий метод?
3 ответа
Я бы пошел с сессии по одной простой причине:
Скрытые поля формы можно легко манипулировать на стороне клиента перед отправкой формы, поэтому они не удовлетворяют вашим требованиям.
Обратите внимание, что, не сохраняя ранее введенные значения где-либо, вы даже не сможете обнаружить, были ли они подделаны на стороне клиента, поэтому скрытые поля, безусловно, не вариант.
Используйте сессию.
Это старый пост, но, возможно, ответ поможет Spring новичкам, как я
К сожалению, если вы не используете @SessionAttributes({"attributeName"})
вы потеряете другие атрибуты вашего объекта.
Этот пост объясняет это Spring MVC - передача переменных с одной страницы на другую
Смотрите мой ответ здесь:
Можно ли обновить только подмножество атрибутов на объекте, используя Spring MVC с JPA?
Это должно сделать работу за вас. К сожалению, нет более элегантного метода.
Кстати, кажется, что Spring WebFlow удается обновить модель, используя только поля из сообщения. Вероятно, он сохраняет Модель в сеансе и обновляет только значения, содержащиеся в POST.