使用雙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.星光不問趕路人,時光不負有心人。
我有一杯酒,足以慰風塵。