1

2つの機能を備えたホームページを作成しようとしています。

  1. ログイン
  2. サインアップ

各リクエストを別のコントローラーにマッピングし、結果をに戻そうとしていhome.jspます。ModelAttributeしかし、コントローラー間で特定の特定のものだけを渡すのに問題があります。具体的には、あるコントローラーで行った変更をModelMapBindingResultのコントローラーに反映させることができません。

私がやっていることには基本的に何か問題があると確信しています。助けてください。

私のには2つの形式がありますhome.jsp。ログイン用に1つ:

<form:form name="loginForm" modelAttribute="loginUser" action="login" method="post">

    Email: <form:input name="loginEmail" id="loginEmail" value="" path="email"/>
    <form:errors path="email" cssClass="error" />
    <br/>

    password: <form:password name="loginPassword" Id="loginPassword" value="" path="password" />
    <form:errors path="password" />
    <br/>

    <input type="submit" id="id_login" value="Login">

</form:form>

もう1つはサインアップ用です。

<form:form name="SignUpForm" modelAttribute="signUpUser" action="signup" method="post">

    Full Name: <form:input name="name" id="name" value=""   path="name"/>
    <form:errors path="name" cssClass="error" />
    <br/>

    Email: <form:input name="signupEmail" id="signupEmail" value="" path="email"/>
    <form:errors path="email" cssClass="error" />
    <br/>

    password: <form:password name="signUpPassword" Id="signUpPassword" value="" path="password" />
    <form:errors path="password" />

    <input type="submit" id="id_signUp" value="Sign Up">

</form:form>

私は3つのコントローラーを持っていますHomeController.java::

@RequestMapping("/home")
public String showHome(ModelMap model,
        @ModelAttribute("loginUser") User loginUser,
        BindingResult loginResult,
        @ModelAttribute("signUpUser") User signUpUser,
        BindingResult signUpResult) {
    return "home";
}

AuthenticationController.java

@RequestMapping("/login")
public String login(@ModelAttribute("loginUser") User user,
        BindingResult result, ModelMap model, HttpServletRequest request,
        HttpServletResponse response) {

    loginFormValidator.validate(user, result);

    if(Errors in `result`)
        return "forward:/home";

    // Authentication Logic
    request.getSession().setAttribute("s_user_obj", some_variable);
    return "forward:/home";

}

およびProfileController.java

@RequestMapping("/signup")
public String signUpUser(@ModelAttribute("signUpUser") User user,
        BindingResult result, ModelMap model) {
// Do stuff related to Sign Up
// Forward to home.jsp
    }

リクエストがに転送されると、との両方で/home同じ値を取得しています。さらに悪いことに、エラーはありません。つまり、変数は以前のコントローラーの変数を反映していません。loginUsersignUpUserresult

これを行うためのより良い方法があると確信しています。これは初心者の試みです。ご意見をお聞かせください。

4

1 に答える 1

3

私がここで見ている問題は方法@ModelAttribute("loginUser")であり@ModelAttribute("signUpUser")、Springによるメソッドに対して解釈されます-ここにいくつかの参照があります-http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc。 html#mvc-ann-modelattrib-method-args

引数はモデルから取得されます(必要に応じてインスタンス化されます)が、問題の部分は、要求パラメーターに基づいて引数が再入力されることです。これにより、両方の属性が同じ方法で入力されることになります。私が考えることができる唯一の回避策は、メソッドでモデル属性を自分で明示的に取得することです。

@RequestMapping("/home")
public String showHome(ModelMap model) {
    model.get("loginUser");...
    model.get("signUpUser");...
    return "home";
}

アップデート

あなたのコメントに基づいて、別のフローとより明示的なフローをお勧めします。

loginUserモデル属性とsignUpUserモデル属性の両方を次のように設定するメソッドがあります。

private void populateAttributes(Model model, User loginUser, User signupUser){
    if (loginUser==null) loginUser = new User();
    if (singupUser==null) singupUser = new User();
    model.addAttribute("loginUser", loginUser);
    model.addAttribute("signupUser", signupUser);
}

ログインフローで:

@RequestMapping("/login")
public String login(User user,
    BindingResult result, Model model, HttpServletRequest request,
    HttpServletResponse response) {

loginFormValidator.validate(user, result);

if(Errors in `result`)
    populateAttributes(user, null);
    return "home";

// Authentication Logic
request.getSession().setAttribute("s_user_obj", some_variable);
populateAttributes(model, user, null);
return "home";

}

サインアップの同様のフロー:

@RequestMapping("/signup")
public String signUpUser(User user,
    BindingResult result, Model model) {
    populateAttributes(model, null, user);
    return "home"
}

およびshowHome:

@RequestMapping("/home")
public String showHome(Model model,) {
    populateAttributes(model, null, null);
    return "home";
}
于 2012-09-17T18:13:12.237 に答える