您的位置:首页 > 编程语言 > Java开发

SSM框架笔记14:Spring MVC表单验证

2018-02-21 22:01 429 查看
Spring MVC表单验证
在Spring MVC中,表单验证有三种方法。
一、基本校验这种方法是基于handler的,优点是定义方便,缺点是不便于复用。1、两个接口:Errors/BindingResult,用来保存绑定错误信息。2、两个方法:errors.reject() / errors.rejectValue(),用来注册全局/字段级别的错误信息3、一个标签: <form:errors path=”*” />
案例演示:利用控制器实现表单校验


1、用户实体User
package net.hw.spring.bean;

import java.util.Date;

public class User {
private int id;
private String username;
private String password;
private String telephone;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

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 getTelephone() {
return telephone;
}

public void setTelephone(String telephone) {
this.telephone = telephone;
}

@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", telephone='" + telephone + '\'' +
'}';
}
}
2、起始页面index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表单校验案例</title>
</head>
<body>
<h3>表单校验案例</h3>
<ol>
<li><a href="/user/toRegister">注册</a></li>
</ol>
</body>
</html>
3、注册页面register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>注册</title>
<script type="text/javascript">
function clearUsernameError() {
var usernameError = document.getElementById("usernameError");
usernameError.innerHTML = "";
}

function clearPasswordError() {
var passwordError = document.getElementById("passwordError");
passwordError.innerHTML = "";
}

function clearTelephoneError() {
var telephoneError = document.getElementById("telephoneError");
telephoneError.innerHTML = "";
}

</script>
</head>
<body>

<form:form action="/user/register" modelAttribute="user">
<table border="0" cellpadding="5">
<tr align="center">
<td colspan="2"><h3>用户注册</h3></td>
</tr>
<tr>
<td>用户名:</td>
<td>
<form:input path="username" onfocus="clearUsernameError()"/>
</td>
<td>
<span id="usernameError"><form:errors path="username" cssClass="error" cssStyle="color:red"/></span>
</td>
</tr>
<tr>
<td>密码:</td>
<td>
<form:input path="password" type="password" onfocus="clearPasswordError()"/>
</td>
<td>
<span id="passwordError"><form:errors path="password" cssClass="error" cssStyle="color:red"/></span>
</td>
</tr>
<tr>
<td>电话:</td>
<td><form:input path="telephone" onfocus="clearTelephoneError()"/></td>
<td>
<span id="telephoneError"><form:errors path="telephone" cssClass="error" cssStyle="color:red"/></span>
</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="注册"/>
<input type="reset" value="重置"/></td>
</tr>
</table>
</form:form>
</body>
</html>
4、注册成功页面success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册成功</title>
</head>
<body>
<h1>恭喜,注册成功!</h1>
</body>
5、用户控制器UserController
package net.hw.spring.webmvc;

import net.hw.spring.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
* Created by howard on 2017/3/29.
*/
@Controller
@RequestMapping("/user")
public class UserController {

@RequestMapping("/toRegister")
public ModelAndView toRegister() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("register");
modelAndView.addObject(new User());
return modelAndView;
}

@RequestMapping("/register")
public String register(User user, Errors errors) {
String username = user.getUsername();
String password = user.getPassword();
String telephone = user.getTelephone();

if (username == null || username.equals("")) {
errors.rejectValue("username", "1", "用户名不能为空");
}

if (password.length() < 6) {
errors.rejectValue("password", "2", "密码不能少于6位");
}

if (!telephone.matches("^1[3|4|5|7|8][0-9]{9}$")) {
errors.rejectValue("telephone", "3", "不合法手机号码");
}

// 校验有错,返回注册页面
if (errors.hasErrors()) {
return "register";
}

// 校验无错,返回成功页面
return "success";
}
}
6、启动服务器,查看运行效果




输入不合法数据,单击注册按钮:


输入合法数据,单击注册按钮:


二、自定义验证器1、实现Validator接口,定义用户验证器UserValidator


package net.hw.spring.validator;

import net.hw.spring.bean.User;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

/**
* Created by howard on 2017/3/30.
*/
public class UserValidator implements Validator{

/**
* 设置校验类
*
* @param clazz
* @return
*/
public boolean supports(Class<?> clazz) {
return clazz.equals(User.class);
}

/**
* 设置校验逻辑
*
* @param target
* @param errors
*/
public void validate(Object target, Errors errors) {
User user = (User) target;
String username = user.getUsername();
String password = user.getPassword();
String telephone = user.getTelephone();

if (username == null || username.equals("")) {
errors.rejectValue("username", "1", "用户名不能为空");
}

if (password.length() < 6) {
errors.rejectValue("password", "1", "密码不能少于6位");
}

if (!telephone.matches("^1[3|4|5|7|8][0-9]{9}$")) {
errors.rejectValue("telephone", "1", "不合法手机号码");
}
}
}
2、注册用户校验器方法一:在控制器里注册

