天天看点

springmvc中的表单校验

在平时浏览网页,游戏的注册登录等等,我们都会发现不是随便输入就可以通过验证的,比如用户名只能字母和数字,密码长度不够等等,这些都是表单校验,在你输入请求的时候就在客户端验证,这样减轻了服务器端的任务。表单校验顾名思义就是对输入表单中的数据进行校验,如果符合要求的输入格式才可以进入下一步工作。在项目开发中,几乎每一个项目都会涉及到类似操作,用户注册登录、填写一些表单数据等等,为了让用户有一个良好的用户体验,但是又不能让用户随意的输入一些非法的数据和不符合要求的数据,这时程序就有必要对用户输入的一系列参数进行校验,校验分为前端校验和后端校验,如果仅仅只有前端校验的话,如果浏览器设置了禁用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包

springmvc中的表单校验

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的数字组成。

表单的验证其实是一个很常用的应用,所以掌握简单的使用可以帮助我们提高开发的效率。

下面一张图是部分出错提示:

springmvc中的表单校验