错误数据进入系统是要被限制的,比如本来是工资,却输入了“abc”;本来是人的年龄,却输入了12000。凡此种种都会降低系统的稳定性。本节将阐述springmvc中的数据校验。
1、环境约束
- win10 64位操作系统
- idea2018.1.5
- jdk-8u162-windows-x64
- spring4.2.4
2、前提约束
- 完成基于注解的springmvc的demo https://www.jianshu.com/p/d1a84f07c98f
3、操作步骤
- 在pom.xml中加入依赖
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
- 在spring-mvc.xml加入以下内容:
<mvc:annotation-driven validator="validator" ></mvc:annotation-driven>
<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>
- 在src文件夹下创建validatemessages.properties【错误提示信息所在文件,与代码解耦合】,内容如下:
account.length.notsuit=the lenght of account is not required!!
- 在src文件下创建net.wanho.entity.User.java
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private int id;
@Length(min=4,max = 10,message = "{account.length.notsuit}")
private String name;
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date date;
public User(int id, String name) {
this.id = id;
this.name = name;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
public void setName(String name) {
this.name = name;
}
}
- 在src文件夹下创建net.wanho.controller.ValidateController.java,内容如下:
import com.alibaba.fastjson.JSONObject;
import net.wanho.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
@Controller
public class ValidateController {
@RequestMapping("/validate/test1")
public ModelAndView test1(@Valid User user, BindingResult bindingResult) {
List<String> errorList = new ArrayList<>();
ModelAndView modelAndView = new ModelAndView();
if (bindingResult.hasErrors()) {//有问题
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errorList.add(fieldError.getDefaultMessage());
}
modelAndView.setViewName("error");
modelAndView.addObject("error", errorList);
return modelAndView;
} else {
//正确逻辑往下走
modelAndView.setViewName("success");
}
return modelAndView;
}
@RequestMapping("/validate/test2")
@ResponseBody
public JSONObject foo1(@Valid User user , BindingResult bindingResult) {
JSONObject jsonObject = new JSONObject();
List<String> errorList = new ArrayList<>();
if(bindingResult.hasErrors()){
for (FieldError fieldError : bindingResult.getFieldErrors()) {
errorList.add(fieldError.getDefaultMessage());
}
jsonObject.put("status",400);
jsonObject.put("errors",errorList);
return jsonObject;
}
jsonObject.put("status",200);
return jsonObject;
}
}
- 在web文件夹下创建testvalidate.jsp【错误信息显示到了新的页面】,内容如下:
<%--
Created by IntelliJ IDEA.
User: zhangli
Date: 2019/11/13
Time: 11:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/validate/test1" method="get" id="myform">
<input type="text" value="ali" name="name" />
<input type="submit" value="提交" />
</form>
</body>
</html>
- 在web文件夹下创建testvalidate.html【错误信息通过ajax回调函数显示到本页面】,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="jquery-1.10.2.js"></script>
<script type="text/javascript" >
function validate(){
$.ajax({
data:{name:$("#name").val()},
dataType:"json",
type:"get",
url:"/validate/test2",
success:function (data) {
if(data.status=='400')
{
$("#errormsg").html(data.errors)
}
}
})
}
</script>
</head>
<body>
<input type="text" value="ali" name="name" id="name" />
<div id="errormsg" style="color: red"></div>
<input type="button" onclick="validate()" value="提交" />
</body>
</html>
- 在WEB-INF/page/文件夹下创建error.jsp,内容如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${error}
</body>
</html>
- 启动tomcat,在浏览器中分别输入:
http://localhost:8080/testvalidate.jsp
http://localhost:8080/testvalidate.html
以上就是springmvc中的数据校验。