Spring MVC(十四)--SpringMVC验证表单

在Spring MVC中提供了验证器能够进行服务端校验,全部的验证都必须先注册校验器,不过校验器也是Spring MVC自动加载的,在使用Spring MVC校验器以前首先要下载相关的jar包,下面是个人一些jar所对应的maven依赖:java

 1 <!-- 验证器所需的包 -->
 2         <dependency>
 3             <groupId>com.fasterxml</groupId>
 4             <artifactId>classmate</artifactId>
 5             <version>1.4.0</version>
 6         </dependency>
 7 
 8         <dependency>
 9             <groupId>org.jboss.logging</groupId>
10             <artifactId>jboss-logging</artifactId>
11             <version>3.3.2.Final</version>
12         </dependency>
13 
14         <dependency>
15             <groupId>org.hibernate.validator</groupId>
16             <artifactId>hibernate-validator</artifactId>
17             <version>6.0.13.Final</version>
18         </dependency>
19 
20         <dependency>
21             <groupId>javax.validation</groupId>
22             <artifactId>validation-api</artifactId>
23             <version>2.0.1.Final</version>
24         </dependency>

其中:spring

  • validator-api-*:提供关于验证注解的;
  • hibernate-validator-*:是经过hibernate校验规则的包,他还要依赖classmate和jboss-logging这两个包;

Spring MVC中有两种校验方式,一种是使用JSR 303注解验证输入内容,另外一种是使用校验器。数据库

1、使用JSR 303注解验证输入内容api

spring提供了对bean的校验功能,经过注解@Valid代表对哪一个Bean须要启用注解式校验。这种方式能够用来对字段进行非空、合法性等的校验,它还提供了一些校验规则约束:app

Bean Validate中提供的约束有如下几种:maven

Hibernate中也提供了一些约束:ide

具体内容可参考这个网站:post

https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/测试

2、使用校验器网站

有时候除了合法性校验以外,还须要进行一些业务逻辑校验,好比用户名不能重复等,这就须要使用校验器来完成。使用校验器须要进行两步操做:

一、完成校验器:SpringMVC提供了一个validator接口,咱们只要实现这个接口中的方法便可;

二、绑定到控制器:建立完了校验器以后要告诉容器须要校验哪一个控制器,因此须要将校验器和控制器绑定,绑定的方法很简单,就是在控制器中写一个方法并使用注解@InitBinder便可。

下面结合这两种校验方式写一个例子说明。

三 、实例

一、建立一个表单

这个表单用来输入一些信息

<form id="paramForm" action="<%=basePath%>customer/addCustomer"
                method="post">
                <table>
                    <tr>
                        <td>用户名:</td>
                        <td><input type="text" name="cusName" id="input_cus_name"
                            value=""></td>
                    </tr>
                    <tr>
                        <td>用户年龄:</td>
                        <td><input type="text" name="cusAge" id="input_cus_age"
                            value=""></td>
                    </tr>
                    <tr>
                        <td>用户性别:</td>
                        <td><label for="input_cus_sex1"></label><input type="radio"
                            name="cusSex" id="input_cus_sex1" value="1"><label
                            for="input_cus_sex0"></label><input type="radio" name="cusSex"
                            id="input_cus_sex0" value="0"></td>
                    </tr>
                    <tr>
                        <td>手机号码:</td>
                        <td><input type="text" name="cusPhone" id="input_cus_phone"
                            value=""></td>
                    </tr>
                    <tr>
                        <td>邮箱地址:</td>
                        <td><input type="text" name="cusEmail" id="input_cus_email"
                            value=""></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td style="text-align: right;"><input type="submit"
                            value="提交" id="addCustomer"></td>
                    </tr>
                </table>
            </form>

由于向后台传的是个pojo对象,因此name名称要和pojo对象属性保持一致。

二、建立表单中数据对应的pojo,并使用JSR 303校验字段

public class Customer {
    private Integer cusId;

    @NonNull @Pattern(regexp = "^([a-zA-Z]*[0-9_-]*$)", message = "只能包含字母、数字、下划线,且不能以数字或下划线开头") @Size(min = 8, max = 128) private String cusName;

    @NotNull @Min(18) @Max(40) private Integer cusAge;

    @NotNull private Integer cusSex;

