如何在控制器之间传递ModelAttribute?

时间:2012-09-17 16:25:51

标签: java spring modelattribute

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

  1. 登录
  2. 注册
  3. 我正在将每个请求映射到不同的控制器,并尝试将结果返回到我的home.jsp。但是我在控制器之间只传递某些特定的ModelAttribute时遇到了麻烦。更具体地说,我无法对一个控制器中的ModelMapBindingResult进行更改以反映在其他控制器中。

    我确信基本上错误的我正在做的事情。请帮忙。

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

    我确信这是一个更好的方法,这是一个新手的尝试。请指教。

1 个答案:

答案 0 :(得分: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";
}