1

我正在尝试创建一个具有 2 个功能的主页:

  1. 登录
  2. 报名

我将每个请求映射到不同的控制器并尝试将结果返回到我的home.jsp. 但是我ModelAttribute在控制器之间只能传递某些特定的东西时遇到了麻烦。更具体地说,我无法将我对一个控制器所做的更改ModelMap反映BindingResult在其他控制器中。

我确定我所做的事情基本上有问题。请帮忙。

我的home.jsp. 一个用于登录:

<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>

另一个用于注册:

<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,我在loginUser和中得到相同的值signUpUser。更糟糕的是,没有错误,即result变量没有反映以前控制器中的错误。

我确信有更好的方法可以做到这一点,这是新手的尝试。请指教。

4

1 回答 1

3

我在这里看到的问题是Spring 为方法解释的方式@ModelAttribute("loginUser")-@ModelAttribute("signUpUser")这是一些参考 - 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 回答