Spring MVC InitBinder驗(yàn)證方法
使用InitBinder做驗(yàn)證的情況一般會(huì)在此Controller中提交的數(shù)據(jù)需要有一些是業(yè)務(wù)性質(zhì)的,也即比較復(fù)雜的驗(yàn)證情況下才會(huì)使用。大部份簡單的表單驗(yàn)證,使用annotation驗(yàn)證即可以解決。
Annotation驗(yàn)證使用方法可參見:http://www.dhdzp.com/article/136448.htm
這里需要注意的一點(diǎn):InitBinder和Annotation兩種驗(yàn)證只能二選一,如果使用了InitBinder,就不能使用Annotation驗(yàn)證。
前面的web.xml和spring.xml的配置就不再重復(fù),可參見上面鏈接中的配置。一模一樣。
直接上代碼:
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()方法是取不到對應(yīng)正確的message的。可以看最后的輸入打印結(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 />來取得錯(cuò)誤信息,且,這個(gè)<form:errors/>一定要在<form:form/>當(dāng)中。
5、結(jié)果測試

點(diǎn)擊Add button:

打印輸出:

可以看到,這里取不到錯(cuò)誤的正確信息
事實(shí)上,在一個(gè)非常復(fù)雜表單頁面,里頭所提交的數(shù)據(jù)驗(yàn)證有一定的業(yè)務(wù)邏輯性時(shí),InitBinder應(yīng)該都不多用,因?yàn)楹芏鄷r(shí)候我們可以使用一個(gè)Map,把errors插入進(jìn)去,在頁面讀取即可。比如:
Map<String, String> errors;
errors.add("name", "user name can NOT be empty!");
:
:
頁面中只需要使用:
<span style="color:red;">${errors.name}<span>
即可。
以上就是本文的全部內(nèi)容,希望對大家的學(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ān)文章
redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作
這篇文章主要介紹了redis?redisTemplate數(shù)據(jù)類型基礎(chǔ)操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問題及解決方法
這篇文章主要介紹了一個(gè)applicationContext 加載錯(cuò)誤導(dǎo)致的阻塞問題及解決方法,需要的朋友可以參考下2018-11-11
java讀取某個(gè)文件夾下的所有文件實(shí)例代碼
這篇文章主要介紹了java讀取某個(gè)文件夾下的所有文件實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03
關(guān)于報(bào)錯(cuò)IDEA Terminated with exit code
如果在IDEA構(gòu)建項(xiàng)目時(shí)遇到下面這樣的報(bào)錯(cuò)IDEA Terminated with exit code 1,那必然是Maven的設(shè)置參數(shù)重置了,導(dǎo)致下載錯(cuò)誤引起的,本文給大家分享兩種解決方法,需要的朋友可以參考下2022-08-08

