Spring数据校验

数据校验

为什么需要服务端校验?

   最早的校验,就是服务端校验。早期的网站,用户输入一个邮箱地址,校验邮箱地址需要将地址发送到服务端,服务端进行校验,校验成功后,给前端一个响应。有了JavaScript,校验工作可以放在前端去执行。
   那么为什么还需要服务端校验呢?
   因为前端传来的数据不可信。前端很容易获取都后端的数据接口,如果有人绕过页面,就会出现非法数据,所以服务端也要数据校验,总的来说:
 1.前端校验要做,目的是为了提高用户体验
 2.后端校验也要做,目的是为了数据安全

普通校验

Springmvc本身没有校验功能,它使用hibernate的校验框架,hibernate的校验框架和orm没有关系

1.导入jar包
在这里插入图片描述
Maven

<dependency>
  	<groupId>org.hibernate</groupId>
  	<artifactId>hibernate-validator</artifactId>
  	<version>5.3.0.Alpha1</version>
</dependency>

2.创建properties文件

  属性文件用来声明错误提示信息
  

在这里插入图片描述3.在springmvc的配置文件中配置如下

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
		
	<!-- 开启扫描,开启SpringMVC注解的使用 -->
	<context:component-scan base-package="com.i.controller"></context:component-scan>
	<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
	
	<!--添加对JSR-303验证框架的支持  -->
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
        <!--不设置则默认为classpath下的 ValidationMessages.properties -->
        <property name="validationMessageSource" ref="validatemessageSource"/>
    </bean>
   
    <bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:ValidateMessages"/>  
        <property name="fileEncodings" value="utf-8"/>  
        <property name="cacheSeconds" value="120"/>  
    </bean>	
</beans>

在这里插入图片描述4.Bean对象中配置校验规则

	//通过注解指定规则
	@NotBlank(message="{USER_NAME_MESSAGE_NOT_EMPTY}")
	@Length(min=3,max=6,message="{USER_NAME_MESSAGE_SIZE}")
	private String name;
	
	@NotBlank(message="地址不能为空")
	@Length(min=3,max=50,message="地址信息的长度为3~50位")
	private String address;

校验规则

注解说明
@Null被注解的元素必须为 null
@NotNull被注解的元素必须不为 null
@AssertTrue被注解的元素必须为 true
@AssertFalse被注解的元素必须为 false
@NotEmpty被注解的字符串的必须非空
@Length(min=,max=)被注解的字符串的大小必须在指定的范围内
@Range(min=,max=,message=)被注解的元素必须在合适的范围内
@Min(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=)被注解的元素的大小必须在指定的范围内
@Digits (integer, fraction)被注解的元素必须是一个数字,其值必须在可接受的范围内
@Past被注解的元素必须是一个过去的日期
@Future被注解的元素必须是一个将来的日期
@Pattern(regex=,flag=)被注解的元素必须符合指定的正则表达式
@NotBlank(message =)验证字符串非null,且长度必须大于0
@Email被注解的元素必须是电子邮箱地址

5.Controller中校验

@Controller
public class UserController {

	/**
	 * @Validated: 表示接收的数据需要根据指定的规则进行校验,需要被 hibernate验证框架 验证的信息,需要在器前面加入@Validated
	 * BindingResult: 用来保存验证结果的对象,必须跟在验证变量之后,如果有多个信息需要验证,那么就要有多个 BindingResult	参数
	 */
	@RequestMapping("/demo")
	public String demo(@Validated User user,BindingResult br,Model m){
		//获取校验结果
			List<ObjectError> errors = br.getAllErrors();
			if(errors != null && errors.size() > 0){
				//表示验证有问题
				for (ObjectError e : errors) {
					System.out.println(e.getDefaultMessage());
				}
				m.addAttribute("msg",errors);
				return "user";
			}
			//表示没有问题
			System.out.println("No problem!!!");
			return "index";
	}
			
}

6.jsp页面中获取错误信息
 需要导入jstl.jar包

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
	<h1>用户管理:</h1>
	<h3>验证信息:<br>
		<c:if test="${msg ne null}">
			<c:forEach items="${msg}" var="e">
				${e.defaultMessage}<br>
			</c:forEach>
		</c:if>
	</h3>
	
	<form action="demo" method="post">
		id:<input type="text" name="id"><br>
		姓名:<input type="text" name="name"><br>
		地址:<input type="text" name="address"><br>
		<input type="submit" value="提交"><br>
	</form>
</body>
</html>

测试
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

分组校验

为什么需要分组校验?

因为一个对象有多个属性,而不同的controller校验的需求是不一样的,
必须c1只需要校验对象的账号是否为空就可以了,而c2不光要校验账号为空还需要校验手机号必须不能为空,
这时分组校验就能解决这个问题了。

实现步骤如下:

1.定义分组
在这里插入图片描述

2.Bean对象中配置校验规则

//通过注解指定规则
	@NotBlank(message="账号不能为空",groups={InterfaceGroup1.class,InterfaceGroup2.class})
	@Length(min=3,max=6,message="账号长度位3~6位",groups={InterfaceGroup1.class})
	private String name;
	
	@NotBlank(message="地址不能为空",groups={InterfaceGroup2.class})
	@Length(min=3,max=50,message="地址信息的长度为3~50位",groups={InterfaceGroup1.class})
	private String address;

3.Controller中使用

@Controller
public class UserController {

	/**
	 * @Validated: 表示接收的数据需要根据指定的规则进行校验,需要被 hibernate验证框架 验证的信息,需要在器前面加入@Validated
	 * BindingResult: 用来保存验证结果的对象,必须跟在验证变量之后,如果有多个信息需要验证,那么就要有多个 BindingResult	参数
	 * 
	 * @Validated(value={xxx.class}):后面数据的验证,按照这个组类的规则进行验证,不在的就不用验证
	 */
	@RequestMapping("/demo")
	public String demo(@Validated(value={InterfaceGroup1.class}) User user,BindingResult br,Model m){
		//获取校验结果
			List<ObjectError> errors = br.getAllErrors();
			if(errors != null && errors.size() > 0){
				//表示验证有问题
				for (ObjectError e : errors) {
					System.out.println(e.getDefaultMessage());
				}
				m.addAttribute("msg",errors);
				return "user";
			}
			//表示没有问题
			System.out.println("No problem!!!");
			return "index";
	}
			
	@RequestMapping("/demo2")
	public String demo2(@Validated(value={InterfaceGroup2.class}) User user,BindingResult br,Model m){
		//获取校验结果
		List<ObjectError> errors = br.getAllErrors();
		if(errors != null && errors.size() > 0){
			//表示验证有问题
			for (ObjectError e : errors) {
				System.out.println(e.getDefaultMessage());
			}
			m.addAttribute("msg",errors);
			return "user";
		}
		//表示没有问题
		System.out.println("No problem!!!");
		return "index";
	}
}

在这里插入图片描述测试:
分组完成两种情况
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值