SpringMVC Validator 검증 예제

14531 단어 SpringMVCValidator
SpringMVC 서버 검증 중 하 나 는 두 가지 방식 이 있 는데 하 나 는 Validator 인 터 페 이 스 를 바탕 으로 하 는 것 이 고 하 나 는 Annotation JSR-303 기준 을 사용 하 는 검증 이다.다음은 주로 이 두 가 지 를 배 우 는 것 이다.작업 중 에 후 자 를 추천 하고 편리 하 다.
1.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>

2.Annotation JSR-303 표준 검증 사용
이 가방 을 사용 하려 면 JSR-303 표준 을 지원 하 는 가방 을 가 져 와 야 합 니 다.hibenate Validator 이 가방 을 사용 하 는 것 을 권장 합 니 다.이 표준 의 원생 표 시 를 먼저 보 세 요.
제한 하 다.
설명 하 다.
@Null
null 로 만 제한
@NotNull
null
@AssertFalse
false 로 제한
@AssertTrue
트 루 로 제한
@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 주해 의 vaidatedBy 속성 은 우리 가 정의 하 는 현재 제한 형식 을 지정 할 때 어떤 ConstraintValidator 에 의 해 검증 되 어야 하 는 지 를 지정 하 는 데 사 용 됩 니 다.위 코드 에서 Money 제한 유형 을 지정 한 검사 류 는 Money Validator 입 니 다.또한 주의해 야 할 것 은 우리 가 자신의 제한 유형의 주 해 를 정의 할 때 세 가지 속성 이 반드시 정의 되 어야 한 다 는 것 이다.예 를 들 어 상기 코드 에 표 시 된 message,groups 와 payload 속성 이다.
제한 유형 Money 를 정의 한 다음 에 우리 의 제한 유형 검사 류 Money Validator 를 정의 합 니 다.형식 검사 클래스 를 제한 하려 면 인터페이스 javax.vaidation.constraintValidator 를 실현 하고 initialize 와 isValid 방법 을 실현 해 야 합 니 다.Money Validator 의 코드 예 시 를 살 펴 보 겠 습 니 다.

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();
  }

}

위의 코드 에서 우 리 는 Constraint Validator 가 범 형 을 사용 한 것 을 볼 수 있다.이것 은 모두 두 가지 유형 을 지정 해 야 합 니 다.첫 번 째 유형 은 대응 하 는 initialize 방법의 매개 변수 유형 이 고 두 번 째 유형 은 대응 하 는 isValid 방법의 첫 번 째 매개 변수 유형 입 니 다.위의 두 가지 방법 을 통 해 알 수 있 듯 이 isValid 방법 은 검 사 를 하 는 데 사 용 됩 니 다.가끔 은 우리 가 검 사 를 하 는 과정 에서 현재 의 제한 유형의 속성 을 취하 여 검 사 를 해 야 합 니 다.예 를 들 어 우리 가@Min 제한 유형 을 검사 할 때 우 리 는 그 value 속성 을 통 해 현재 검사 유형 정의 의 최소 값 을 가 져 와 야 합 니 다.현재 제한 유형 Money 를 가 져 올 수 없 는 isValid 방법 을 볼 수 있 습 니 다.이 럴 때 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 인증 에 맞 추기
최근 에 쓴 프로젝트 는 vaidator 를 직접 사용 하 는 것 이 좋 지 않 습 니 다.주로 돌아 갈 때 전체 페이지 를 새로 고 쳐 야 오류 정보 가 나 옵 니 다.체험 이 상당히 좋 지 않 습 니 다.검증 은 ajax 로 체험 하 는 것 이 좋 습 니 다.그래서 ajax 와 함께 하 는 것 이 좋 습 니 다.
사고:검증 은 springMVC 를 사용 하여 검증 합 니 다.다만 이번에 오 류 를 발견 하면 오 류 를 꺼 내 map 에 저장 한 다음 ajax 가 돌아 갑 니 다.페이지 는 ajax 반환 값 에 따라 판단 하여 서로 다른 정 보 를 표시 합 니 다.
주 코드:

 if (br.hasErrors()){//       
       //         ,   ,    map   
      br.getFieldErrors().forEach(p->{
        maps.put(p.getField(),p.getDefaultMessage());
      });
      return maps;
    }
이렇게 되면 maps 에 저 장 된 것 은 오류 변수 이름,오류 정보 입 니 다.예 를 들 어 username-'사용자 이름 이 비어 있 으 면 안 됩 니 다'입 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기