    @NotNull @Size(min = 6, max = 11) @Pattern(regexp = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$", message = "请输入正确的手机号") private String cusPhone;

    @NotNull @Size(min = 10, max = 20) @Pattern(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$", message = "请输入正确的电子邮箱") private String cusEmail;

    public Integer getCusId() {
        return cusId;
    }

    public void setCusId(Integer cusId) {
        this.cusId = cusId;
    }

    public String getCusName() {
        return cusName;
    }

    public void setCusName(String cusName) {
        this.cusName = cusName == null ? null : cusName.trim();
    }

    public Integer getCusAge() {
        return cusAge;
    }

    public void setCusAge(Integer cusAge) {
        this.cusAge = cusAge;
    }

    public Integer getCusSex() {
        return cusSex;
    }

    public void setCusSex(Integer cusSex) {
        this.cusSex = cusSex;
    }

    public String getCusPhone() {
        return cusPhone;
    }

    public void setCusPhone(String cusPhone) {
        this.cusPhone = cusPhone == null ? null : cusPhone.trim();
    }

    public String getCusEmail() {
        return cusEmail;
    }

    public void setCusEmail(String cusEmail) {
        this.cusEmail = cusEmail == null ? null : cusEmail.trim();
    }
}

上面红色加粗的部分就是使用JSR 303中的约束规则。

三、建立校验器

这个校验器用来判断输入的用户名是否是Administrator,若是是则校验不经过,并给出提示,不然校验成功;

public class CustomerValidator implements Validator {
/**
     * 检验验证对象是否是Customer类,若是是则进行检验
     */
    @Override
    public boolean supports(Class<?> target) {
        return Customer.class.equals(target);
    }

    /**
     * 校验用户名是否已经存在
     */
    @Override
    public void validate(Object target, Errors errors) {
        Customer customer = (Customer) target;
        String name = customer.getCusName();
        if (name.equals("Administrator")) {
            errors.rejectValue("cusName", null, "该帐号已被使用!");

        }
    }

}

建立校验器时只要实现Validator接口并重写对应的方法便可,supports方法是用来断定要校验的bean类型,validate方法用来完成校验逻辑。

四、建立控制器

@Controller
@RequestMapping("/customer")
public class CustomerController {

    @Autowired
    @Qualifier("customerService")
    CustomerService customerServiceImpl = null;

    /**
     * 绑定验证器
     * 
     * @param dataBinder
     */ @InitBinder public void bindValidator(DataBinder dataBinder) {
        dataBinder.setValidator(new CustomerValidator());
    }

    /**
     * customer首页
     * 
     * @param mv
     * @param customer
     * @return
     */
    @RequestMapping("index")
    public ModelAndView indexCustomer(ModelAndView mv, Customer customer) {
        mv.addObject("customer", customer);
        mv.setViewName("index");
        mv.addObject("customer", customer);
        return mv;
    }

    @RequestMapping(value = "addCustomer", method = RequestMethod.POST)
    public ModelAndView validByAnnotation(@Valid Customer customer, Errors errors,
            RedirectAttributes redirectAttributes) {
        ModelAndView mv = new ModelAndView();
        // 判断是否存在错误
        if (errors.hasErrors()) {
            List<FieldError> errorList = errors.getFieldErrors();
            for (FieldError fieldError : errorList) {
                System.out.println("field:" + fieldError.getField() + ";errors:" + fieldError.getDefaultMessage());
            }
            mv.addObject("errorList", errorList);
            mv.setView(new MappingJackson2JsonView());
        } else {
            boolean insert = customerServiceImpl.addCustomer(customer);
            redirectAttributes.addFlashAttribute("customer", customer);
            if (insert) {
                mv.setViewName("redirect:./customer/index");
            } else {
                mv.setViewName("redirect:./customer/error");
            }
        }
        return mv;
    }

    /**
     * 出错页面
     * 
     * @param mv
     * @param customer
     * @return
     */
    @RequestMapping("error")
    public ModelAndView errorInfo(ModelAndView mv, Customer customer) {
        mv.addObject("customer", customer);
        mv.setViewName("customer/error");
        return mv;
    }

}

这个控制器逻辑以下:

  • 首先在方法bindValidator上使用注解@InitBinder完成校验器和控制器的绑定;
  • 而后使用注解@Valid对Customer进行校验,这样校验器中就能经过第一个方法的判断;
  • 经过Error对象判断是否是有错误,若是有错误表明校验失败,失败后打印出失败的信息并返回JDON视图;
  • 若是校验成功则将数据保存在数据库,保存时也判断是否成功,保存成功则返回index页面,不然返回error页面

五、测试

先来测试JSR 303的校验,首先在页面输入如下信息,输入信息都是不经过校验的:

返回信息以下:

其实就是校验失败的提示信息,我是直接返回JSON视图的,因此说明JSR 303校验生效了。下面输入一些合法数据进行测试:

点击提交以后的结果以下:

保存成功并进入index页面,校验成功。

下面测试校验器功能,须要释放绑定逻辑,输入如下正确信息,并让用户名为Administrator

 

提交以后的结果以下:

从提示信息看出校验器校验没用经过并给出提示信息,说明校验经过了。

以上就是Spring MVC中对表单进行服务端校验的内容。

相关文章
相关标签/搜索