我們在做Form表單提交的時候,只在前端做數據校驗是不夠安全的,所以有時候我們需要在后端同樣做數據的校驗。好在SpringMVC在后臺驗證給我們提供了一個比較好的支持。那就是使用Valid接口的實現類做數據校驗。在這之前我們先做一下準備的工作。
添加相關的Maven依賴
我們先把需要的jar包添加進來。
1
2
3
4
5
6
7
8
9
10
|
< dependency > < groupId >javax.validation</ groupId > < artifactId >validation-api</ artifactId > < version >1.1.0.Final</ version > </ dependency > < dependency > < groupId >org.apache.bval</ groupId > < artifactId >bval-jsr303</ artifactId > < version >0.5</ version > </ dependency > |
實現Validator接口
接下來的第一 步我們需要寫一個類來實現Validator接口。在這個類里我們需要定義它支持校驗的JavaBean,實現validate方法,用來進行相關的校驗。具體的實現類如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package com.zkn.learnspringmvc.validtor; import com.zkn.learnspringmvc.scope.PersonScope; import org.springframework.util.StringUtils; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; /** * Created by wb-zhangkenan on 2016/9/2. */ public class PersonalValidtor implements Validator{ /** * 判斷支持的JavaBean類型 * @param aClass * @return */ @Override public boolean supports(Class<?> aClass) { return PersonScope. class .equals(aClass); } /** * 實現Validator中的validate接口 * @param obj * @param errors */ @Override public void validate(Object obj, Errors errors) { //把校驗信息注冊到Error的實現類里 ValidationUtils.rejectIfEmpty(errors, "name" , null , "姓名不能為空!" ); PersonScope personScope = (PersonScope) obj; if (StringUtils.isEmpty(personScope.getAddress())){ errors.rejectValue( "address" , null , "家庭地址不能為空!!!!" ); } } } |
使用Validtor的校驗實現類
我們需要在Controller的類里使用剛才寫的Validtor的校驗實現類來進行表單數據的校驗。我們需要在Controller里用@InitBinder注解把剛才的校驗類綁定到WebDataBinder類里。寫法如下:
1
2
3
4
5
|
//綁定PersonalValidator @InitBinder public void initBinder(WebDataBinder webDataBinder){ webDataBinder.addValidators( new PersonalValidtor()); } |
接下來我們需要在@RequestMapping這個注解所在的方法上使用@Valid注解進行數據的校驗。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@RequestMapping (value = "testPersonalValidtor.do" ) @ResponseBody //直接返回對象 public Object testPersonalValidtor( @Valid PersonScope personScope, BindingResult bindingResult){ if (bindingResult.hasErrors()){ StringBuffer sb = new StringBuffer(); for (ObjectError objectError : bindingResult.getAllErrors()){ sb.append(((FieldError)objectError).getField() + " : " ).append(objectError.getDefaultMessage()); } return sb.toString(); } else { return personScope; } } |
接下來我們來看一下效果:
請求:http://localhost:8081/testPersonalValidtor.do
結果:
請求:http://localhost:8081/testPersonalValidtor.do?name=張三&address=三元橋
結果:
具體Controller類代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package com.zkn.learnspringmvc.news.controller; import com.alibaba.fastjson.JSON; import com.zkn.learnspringmvc.scope.PersonScope; import com.zkn.learnspringmvc.validtor.PersonalValidtor; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; /** * 用來測試PersonalValidator的控制器 * Created by wb-zhangkenan on 2016/9/2. */ @Controller public class TestPersonlalValidtorController { //綁定PersonalValidator @InitBinder public void initBinder(WebDataBinder webDataBinder){ webDataBinder.addValidators( new PersonalValidtor()); } @RequestMapping (value = "testPersonalValidtor.do" ) @ResponseBody //直接返回對象 public Object testPersonalValidtor( @Valid PersonScope personScope, BindingResult bindingResult){ if (bindingResult.hasErrors()){ StringBuffer sb = new StringBuffer(); for (ObjectError objectError : bindingResult.getAllErrors()){ sb.append(((FieldError)objectError).getField() + " : " ).append(objectError.getDefaultMessage()); } return sb.toString(); } else { return personScope; } } } |
PersonScope實體類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
package com.zkn.learnspringmvc.scope; import java.io.Serializable; /** * Person對象 * @author zkn * */ public class PersonScope implements Serializable{ /** * 序列 */ private static final long serialVersionUID = 1L; /** * 姓名 */ private String name; /** * 年齡 */ private Integer age; /** * 家庭地址 */ private String address; private StudentScope studentScope; public String getName() { return name; } public void setName(String name) { this .name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this .age = age; } @Override public String toString() { return "PersonDomain [name=" + name + ", age=" + age + "]" ; } public StudentScope getStudentScope() { return studentScope; } public void setStudentScope(StudentScope studentScope) { this .studentScope = studentScope; } public String getAddress() { return address; } public void setAddress(String address) { this .address = address; } } |
這里需要注意的是:@Valid要緊挨著JavaBean(即PersonScope),要不然不會生效的。
另外需要注意的是:這里的校驗是哪個請求需要校驗,就寫在哪個請求上。如果需要配置全局的校驗的話,可以在<mvc:annotation-driven/>中配置validator。寫法如下:
1
2
3
|
< mvc:annotation-driven validator = "personalValidtor" > < bean id = "personalValidtor" class = "com.zkn.learnspringmvc.validtor.PersonalValidtor" /> |
使用<form:errors />標簽
上面的錯誤信息的展示是我們自己來展示的錯誤信息,但是SpringMVC還給我們提供了一個<form:errors />標簽來展示錯誤信息。例子如下:
1
2
3
4
5
6
7
8
|
@RequestMapping (value = "testPersonalValidtor02.do" ) public Object testPersonalValidtor01( @Valid PersonScope personScope, BindingResult bindingResult){ if (bindingResult.hasErrors()){ return "error" ; } else { return "home" ; } } |
jsp頁面內容如下:
1
2
3
4
|
<% @taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %> <% @page pageEncoding= "utf-8" contentType= "text/html;utf-8" %> <form:errors path= "personScope.name" /> |
注意:<form:errors />標簽是SpringMVC提供的,所以我們得引入這個標簽庫
1
|
<% @taglib prefix= "form" uri= "http://www.springframework.org/tags/form" %> |
效果如下:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.jianshu.com/p/8009ca218b11