我正在尝试创建一个包含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
变量没有反映先前控制器中的变量。
我确信这是一个更好的方法,这是一个新手的尝试。请指教。
答案 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";
}