SpringMVC使用@Valid注解进行数据验证的方法
发布时间 - 2026-01-10 23:10:44 点击率:次我们在做Form表单提交的时候,只在前端做数据校验是不够安全的,所以有时候我们需要在后端同样做数据的校验。好在SpringMVC在后台验证给我们提供了一个比较好的支持。那就是使用Valid接口的实现类做数据校验。在这之前我们先做一下准备的工作。

添加相关的Maven依赖
我们先把需要的jar包添加进来。
<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方法,用来进行相关的校验。具体的实现类如下:
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类里。写法如下:
//绑定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),要不然不会生效的。
另外需要注意的是:这里的校验是哪个请求需要校验,就写在哪个请求上。如果需要配置全局的校验的话,可以在<mvc:annotation-driven/>中配置validator。写法如下:
<mvc:annotation-driven validator="personalValidtor"> <bean id="personalValidtor" class="com.zkn.learnspringmvc.validtor.PersonalValidtor"/>
使用<form:errors />标签
上面的错误信息的展示是我们自己来展示的错误信息,但是SpringMVC还给我们提供了一个<form:errors />标签来展示错误信息。例子如下:
@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://www.springframework.org/tags/form" %> <%@page pageEncoding="utf-8" contentType="text/html;utf-8"%> <form:errors path="personScope.name"/>
注意:<form:errors />标签是SpringMVC提供的,所以我们得引入这个标签库
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
效果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# valid注解
# valid注解配置
# valid
# SpringMVC实现Validation校验过程详解
# SpringMVC 数据校验方法(必看篇)
# SpringMVC 数据校验实例解析
# SpringBoot参数校验的最佳实战教程
# SpringMVC中常用参数校验类注解使用示例教程
# 的是
# 错误信息
# 绑定
# 表单
# 需要注意
# 为空
# 在这个
# 在这
# 给我们
# 比较好
# 只在
# 先把
# 来实现
# 写在
# 大家多多
# 先做
# 里用
# 后端
# 那就是
# 三元桥
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
java中使用zxing批量生成二维码立牌
清除minerd进程的简单方法
打开php文件提示内存不足_怎么调整php内存限制【解决方案】
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
linux top下的 minerd 木马清除方法
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何打造高效商业网站?建站目的决定转化率
网站建设要注意的标准 促进网站用户好感度!
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何在宝塔面板中修改默认建站目录?
如何在万网ECS上快速搭建专属网站?
如何构建满足综合性能需求的优质建站方案?
详解Oracle修改字段类型方法总结
EditPlus中的正则表达式 实战(2)
长沙做网站要多少钱,长沙国安网络怎么样?
如何用VPS主机快速搭建个人网站?
C#如何调用原生C++ COM对象详解
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
在Oracle关闭情况下如何修改spfile的参数
如何在阿里云虚拟主机上快速搭建个人网站?
浅述节点的创建及常见功能的实现
历史网站制作软件,华为如何找回被删除的网站?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
北京专业网站制作设计师招聘,北京白云观官方网站?
iOS发送验证码倒计时应用
如何在局域网内绑定自建网站域名?
Java遍历集合的三种方式
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
如何在Windows 2008云服务器安全搭建网站?
bing浏览器学术搜索入口_bing学术文献检索地址
ai格式如何转html_将AI设计稿转换为HTML页面流程【页面】
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
原生JS获取元素集合的子元素宽度实例
phpredis提高消息队列的实时性方法(推荐)
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Java类加载基本过程详细介绍
在线制作视频网站免费,都有哪些好的动漫网站?
南京网站制作费用,南京远驱官方网站?
Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册
如何彻底卸载建站之星软件?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?