方法二、在Spring MVC配置文件里注册
<mvc:annotation-driven validator="userValidator" />
<bean name="userValidator" class="net.hw.spring.validator.UserValidator" />
3、修改index.jsp页面


4、创建addUser.jsp页面


5、在AddController里添加处理方法
package net.hw.spring.webmvc;

import net.hw.spring.bean.User;
import net.hw.spring.validator.UserValidator;
import org.springframework.stereotype.Controller;
import org.springframework.validation.DataBinder;
import org.springframework.validation.Errors;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

/**
* Created by howard on 2017/3/30.
*/
@Controller
@RequestMapping("/add")
public class AddController {
@InitBinder
protected void init (DataBinder binder) {
binder.setValidator(new UserValidator());
}

@RequestMapping("/toAddUser")
public ModelAndView toAddUser() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("addUser");
modelAndView.addObject(new User());
return modelAndView;
}

@RequestMapping("/addUser")
public String addUser(@Validated User user, Errors errors) {
// 校验有错,返回添加用户页面
if (errors.hasErrors()) {
return "addUser";
}
// 校验无错,返回成功页面
return "success";
}
}
注意:在addUser方法,对于要校验的参数加上@Validated注解符。6、启动服务器,查看运行效果

三、JSR-303 风格校验JSR-303 是 Java 官方推出的一套 Validation 接口,Hibernate 给出了一个完整实现。
1、在pom.xml文件里引入JavaBean校验与Hibernate校验器
<!--JavaBean校验-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>

<!--Hibernate校验器-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.1.Final</version>
</dependency>
2、在实体类属性上添加注解设置验证逻辑
package net.hw.spring.bean;

import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;

/**
* Created by howard on 2017/3/30.
*/
public class Person {
@NotBlank(message = "姓名不能为空")
private String name;
@Range(min = 10, max = 100, message = "年龄超出范围")
private int age;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
3、在Spring MVC配置文件里添加注解驱动元素
<mvc:annotation-driven/>
4、在控制器里给校验参数添加@Valid注解
package net.hw.spring.webmvc;

import net.hw.spring.bean.Person;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.validation.Valid;

/**
* Created by howard on 2017/3/30.
*/
@Controller
@RequestMapping("person")
public class PersonController {

@RequestMapping("/toAddPerson")
public ModelAndView toAddPerson() {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("addPerson");
modelAndView.addObject(new Person());
return modelAndView;
}

@RequestMapping("/addPerson")
public String addPerson(@Valid Person person, Errors errors) {
// 校验有错,返回添加人员页面
if (errors.hasErrors()) {
return "addPerson";
}
// 校验无错,返回成功页面
return "success";
}
}
5、修改起始页面index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>表单校验案例</title>
</head>
<body>
<h3>表单校验案例</h3>
<ol>
<li><a href="/user/toRegister">注册</a></li>
<li><a href="/add/toAddUser">添加用户</a></li>
<li><a href="/person/toAddPerson">添加人员</a></li>
</ol>
</body>
</html>
6、创建addPerson.jsp页面


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>添加人员</title>
<script type="text/javascript">
function clearNameError() {
var nameError = document.getElementById("nameError");
nameError.innerHTML = "";
}

function clearAgeError() {
var ageError = document.getElementById("ageError");
ageError.innerHTML = "";
}

</script>
</head>
<body>

<form:form action="/person/addPerson" modelAttribute="person">
<table border="0" cellpadding="5">
<tr align="center">
<td colspan="2"><h3>添加人员</h3></td>
</tr>
<tr>
<td>姓名:</td>
<td>
<form:input path="name" onfocus="clearNameError()"/>
</td>
<td>
<span id="nameError"><form:errors path="name" cssClass="error" cssStyle="color:red"/></span>
</td>
</tr>
<tr>
<td>年龄:</td>
<td>
<form:input type="number" path="age" onfocus="clearAgeError()"/>
</td>
<td>
<span id="ageError"><form:errors path="age" cssClass="error" cssStyle="color:red"/></span>
</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" value="添加"/>
<input type="reset" value="重置"/></td>
</tr>
</table>
</form:form>
</body>
</html>
7、启动服务器,查看运行结果


验证框中@NotEmpty、@NotBlank、@NotNull乍一看还是容易弄混的。@NotEmpty 用在集合类上面(不能为null或者长度为0)@NotBlank 用在String上面(忽略尾部空格,纯空格字符串认为是Blank的)@NotNull 用在基本类型上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: