我的Web应用程序基于Spring Web MVC 4.0.6,用于前端,业务和服务逻辑,Hibernate用于ORM(持久性),JSP用作视图技术。
我有一个JSP页面,它有多个表单。每个表单都有自己的动作,模型属性映射到相应的表单bean。当我通过提交相关表单触发其中一个操作(比如登录)时,我必须在请求处理程序方法中对每个参数进行@ModelAttribute
注释,否则会收到错误:Neither BindingResult nor plain target object for bean name 'registrationFormBean' available as request attribute
。< / p>
这是我的控制器的来源,以及我的问题的黑客攻击:
@RequestMapping(value = "login", method = RequestMethod.POST)
public String postLoginForm(@ModelAttribute("registrationFormBean") RegistrationFormBean registrationFormBean, @ModelAttribute("loginFormBean") @Valid LoginFormBean loginFormBean, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "register";
}
return "register";
}
@RequestMapping(value = "registeration", method = RequestMethod.POST)
public String postRegisterationForm(@ModelAttribute("loginFormBean") LoginFormBean loginFormBean, @ModelAttribute("registrationFormBean") @Valid RegistrationFormBean registrationFormBean, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
return "register";
}
return "register";
}
更新
登录表单(在单个JSP页面中):
// login form 1
<sf:form id="redId" action="registration" modelAttribute="registrationFormBean" method="POST">
<sf:input path="firstName" id="fName" />
<sf:input path="lastName" id="lName" />
<sf:input path="emailId" id="email" />
</sf:form>
// login form 2
<sf:form action="login" modelAttribute="loginFormBean" method="POST">
<sf:input path="userName" id="userId" />
<sf:input path="passWord" id="passId" />
</sf:form>
现在,如果从@ModelAttribute("loginFormBean")
移除postRegisterationForm()
或从@ModelAttribute("registrationFormBean")
移除postLoginForm()
,我会收到错误。
我不认为在每个方法参数中添加@ModelAttribute
是一个很好的设计,因为其他方法不能提供任何建议。
什么是正确的设计?