0

から始めて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>タグが含まれており、両方のコントローラーから定型コードも省略しました。

4

2 に答える 2

1

登録ページに移動すると、モデルにユーザー属性がないため、例外がスローされます。あなたの登録ページにはこのようなものが含まれていると思います

<form:form commandName="user" >

そのため、このコードを最初のコントローラーに貼り付けるとエラーが発生しなくなります

@ModelAttribute("user")
public User getUser() {
    return new User();
}

このコードは、モデルにユーザー オブジェクトを提供します。1つのメソッドを2回コピーしたくない場合は、次のことができます

@RenderMapping("action=showRegisterPage")
//this annotation is almost the same like @RequestMapping
public String showRegisterPage(Model model) {
    model.addAttribute("user", new User());
    return "registration";
}

この場合、モデルにはユーザー オブジェクトが含まれます。

于 2013-02-22T13:34:30.037 に答える
0

理想的には、showregistrationpageメソッドは、ログインコントローラーではなく登録コントローラーの一部である必要があります。

于 2013-02-22T14:59:36.403 に答える