程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SpringMVC Validator驗證示例

SpringMVC Validator驗證示例

編輯:關於JAVA

SpringMVC Validator驗證示例。本站提示廣大學習愛好者:(SpringMVC Validator驗證示例)文章只能為提供參考,不一定能成為您想要的結果。以下是SpringMVC Validator驗證示例正文


SpringMVC服務器驗證一種是有兩種方式,一種是基於Validator接口,一種是運用Annotaion JSR-303規范的驗證,上面次要是學習這兩種,任務中引薦後者,方便很多

一.基於Validator接口的驗證.

首先創立User實例,並參加幾個屬性

public class User {
  private String username;
  private String password;
  private String nickname;

  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 getNickname() {
    return nickname;
  }

  public void setNickname(String nickname) {
    this.nickname = nickname;
  }

  @Override
  public String toString() {
    return "username--"+username+"password--"+password+"nickname--"+nickname;
  }
}

接著創立用於校檢的類UserValidator,讓其完成Validator,掩蓋其中的兩個辦法

import main.java.model.User;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

public class UserValidator implements Validator {


  @Override
  public boolean supports(Class<?> aClass) {
    //判別能否是要校驗的類,這裡是User
    return User.class.equals(aClass);
  }

  @Override
  public void validate(Object o, Errors errors) {
    User u = (User) o;
    if (null == u.getPassword() || "".equals(u.getPassword())){
      //此辦法可以加四個參數,第一個表單域field,
      //區分是哪個表單出錯,第二個errorCode錯誤碼,
      //第三個制定了資源文件中占位符,第四個詳細錯誤前往信息
      //簡寫版可以把2,3參數去掉
      errors.rejectValue("password",null,null,"password is null");
    }
  }
}

下面的類只完成了對密碼判別能否為空,為空則注冊這一錯誤信息,也就是”password is null”,接上去要完成控制器,控制器要做的事情,第一是注冊這個校驗器,第二是完成校驗.

import main.java.model.User;
......

/**
 * 加上@Controller決議這個類是一個控制器
 */
@Controller
@RequestMapping("/user")
public class HelloController {

  //我們知道在Controller類中經過@InitBinder標志的辦法只要在懇求以後Controller的時分才會被執行
  //所以在這裡注冊校驗器
  @InitBinder
  public void initBainder(DataBinder binder){
    binder.replaceValidators(new UserValidator());

  }
  //這個辦法次要是跳轉到登錄頁面
  @RequestMapping(value = "/login",method = RequestMethod.GET)
  public String login(Model model){
    model.addAttribute(new User());
    return "user/login";
  }
  //處置登錄表單
  @RequestMapping(value = "/login",method = RequestMethod.POST)
  public String login(@Validated User user, BindingResult br){

    if (br.hasErrors()){
      return "user/login";
    }
    return "--";
  }
  }

下面代碼可以看到@Validated User user, BindingResult br這兩個參數,@Validated標明參數user是要校驗的類,BindingResult是存儲錯誤信息的類,兩者必需逐個對應,並且地位挨著,不能兩頭有其他參數,

最後隨意寫一個jsp頁面完成校檢

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<%
  request.setCharacterEncoding("utf-8");
%>
<html>
<head>
  <meta charset="utf-8">
  <title>用戶登錄</title>
</head>
<body>
  <sf:form modelAttribute="user" method="post">
    用戶名:<sf:input path="username"/><sf:errors path="username"/>
    <br>
    密碼:<sf:input path="password"/><sf:errors path="password"/>
    <br>
    昵稱:<sf:input path="nickname"/><sf:errors path="nickname"/>
    <br>
    <input type="submit" value="提交">
  </sf:form>
</body>
</html>

這裡寫圖片描述

後面完成的是部分校驗,只對以後控制器無效,假如要完成全局校驗的話需求配置springMVC.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/context
   http://www.springframework.org/schema/context/spring-context-3.0.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

  <mvc:annotation-driven validator="userValidator"/>

  <bean id="userValidator" class="com.xxx.xxx.UserValidator"/>

  ...
