Перенаправление между страницами - 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 должен быть частью контроллера регистрации, а не контроллера входа в систему.

Другие вопросы по тегам