08 数据绑定之校验

错误数据进入系统是要被限制的,比如本来是工资,却输入了“abc”;本来是人的年龄,却输入了12000。凡此种种都会降低系统的稳定性。本节将阐述springmvc中的数据校验。

1、环境约束

  • win10 64位操作系统
  • idea2018.1.5
  • jdk-8u162-windows-x64
  • spring4.2.4

2、前提约束

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>

猜你喜欢

转载自www.cnblogs.com/alichengxuyuan/p/12554619.html
08
今日推荐