Перенаправление между страницами - Spring MVC
Я начинаю с Spring Portlet MVC
но я считаю, что этот вопрос также относится к Spring MVC
, Позвольте мне показать вам этот пример
@Controller
@RequestMapping(value="VIEW")//this maps to Portlet Mode VIEW
public class LoginController {
@RenderMapping("action=showRegisterPage")
//this annotation is almost the same like @RequestMapping
public String showRegisterPage() {
return "registration";
}
@ModelAttribute("loginForm")
public LoginForm getLoginForm() {
return new LoginForm();
}
}
а затем контроллер для страницы регистрации
@Controller
@RequestMapping(value="VIEW")
public class RegistrationController {
@ModelAttribute("user")
public User getUser() {
return new User();
}
}
И проблема в том, что когда я вызываю метод showRegisterPage (действие) со страницы, я перенаправляюсь на registration.jsp, но это исключение происходит
Caused by: java.lang.IllegalStateException: Neither BindingResult nor
plain target object for bean name 'user' available as request attribute
Это можно исправить, поставив ModelAttribute
пользователь в LoginController, но дублирование кода не совсем правильно, так как я могу решить это правильно? Я также пытался переместить метод showRegisterPage в RegistrationController, но тогда ссылка не работает. Может быть, кто-нибудь может объяснить, как именно работает привязка страницы к какому-либо контроллеру?
PS Как index.jsp, так и registration.jsp содержит <form:form>
тег и я также опускаем шаблонный код от обоих контроллеров.
2 ответа
Исключение выдается, потому что при переходе на страницу регистрации модель не имеет атрибута пользователя. Я думаю, что ваша страница регистрации содержит что-то вроде этого
<form:form commandName="user" >
Вот почему при вставке этого кода в первый контроллер ошибка исчезла
@ModelAttribute("user")
public User getUser() {
return new User();
}
этот код предоставляет объект пользователя для модели. Если вы не хотите копировать один метод два раза, вы можете
@RenderMapping("action=showRegisterPage")
//this annotation is almost the same like @RequestMapping
public String showRegisterPage(Model model) {
model.addAttribute("user", new User());
return "registration";
}
В этом случае модель будет содержать объект пользователя.
В идеале метод showregistrationpage должен быть частью контроллера регистрации, а не контроллера входа в систему.