</beans>

二.運用Annotaion JSR-303規范的驗證

運用這個需求導入支持JSR-303規范的包,建議運用hibernate Validator這個包,先看這個規范的原生標注


限制 闡明 @Null 限制只能為null @NotNull 限制必需不為null @AssertFalse 限制必需為false @AssertTrue 限制必需為true @DecimalMax(value) 限制必需為一個不大於指定值的數字 @DecimalMin(value) 限制必需為一個不小於指定值的數字 @Digits(integer,fraction) 限制必需為一個小數,且整數局部的位數不能超越integer,小數局部的位數不能超越fraction @Future 限制必需是一個未來的日期 @Max(value) 限制必需為一個不大於指定值的數字 @Min(value) 限制必需為一個不小於指定值的數字 @Past 限制必需是一個過來的日期 @Pattern(value) 限制必需契合指定的正則表達式 @Size(max,min) 限制字符長度必需在min到max之間 @Past 驗證注解的元素值(日期類型)比以後時間早 @NotEmpty 驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) @NotBlank 驗證注解的元素值不為空(不為null、去除首位空格後長度為0),不同於@NotEmpty,@NotBlank只使用於字符串且在比擬時會去除字符串的空格 @Email 驗證注解的元素值是Email,也可以經過正則表達式和flag指定自定義的email格式

要運用很復雜,在需求驗證的變量後面加上該Annotation即可,看上面運用後的User

public class User {
  @NotEmpty(message = "用戶名不能為空")
  private String username;
  @Size(min=6 ,max= 20 ,message = "密碼長度不契合規范")
  private String password;
  private String nickname;

  ......
}

然後再控制器外面參加驗證就可以了

@Controller
@RequestMapping("/user")
public class HelloController {


  @RequestMapping(value = "/login",method = RequestMethod.GET)
  public String login(Model model){
    model.addAttribute(new User());
    return "user/login";
  }

  @RequestMapping(value = "/login",method = RequestMethod.POST)
  public String login(@Validated User user, BindingResult br){

    if (br.hasErrors()){
      return "user/login";
    }
    return "user/login";
  }
  }

然後jsp頁面還是之前的頁面,驗證效果如下,這種辦法分明復雜多了

這裡寫圖片描述

3.定義自己的Annotation Validator

這局部直接從[大牛][1]那拷貝過去的.

除了JSR-303原生支持的限制類型之外我們還可以定義自己的限制類型。定義自己的限制類型首先我們得定義一個該種限制類型的注解,而且該注解需求運用@Constraint標注。如今假定我們需求定義一個表示金額的限制類型,那麼我們可以這樣定義:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;

import com.xxx.xxx.constraint.impl.MoneyValidator;

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MoneyValidator.class)
public @interface Money {

  String message() default"不是金額方式";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

}

我們可以看到在下面代碼中我們定義了一個Money注解,而且該注解上標注了@Constraint注解,運用@Constraint注解標注標明我們定義了一個用於限制的注解。@Constraint注解的validatedBy屬性用於指定我們定義的以後限制類型需求被哪個ConstraintValidator停止校驗。在下面代碼中我們指定了Money限制類型的校驗類是MoneyValidator。另外需求留意的是我們在定義自己的限制類型的注解時有三個屬性是必需定義的,如下面代碼所示的message、groups和payload屬性。

在定義了限制類型Money之後,接上去就是定義我們的限制類型校驗類MoneyValidator了。限制類型校驗類必需完成接口javax.validation.ConstraintValidator,並完成它的initialize和isValid辦法。我們先來看一下MoneyValidator的代碼示例:

import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import com.xxx.xxx.constraint.Money;

public class MoneyValidator implements ConstraintValidator<Money, Double> {

  private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金額的正則表達式
  private Pattern moneyPattern = Pattern.compile(moneyReg);

  public void initialize(Money money) {
    // TODO Auto-generated method stub

  }

