使用双Form时,绑定的实体类出现错误
作者:互联网
一:报错信息:Neither BindingResult nor plain target object for bean name 'p'
1.这是我在进行303我问了很多人,最终发现了一点小知识 , ' p ' 为我在后端绑定的实体类
//去登录 @RequestMapping("/tolog") public String tolog(Model model,Patient patient){ model.addAttribute("p",patient); return "log"; } //登录验证 @RequestMapping("/log") public String logUser(@Validated @ModelAttribute Patient patient, BindingResult result, Model model){ if(result.hasErrors()){ return "log"; } Patient patient1 = patientService.showPatient(patient); if(patient1!=null){ //存在 //则登陆成功 return "redirect:list"; } return "log"; }
2.前端
<form:form modelAttribute="p" action="log" method="post"> 名字:<form:input path="name"/> <form:errors path="name"></form:errors> 密码:<form:input path="password"/> <form:errors path="password"></form:errors> <button>登录</button> </form:form>
3.这是我的实体类
private Integer id;//id @NotBlank(message = "不能为空") private String name;//名称 @NotBlank(message = "不能为空") private String password;//密码
4.注意,此时我绑定的实体类名称和我前端绑定的实体类别名一致的,且我在写path=<实体类属性名称>时,是有提示的,但是就爆出了上面那个错误,接下来我将展示多种情况
@NotBlank一般用来校验String类型不能为空
@NotNull一般用来校验Integer类型不能为空
@NotEmpty一般用来校验List类型不能为空
——+此时接收的实体类名称改为跟前端的名称一致为《p》+—— 此时错误信息不变
//登录验证 @RequestMapping("/log") public String logUser(@Validated @ModelAttribute Patient p, BindingResult result, Model model){ if(result.hasErrors()){ return "log"; } //patient Patient patient1 = patientService.showPatient(p); if(patient1!=null){ //存在 //则登陆成功 return "redirect:list"; } return "log"; }
5.再次修改接收实体类处,在@ModelAttribute 后添加实体类别名 此时验证生效,仔细看两处你会发现我修改了实体类的名称,但是依旧可以正确验证
//登录验证 @RequestMapping("/log") public String logUser(@Validated @ModelAttribute("p") Patient p, BindingResult result, Model model){ if(result.hasErrors()){ return "log"; } //patient Patient patient1 = patientService.showPatient(p); if(patient1!=null){ //存在 //则登陆成功 return "redirect:list"; } return "log"; }
6.再次进行修改,这次让绑定实体类处,以及前端绑定保证一致
//去登录 @RequestMapping("/tolog") public String tolog(Model model,Patient patient){ model.addAttribute("patient",patient); return "log"; }
<form:form modelAttribute="patient" action="log" method="post"> 名字:<form:input path="name"/> <form:errors path="name"></form:errors> 密码:<form:input path="password"/> <form:errors path="password"></form:errors> <button>登录</button> </form:form>
7.其实我写了好多,但是失手刷新了一下QAQ,都没了,但我又不想写了,所以以下简单说明如何正确写出form验证的绑定。标记了三处,我将给我三种正确的情况,请仔细观察他们的不同
//去登录 @RequestMapping("/tolog") public String tolog(Model model,Patient patient){ model.addAttribute("patient",patient); //___________________________第一处 return "log"; } //登录验证 @RequestMapping("/log") public String logUser(@Validated @ModelAttribute Patient p, BindingResult result, Model model){ //——————————————————————————————第二处 if(result.hasErrors()){ return "log"; } //patient Patient patient1 = patientService.showPatient(p); if(patient1!=null){ //存在 //则登陆成功 return "redirect:list"; } return "log"; }
<form:form modelAttribute="patient" action="log" method="post"> //————————————————————————————————第三处 名字:<form:input path="name"/> <form:errors path="name"></form:errors> 密码:<form:input path="password"/> <form:errors path="password"></form:errors> <button>登录</button> </form:form>
1.第一处不变
第二处: public String logUser(@Validated @ModelAttribute Patient p, BindingResult result, Model model)
第三处:
<%--@elvariable id="patient" type="com.zcb.entity.Patient"--%> <form:form modelAttribute="patient" action="log" method="post">
2.第一处不变
第二处:
public String logUser(@Validated @ModelAttribute("patient") Patient p, BindingResult result, Model model){
第三处不变
3.第一处不变
第二处:
public String logUser(@Validated @ModelAttribute Patient patient, BindingResult result, Model model)
第三处不变
8.请注意,我的操作都是在我7的两张效果图那里进行修改,最终发现这几种方式都可以,最简便的方式就是直接将绑定实体类时写的名称为实体类的名称小写,接收时也是,这样能够省去很多麻烦,且简单明了
9.如有错误,欢迎指正。
10.星光不问赶路人,时光不负有心人。
标签:实体类,patient,log,Form,绑定,return,model,Patient,String 来源: https://www.cnblogs.com/lenny-z/p/15483774.html