SpringMVC使用@Valid注解进行数据验证的方法

网友投稿 253 2023-06-10


SpringMVC使用@Valid注解进行数据验证的方法

我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。

添加相关的Maven依赖

我们先把需要的jar包添加进来。

javax.validation

validation-api

1.1.0.Final

org.apache.bval

bval-jsr303

0.5

实现Validator接口

接下来的第一 步我们需要写一个类来实现Validator接口。在这个类里我们需要定义它支持校验的JavaBean,实现validate方法,用来进行相关的校验。具体的实现类如下:

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的校验实现类来进行表单数据的校验。我们需要在CEJPsamGRkontroller里用@InitBinder注解把刚才的校验类绑定到WebDataBinder类里。写法如下:

//绑定PersonalValidator

@InitBinder

public void initBinder(WebDataBinder webDataBinder){

webDataBinder.addValidators(new PersonalValidtor());

}

接下来我们需要在@RequestMapping这个注解所在的方法上使用@Valid注解进行数据的校验。

@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类代码如下:

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实体类:

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),要不然不会生效的。

另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在中配置validator。写法如下:

使用标签

上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个标签来展示错误信息。例子如下:

@RequestMapping(value = "testPersonalValidtor02.do")

public Object testPersonalValidtor01(@Valid PersonScope personScope, BindingResult bindingResult){

if(bindingResult.hasErrors()){

return "error";

}else{

return "home";

}

}

jsp页面内容如下:

<%@taglib prefix="form" uri="http://springframework.org/tags/form" %>

<%@page pageEncoding="utf-8" contentType="text/html;utf-8"%>

注意:标签是SpringMVC提供的,所以我http://们得引入这个标签库

<%@taglib prefix="form" uri="http://springframework.org/tags/form" %>

效果如下:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java泛型映射不同的值类型详解及实例代码
下一篇:Java RMI详细介绍及简单实例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~