数据效验:
验证客户输入的数据是否合法
比如客户登录时,用户名不能为空,或者不能超出指定长度等要求
数据效验分为客户端效验和服务端效验.
客户端效验: js效验
服务端效验: springmvc使用validation校验,struts2使用validation校验
1.导入数据效验的包 validation-api
hibernate-validator
jboss-logging
2.在需要效验的POJO中进行设置
3.在controller中需要效验的参数,前面加上@Validated
4.在spring-MVC的配置文件中配置 localvalidator的bean
并且将该Bean设置为 annotation-Dirven标签的属性
5.在需要验证的参数后面,加一个BinderResult对象,从该对象中就可以获取验证信息
<!--6.在前端界面通过 spring的<from: errors> 标签获取错误信息-->
<form:errors path="数据校验的参数名.变量名"/>
1.pom.xml
<profiles>
<!-- JDK:JRE转化版本 -->
<profile>
<id>development</id>
<activation>
<jdk>1.8</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<!-- 统一属性设置 -->
<properties>
<!-- 字符编码配置 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- springMVC相关依赖版本 -->
<spring.version>5.0.7.RELEASE</spring.version>
</properties>
<dependencies>
<!--springMVC 数据校验 相关包 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.12.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--springMVC 相关依赖-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
2.web.xml
<!-- POST防止中文乱码 -->
<filter> <!--注意这里是filter,不要配置成servlet -->
<filter-name>CharactorFilter</filter-name> <!--过滤器名称 -->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--过滤器的完整类名 -->
<init-param> <!--初始化参数 -->
<param-name>encoding</param-name> <!--参数名称 -->
<param-value>utf-8</param-value> <!--参数值 -->
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping> <!--过滤器映射 -->
<filter-name>CharactorFilter</filter-name><!--过滤器名称 -->
<url-pattern>/*</url-pattern><!--URL映射,给所有页面处理乱码 -->
</filter-mapping>
<!-- struts2 是通过过滤器对请求进行处理 springMVC通过servlet对所有的请求进行处理 servlet也称为前端控制器、中央控制器
1、servlet比过滤器效率高 2、好管理 -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置spring的bean配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC_beans.xml</param-value>
</init-param>
<!-- 加载顺序 -->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 前端控制器的映射路径配置,由于前端控制器是处理所有请求的,所以,此处路径配置为根目录 -->
<!-- "/*":根目录底下所有的文件 "/":根目录下所有的资源都能处理,除了.jsp. .js .jpg.... .jsp管不到,不经过前端控制器
*.do: 只处理.do文件 -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
3.springMVC_beans.xml
<!-- 扫描注解包 -->
<context:component-scan base-package="com.xalo.controller"></context:component-scan>
<!-- 在annotation-Driver中注册数据校验器:必须注册,要不不生效,因为它不是spring的注解 -->
<mvc:annotation-driven validator="validator"></mvc:annotation-driven>
<!-- 配置数据校验器 -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"></bean>
<!-- 界面解析器配置 根据逻辑视图名称匹配到物理视图. 例如:逻辑视图名称为 hello 逻辑视图拼接上前缀后缀 /hello.jsp -->
<bean id="viewParse" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property> <!-- 前缀 -->
<property name="suffix" value=".jsp"></property> <!-- 后缀 -->
</bean>
4.User.java
邮箱格式的解释:
@之前必须有内容且只能是字母(大小写)、数字、下划线(_)、减号(-)、点(.)
@和最后一个点(.)之间必须有内容且只能是字母(大小写)、数字、点(.)、减号(-),且两个点不能挨着
最后一个点(.)之后必须有内容且内容只能是字母(大小写)、数字且长度为大于等于2个字节,小于等于6个字节
public class User implements Serializable {
@Size(min=1, max=4, message="名字长度需要在1-4之间")
private String name;
@Min(value=4, message="年龄不能小于4岁") //被释放的元素必须是一个数字,其值必须大于等于指定的最小值
private Integer age;
@Email(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "邮箱格式有误")
private String email;
//提供无参数的构造方法
//提供setter和getter方法
//重写toString()方法
}
5.ValidatorController.java
@Controller
public class ValidatorController{
/*
*@Validated(): 当前的参数需要效验
*如果要拿到错误信息,需要增加一个参数BindingResult.
*从该参数中就可以获取它前面的验证数据的错误信息;此参数必须写在@Validated需要验证的参数之后
*/
@RequestMapping("/tv")
public String testValidator(@Validated() User user,BindingResult br){
//获取验证有误参数的个数
int count = br.getErrorCount();
System.out.println("count:" + count);
if(count > 0) {
//获取所有的错误信息
List<ObjectError> list = br.getAllErrors();
for(ObjectError error : list) {
//获取默认的错误信息
System.out.println(error.getDefaultMessage());
}
}
return "register";
}
//该方法是显示错误信息
@RequestMapping("/register")
public String register() {
return "register";
}
}
6.register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 导入spring标签库 -->
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>
<h3>获取错误信息</h3>
<h1>注册界面</h1>
<form action="tv">
用户名: <input type="text" name="name"/><span style="color: red"><form:errors path="user.name"></form:errors></span><br>
年 龄: <input type="text" name="age"/><span style="color: red"><form:errors path="user.age"></form:errors></span><br>
邮 箱: <input type="text" name="email"/><span style="color: red"><form:errors path="user.email"></form:errors></span><br>
<input type="submit" value="提交">
</form>
</body>