在平时浏览网页,游戏的注册登录等等,我们都会发现不是随便输入就可以通过验证的,比如用户名只能字母和数字,密码长度不够等等,这些都是表单校验,在你输入请求的时候就在客户端验证,这样减轻了服务器端的任务。表单校验顾名思义就是对输入表单中的数据进行校验,如果符合要求的输入格式才可以进入下一步工作。在项目开发中,几乎每一个项目都会涉及到类似操作,用户注册登录、填写一些表单数据等等,为了让用户有一个良好的用户体验,但是又不能让用户随意的输入一些非法的数据和不符合要求的数据,这时程序就有必要对用户输入的一系列参数进行校验,校验分为前端校验和后端校验,如果仅仅只有前端校验的话,如果浏览器设置了禁用js,那么所有的js代码都会失效,对应的校验代码也会失效,所以后端的校验是很有必要的,Hibernate Validator 中提供了一系列校验的封装注解。所以接下来我们学习一下springmvc中的表单校验。
常用的校验规则:
最常用的几种校验规则:
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotBlank(message =“不能为空”) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
@Pattern(regex=) 被注释的元素必须符合指定的正则表达式
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@NotNull 被注释的元素必须不为 null ( 这里注意如果没有写内容为空,但是不为null )
还有一些不太常用的规则:
@Null 被注释的元素必须为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
下面通过一个案例来简单的学习一下表单的校验。
开发步骤:
1、由于用到了 Hibernate Validator 第三方的东西,我们需要导入必须的jar包
2、在springmvc.xml配置文件中添加下面内容:
<mvc:annotation-driven />
3、编写jsp发送请求
4、编写转发器类,然后处理请求,将用户的信息存在域对象中去
5、通过form标签库获取数据,将数据显示在form表单中
6、然后发送请求,这一次请求发送先要经过转发器类,我们对表单中的数据进行校验,如果全部通过,符合要求,我们才跳转,否则回显到表单也,而且将错误信息回显在表单中。
下面贴上自己案例的代码:
同样对于配置文件springmvc.xml和web.xml没有任何改变,只是添加了一个小信息,上面有提到
java代码:
Admin.java
package com.yxc.domain;
import java.util.Date;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
/**
* 一个管理员类
* 通过这个实体,注解实现springmvc的表单的校验
*<p>title:</p>
*TODO
* @author yxc
*2019年9月22日下午7:06:17
*/
public class Admin {
@NotBlank(message="用户名不能为空")
@Length(min=6,max=13,message="用户名必须在6到13位之间")
private String username;
@NotBlank(message="密码不能为空")
private String password;
@Email(message="邮箱格式不正确")
private String email;
@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "请输入正确的手机号格式")
private String teltphone;
@Range(min=0,max=200,message="请输入合法的年龄范围")
private int age;
private String sex;
@Past(message="请输入正确的时间")
private Date date;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTeltphone() {
return teltphone;
}
public void setTeltphone(String teltphone) {
this.teltphone = teltphone;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "Admin [username=" + username + ", password=" + password + ", email=" + email + ", teltphone="
+ teltphone + ", age=" + age + ", sex=" + sex + ", date=" + date + "]";
}
}
Mycontroller.java
package com.yxc.web;
import java.util.Date;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import com.yxc.domain.Admin;
/**
* 表单的检验
*<p>title:</p>
*TODO
* @author yxc
*2019年9月23日下午3:12:53
*/
@Controller
public class MyController1 {
@RequestMapping("update1")
public String checkFrom(Model model) {
//创建对象,然后对对象进行赋值
Admin admin=new Admin();
admin.setUsername("从心开始");
admin.setPassword("123456789");
admin.setAge(23);
admin.setSex("男");
admin.setDate(new Date());
admin.setEmail("[email protected]");
admin.setTeltphone("17369320451");
model.addAttribute(admin);
return "/update.jsp";
}
@RequestMapping("update2")
public String check(@Valid Admin admin,BindingResult result) {
//这里有一个注解,用它来实现指定那个实体类中需要校验的
//BindingResult results是对结果的处理,可以获取不和要求的个数以及信息
System.out.println(admin);
//这边结果处理,如果有错误才会处理,没有处理直接进行更新操作
if(result.getErrorCount()!=0) {
//如果校验有错误 就将所有的错误获取到,然后提示用户
// List<FieldError> fieldErrors = result.getFieldErrors();
// for (FieldError fieldError : fieldErrors) {
// System.out.println(fieldError.getDefaultMessage());
// }
return "/update.jsp";
}
return "/success1.jsp";
}
}
三个jsp页面:
request.jsp(发送请求)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>发送请求</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/update1.action" target="_blank" rel="external nofollow" >更新数据</a>
</body>
</html>
update.jsp(通过form标签库的使用获取数据)
这里面还有一个就是<fm:errors path=“username” cssStyle=“Color:red”></fm:errors>这其实就是将出错的信息回显到表单中,并且字体变红
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入标签库-->
<%@taglib uri="http://www.springframework.org/tags/form" prefix="fm" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>跟新用户信息</title>
</head>
<body>
<fm:form modelAttribute="admin" action="${pageContext.request.contextPath }/update2.action" method="put">
用户名:<fm:input path="username"/><fm:errors path="username" cssStyle="Color:red"></fm:errors><br><br>
密码:<fm:password path="password" value="${admin.password}"/><fm:errors path="password" cssStyle="Color:red"></fm:errors><br><br>
年龄:<fm:input path="age"/><fm:errors path="age" cssStyle="Color:red"></fm:errors><br><br>
性别:<fm:input path="sex"/><fm:errors path="sex" cssStyle="Color:red"></fm:errors><br><br>
电话:<fm:input path="teltphone"/><fm:errors path="teltphone" cssStyle="Color:red"></fm:errors><br><br>
邮箱:<fm:input path="email"/><fm:errors path="email" cssStyle="Color:red"></fm:errors><br><br>
日期:<fm:input path="date"/><fm:errors path="date" cssStyle="Color:red"></fm:errors><br><br>
<input type="submit" value="更新">
</fm:form>
</body>
</html>
success1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>更新成功</h2>
</body>
</html>
在上面的代码中,对于手机号码的验证还出现一个有意思的东西
“^1(3|4|5|7|8)\d{9}$” 正则表达式,要求我们输入的数字必须是1开头,而且第二位只能是34578中的任意一个,然后后面九位都必须是0到9的数字组成。
表单的验证其实是一个很常用的应用,所以掌握简单的使用可以帮助我们提高开发的效率。
下面一张图是部分出错提示: