Spring MVC InitBinder驗(yàn)證方法
使用InitBinder做驗(yàn)證的情況一般會(huì)在此Controller中提交的數(shù)據(jù)需要有一些是業(yè)務(wù)性質(zhì)的,也即比較復(fù)雜的驗(yàn)證情況下才會(huì)使用。大部份簡(jiǎn)單的表單驗(yàn)證,使用annotation驗(yàn)證即可以解決。
Annotation驗(yàn)證使用方法可參見(jiàn):http://www.dbjr.com.cn/article/136448.htm
這里需要注意的一點(diǎn):InitBinder和Annotation兩種驗(yàn)證只能二選一,如果使用了InitBinder,就不能使用Annotation驗(yàn)證。
前面的web.xml和spring.xml的配置就不再重復(fù),可參見(jiàn)上面鏈接中的配置。一模一樣。
直接上代碼:
1、User5 model實(shí)體類
package com.my.controller.bean; import java.util.Date; public class User5 { private long id; private String name; private String password; private Date createTime; private int age; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
2、新增一個(gè)Validator:
package com.my.controller.validator; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import com.my.controller.bean.User5; @Component public class TestValidator implements Validator { @Override public boolean supports(Class<?> paramClass) { return User5.class.equals(paramClass); } @Override public void validate(Object obj, Errors errors) { User5 user = (User5) obj; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "valid.name", null, ""); if(user.getAge() < 18) { errors.rejectValue("age", "valid.ageMin", new Object[]{"age" ,18}, "年齡不能小于{1}歲"); } } }
這里需要加入@Component,注入DI
3、Controller
package com.my.controller; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.my.controller.bean.User5; @Controller @RequestMapping(value="binder") public class TestInitBinderController { @Autowired @Qualifier(value="testValidator") private Validator validator; @InitBinder private void initBinder(WebDataBinder binder) { binder.setValidator(validator); } @RequestMapping(method=RequestMethod.GET) public String index() { return "/TestInitBinder/index"; } @RequestMapping(value="add", method=RequestMethod.POST) public ModelAndView add(@ModelAttribute @Valid User5 user, BindingResult result) { ModelAndView view = new ModelAndView("TestInitBinder/index"); view.addObject("user", user); if(result.hasErrors()) { List<FieldError> errs = result.getFieldErrors(); Map<String, String> mapErrors = new LinkedHashMap<String, String>(); for(FieldError err : errs) { System.out.println("ObjectName:" + err.getObjectName() + "\tFieldName:" + err.getField() + "\tFieldValue:" + err.getRejectedValue() + "\tMessage:" + err.getDefaultMessage()); mapErrors.put(err.getField(), err.getDefaultMessage()); view.addObject("errors", mapErrors); } return view; } return view; } }
把Validator注入到Controller中。
事實(shí)上,使用InitBinder,在add controller中的err.getDefaultMessage()方法是取不到對(duì)應(yīng)正確的message的??梢钥醋詈蟮妮斎氪蛴〗Y(jié)果。
4、View
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <%@ taglib prefix="st" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Init binder</title> </head> <body> <form:form action="/TestSpringMvc1/binder/add" method="post" modelAttribute="user5"> User name:<input type="text" id="name" name="name" value="${user.name}" /><br/> Password:<input type="text" id="password" name="password" value="${user.password}" /><br/> Age:<input type="text" id="age" name="age" value="${user.age}" /><br/> <input type="submit" value="Add"/> <hr/> Error:<br/> <form:errors path="*"></form:errors> </form:form> </body> </html>
注意,這里只能使用<form:errors />來(lái)取得錯(cuò)誤信息,且,這個(gè)<form:errors/>一定要在<form:form/>當(dāng)中。
5、結(jié)果測(cè)試
點(diǎn)擊Add button:
打印輸出:
可以看到,這里取不到錯(cuò)誤的正確信息
事實(shí)上,在一個(gè)非常復(fù)雜表單頁(yè)面,里頭所提交的數(shù)據(jù)驗(yàn)證有一定的業(yè)務(wù)邏輯性時(shí),InitBinder應(yīng)該都不多用,因?yàn)楹芏鄷r(shí)候我們可以使用一個(gè)Map,把errors插入進(jìn)去,在頁(yè)面讀取即可。比如:
Map<String, String> errors;
errors.add("name", "user name can NOT be empty!");
:
:
頁(yè)面中只需要使用:
<span style="color:red;">${errors.name}<span>
即可。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring MVC+ajax進(jìn)行信息驗(yàn)證的方法
- springMVC實(shí)現(xiàn)圖形驗(yàn)證碼(kaptcha)代碼實(shí)例
- 使用SpringMVC的@Validated注解驗(yàn)證的實(shí)現(xiàn)
- Spring MVC Annotation驗(yàn)證的方法
- SpringMVC實(shí)現(xiàn)表單驗(yàn)證功能詳解
- springmvc攔截器登錄驗(yàn)證示例
- SpringMVC攔截器——實(shí)現(xiàn)登錄驗(yàn)證攔截器的示例代碼
- SpringMVC使用@Valid注解進(jìn)行數(shù)據(jù)驗(yàn)證的方法
- springMVC 用戶登錄權(quán)限驗(yàn)證實(shí)現(xiàn)過(guò)程解析
相關(guān)文章
Java springboot接口迅速上手,帶你半小時(shí)極速入門
這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)API接口的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09java使用FastJson解析Json數(shù)據(jù)
本篇文章主要介紹了java使用FastJson解析Json數(shù)據(jù),fastjson 是一個(gè)性能極好的用 Java 語(yǔ)言實(shí)現(xiàn)的 JSON 解析器和生成器,有興趣的可以了解一下。2017-02-02Spring和IDEA不推薦使用@Autowired?注解原因解析
這篇文章主要為大家介紹了Spring和IDEA不推薦使用@Autowired?注解原因解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Java實(shí)現(xiàn)駝峰下劃線互轉(zhuǎn)的使用示例
駝峰和下劃線互轉(zhuǎn)場(chǎng)景是在不同命名規(guī)范的情況下,需要進(jìn)行字段名稱的轉(zhuǎn)換,本文就來(lái)介紹一下Java實(shí)現(xiàn)駝峰下劃線互轉(zhuǎn)的使用示例,感興趣的可以了解一下2023-12-12聊聊spring @Transactional 事務(wù)無(wú)法使用的可能原因
這篇文章主要介紹了spring @Transactional 事務(wù)無(wú)法使用的可能原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07SpringCloud中的OpenFeign調(diào)用解讀
OpenFeign是一個(gè)顯示聲明式的WebService客戶端,使用OpenFeign能讓編寫Web Service客戶端更加簡(jiǎn)單OpenFeign的設(shè)計(jì)宗旨式簡(jiǎn)化Java Http客戶端的開發(fā),本文給大家介紹SpringCloud之OpenFeign調(diào)用解讀,感興趣的朋友一起看看吧2023-11-11