  public boolean isValid(Double value, ConstraintValidatorContext arg1) {
    // TODO Auto-generated method stub
    if (value == null)
      return true;
    return moneyPattern.matcher(value.toString()).matches();
  }

}

從下面代碼中我們可以看到ConstraintValidator是運用了泛型的。它一共需求指定兩品種型,第一個類型是對應的initialize辦法的參數類型,第二個類型是對應的isValid辦法的第一個參數類型。從下面的兩個辦法我們可以看出isValid辦法是用於停止校驗的,有時分我們在校驗的進程中是需求取以後的限制類型的屬性來停止校驗的,比方我們在對@Min限制類型停止校驗的時分我們是需求經過其value屬性獲取到以後校驗類型定義的最小值的,我們可以看到isValid辦法無法獲取到以後的限制類型Money。這個時分initialize辦法的作用就出來了。

我們知道initialize辦法是可以獲取到以後的限制類型的,所以當我們在校驗某種限制類型時需求獲取以後限制類型的某種屬性的時分,我們可以給以後的ConstraintValidator定義對應的屬性,然後在initialize辦法中給該屬性賦值,接上去我們就可以在isValid辦法中運用其對應的屬性了。針關於這種狀況我們來看一個代碼示例,如今假定我要定義自己的@Min限制類型和對應的MinValidator校驗器,那麼我可以如下定義:

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=MinValidator.class)
public @interface Min {

  int value() default 0;

  String message();

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};
}
MinValidator校驗器
public class MinValidator implements ConstraintValidator<Min, Integer> {

  private int minValue;

  public void initialize(Min min) {
    // TODO Auto-generated method stub
    //把Min限制類型的屬性value賦值給以後ConstraintValidator的成員變量minValue
    minValue = min.value();
  }

  public boolean isValid(Integer value, ConstraintValidatorContext arg1) {
    // TODO Auto-generated method stub
    //在這裡我們就可以經過以後ConstraintValidator的成員變量minValue訪問到以後限制類型Min的value屬性了
    return value >= minValue;
  }

}

持續來說一下ConstraintValidator泛型的第二個類型,我們曾經知道它的第二個類型是對應的isValid的辦法的第一個參數,從我給的參數稱號value來看也可以知道isValid辦法的第一個參數正是對應的以後需求校驗的數據的值,而它的類型也正是對應的我們需求校驗的數據的數據類型。這兩者的數據類型必需堅持分歧,否則spring會提示找不到對應數據類型的ConstraintValidator。樹立了自己的限制類型及其對應的ConstraintValidator後,其用法跟規范的JSR-303限制類型是一樣的。以下就是運用了上述自己定義的JSR-303限制類型——Money限制和Min限制的一個實體類:

public class User {

  private int age;

  private Double salary;

  @Min(value=8, message="年齡不能小於8歲")
  public int getAge() {
    return age;
  }

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

  @Money(message="規范的金額方式為xxx.xx")
  public Double getSalary() {
    return salary;
  }

  public void setSalary(Double salary) {
    this.salary = salary;
  }

}

4.配合ajax驗證

最近寫的項目,覺得直接運用validator不太好用,次要是前往時會刷新整個頁面才會出來錯誤信息,體驗相當不好,驗證還是用ajax體驗比擬好,所以配合ajax

思緒:驗證還是運用springMVC來驗證,只是這次發現錯誤的話,把錯誤取出,寄存到一個map中,然後ajax前往,頁面依據ajax前往值來判別,從而顯示不同的信息

次要代碼:

 if (br.hasErrors()){//判別能否有錯誤
       //對錯誤集合停止遍歷,有的話,直接放入map集合中
      br.getFieldErrors().forEach(p->{
        maps.put(p.getField(),p.getDefaultMessage());
      });
      return maps;
    }

這樣的話 maps外面寄存的就是 錯誤變量名,錯誤信息,例如 username -‘用戶名不能為空'

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved