在form表单的modelAttribute属性无法解析的原因和解决方法
@ModelAttribute 注解将对象放入模型对象中,用于在视图层进行显示
引起错误的原因
然而使用错误经常会报这样的错误
java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name '***' available as request attribute
造成这个的原因就是上述报错信息所说的
绑定对象或目标并没有绑定到request域中 这就造成了在视图层拿不到关于这个对象的属性
解决方法如下(以下使用一个注册功能作为示例):
<%-- 这是我用于填写注册信息的页面 registerForm.jsp --%>
<h3><spring:message code="title"/> </h3>
<fm:form modelAttribute="account" method="post" action="http://localhost:8080/springmvc1_war_exploded/account/register">
<spring:message code="loginName"/>
<fm:input path="loginName"/><br/>
<spring:message code="password"/>
<fm:input path="password"/><br/>
<spring:message code="age"/>
<fm:input path="age"/><br/>
<spring:message code="email"/>
<fm:input path="email"/><br/>
<spring:message code="phone"/>
<fm:input path="phone"/><br/>
<input type="submit" value="<spring:message code="submit"/> "><br/>
</fm:form>
@Controller
@RequestMapping("/account")
public class AccountController {
//此方法用于跳转至注册页面
@RequestMapping(value = "/goRegister")
public String goRegister(){
return "registerForm";
}
@RequestMapping(value = "/{formName}")
public String registerForm(@PathVariable String formName, Model model) {
Account account = new Account();
model.addAttribute("account", account);
return formName;
}
}
- 第一种情况是
跳转是并没有加入 @ModelAttribute 注解,但是在 jsp 的 form 表单中使用到了 modelAttribute 属性, 而跳转过程中并没有将我的 account 对象传到 jsp 中因而报错,
这个时候报错的页面显示是
证明我是能访问到这个界面的, 但无法显示数据
这个时候有两种方式解决:
第一种方法 在 jsp 中加入
<jsp:useBean id="account" class="com.springmvc.entity.Account" scope="request"/>
这行代码作用是直接将 account 对象加入到 request 域中
访问成功
第二种方法 直接通过 url 访问
访问成功
为什么这样我能访问成功呢 ,原因是我在
@RequestMapping(value = "/{formName}")
public String registerForm(@PathVariable String formName, Model model) {
Account account = new Account();
model.addAttribute("account", account);
return formName;
}
使用了 model 的 addAttribute("***",***) 方法,将对象加入了 域中,所以即使我不使用页面跳转方法也可以直接进入
- 在跳转方法中添加一个 @ModelAtribute(value = “***”) 的注解
//此方法用于跳转至注册页面
@RequestMapping(value = "/goRegister")
public String goRegister(@ModelAttribute("account") Account account){
return "registerForm";
}
这个时候就相当于访问注册页面前提前把 account 对象放进域中
访问成功
如果有更多解决方式大家一起交流交流