springmvc에서 JSR-303을 사용하여 데이터 검증 실례

8187 단어 springmvc검사하다
프로젝트에서 일반적으로 앞부분의 검사를 많이 사용합니다. 예를 들어 페이지에서 js 검사와form 폼은bootstrap 검사를 사용합니다.그러나 안전 요구가 비교적 높은 점은 서비스 측에서 검사를 하는 것을 권장한다.
서버 검증:
  • 제어층 controller: 페이지에서 요청한 매개 변수의 합법성을 검사합니다.서버 제어층 controller 검사에서 클라이언트 형식을 구분하지 않습니다..
  • 업무층 서비스(사용이 비교적 많음): 주요 핵심 업무 파라미터를 검사하고 서비스 인터페이스에서 사용하는 파라미터만 제한합니다..
  • 지구층dao: 일반적으로 검사하지 않습니다.
  • 환경 통합
    1. jar 패키지 추가:
    여기서는 hibernate-validator를 사용하여 구현합니다(버전: hibernate-validator -4.3.0. Final-dist.zip). 아래의jar 패키지를classpath(WEB-INF/lib에 추가하면 됩니다).
  • dist/lib/required/validation-api-1.0.0.GA.jar JSR-303 사양 API 패키지
  • dist/hibernate-validator-4.3.0.Final.jar Hibernate 참조 구현
  • 2,spring 구성에 JSR-303 검증 프레임워크 지원 추가
    
    <!--   -->
     <bean id="messageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
      <!--  -->
      <property name="basenames"> 
       <list> 
       <value>classpath:CustomValidationMessages</value>
       </list> 
      </property>
      <!--   -->
      <property name="fileEncodings" value="utf-8" />
      <!--  ,  -->
      <property name="cacheSeconds" value="120" />
     </bean>
    
    
    
    <!--   -->
     <bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
      <!-- hibernate -->
      <property name="providerClass" value="org.hibernate.validator.HibernateValidator" />
      <!--  , , classpath ValidationMessages.properties -->
      <property name="validationMessageSource" ref="messageSource" />
     </bean>
    
    자동 등록 validator
    
    <mvc:annotation-driven conversion-service="conversionService" validator="validator">
     </mvc:annotation-driven>
    예 설명
    예 1:
    
    import javax.validation.constraints.NotNull; 
    public class UserModel { 
     @NotNull(message="{username.not.empty}") 
     private String username; 
    } 
    @NotNull을 통해 이 username 필드가 비어 있지 않도록 지정합니다. 검증에 실패했을 때 이전에 지정한 messageSource에서'username.not.empty'에 대한 오류 정보를 얻을 수 있습니다. 여기는'{오류 메시지 키값}'형식으로 지정해야만 messageSource에서 얻을 수 있습니다.
    
    @Controller 
    public class HelloWorldController { 
     @RequestMapping("/validate/hello") 
     public String validate(@Valid @ModelAttribute("user") UserModel user, Errors errors) { 
    
      if(errors.hasErrors()) { 
       return "validate/error"; 
      } 
      return "redirect:/success"; 
     } 
    } 
    
    
    명령 객체에 @Valid를 메모하여 Spring MVC에 이 명령 객체는 바인딩이 완료된 후 JSR-303 인증을 수행해야 하며 인증에 실패하면 오류 정보가 errors 오류 객체에 추가됩니다.
    인증 실패 후 표시할 페이지(/WEB-INF/jsp/error.jsp)
    
    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
    <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 
    
    <form:form commandName="user"> 
     <form:errors path="*" cssStyle="color:red"></form:errors><br/> 
    </form:form> 
    
    브라우저 주소 표시줄에 입력http://localhost:8080/validate/hello즉, username 데이터가 없으면 요청 후 검증 실패 인터페이스에 직접 가서 오류 메시지를 표시합니다. "사용자 이름이 비어 있을 수 없습니다."요청할 때 "?username=zhang"을 가지고 있으면 성공 페이지로 바뀝니다.
    예2:
    
    public class Items {
     private Integer id;
     @Size(min=1,max=20,message="{items.name.length.error}")
     private String name;
    
     @NotNull(message="{items.createtime.isNULL}")
     private Date createtime;
    
      set() get()...
    }
    
    
    public String editItemsSubmit(Model model, @Validated Items items, 
    BindingResult bindingResult) throws Exception {
      if(bindingResult.hasErrors()){
       List<ObjectError> allErrors = bindingResult.getAllErrors();
       for(ObjectError objectError:allErrors) {
      System.out.println(objectError.getDefaultMessage());
       }
    
       // model pojo 
       model.addAttribute("items",items);
    
       //  
       return "items/editItems";
      }
      return "success";
     }
    
    
    <table width="100%" border=1>
    <tr>
     <td> </td>
     <td><form:input type="text" path="items.name" value="${items.name }"/></td><form:errors path="items.name"/>
    </tr>
    <tr>
     <td> </td>
     <td><input type="text" name="createtime" value="<fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
    </tr>
    그리고 jsp 페이지는 이전의 페이지입니다. 입력이 합법적이지 않은 것을 표시하고 을 통해 표시할 수 있습니다. 이렇게 하면 더욱 간단합니다.
    messageSource Bean을 구성하면 기본적으로 다음 오류 메시지 키가 검증된 객체에 자동으로 생성됩니다.
  • 오류 주해 단순 클래스 이름 검증.검증 대상 이름.필드 이름
  • 오류 주해 단순 클래스 이름 검증.필드 이름
  • 오류 주해 단순 클래스 이름 검증.필드 형식은 모두 클래스 이름을 한정합니다
  • 오류 주해 단순 클래스 이름 검증
  • 사용 우선 순위는 높음에서 낮음, 즉 맨 앞에 있는 가장 높은 우선 순위가 있고, 상기 모든 기본 오류 메시지 키의 우선 순위가 사용자 정의 오류 메시지 키보다 높습니다.
    테스트 용례와 같이

    public String pattern(@Valid @ModelAttribute(“model”) PatternModel model, Errors errors)
    다음과 같은 오류 메시지 키가 자동으로 발생합니다.
  • Pattern.model.value = 유효성 검사 오류 메모 단순 클래스 이름입니다.검증 대상 이름.필드 이름
  • Pattern.value = 유효성 검사 오류 메모 단순 클래스 이름입니다.필드 이름
  • Pattern.Java.lang.String = 유효성 검사 오류 메모 단순 클래스 이름.필드 형식은 모두 클래스 이름을 한정합니다
  • Pattern = 유효성 검사 오류 메모 단순 클래스 이름
  • 내장된 검증 제약 조건은 다음 표에 나와 있습니다(hibernate validator reference에서 발췌).
    메모 검증
    검증된 데이터 유형
    설명
    @AssertFalse
    Boolean,boolean
    유효성 검사 메모의 요소 값은false
    @AssertTrue
    Boolean,boolean
    메모의 요소 값이true 인지 확인
    @NotNull
    모든 유형
    주해의 원소 값이null이 아니라는 것을 검증합니다
    @Null
    모든 유형
    유효성 검사 메모의 요소 값은null
    @Min(value=값)
    BigDecimal, BigInteger, byte, short, int, long, 등 번호 또는 CharSequence 하위 유형
    메모의 요소 값이 @Min에서 지정한value 값보다 큰지 확인합니다.
    @Max(value=값)
    @Min의 요구와 같습니다.
    유효성 검사 메모의 요소 값이 @Max에서 지정한value 값보다 작음
    @DecimalMin(value=값)
    @Min의 요구와 같습니다.
    메모의 요소 값이 @ DecimalMin에서 지정한 value 값보다 큰지 확인합니다.
    @DecimalMax(value=값)
    @Min의 요구와 같습니다.
    @ DecimalMax에서 지정한 value 값보다 작은 주석 요소 값 확인
    @Digits(integer=정수 자릿수, fraction=소수점 자릿수)
    @Min의 요구와 같습니다.
    메모의 요소 값의 정수 및 소수 자릿수 상한선 확인
    @Size(min= 하한, max= 상한)
    문자열, Collection, Map, 배열 등
    문자 길이, 집합 크기 등 지정한 구간에 대한 주석 요소 값을 검증합니다.
    @Past
    java.util.Date, java.util.Calendar; Joda Time 라이브러리의 날짜 유형
    메모의 요소 값(일 유형)이 현재 시간보다 빠른지 확인합니다.
    @Future
    @Past 요청과 동일
    현재 시간보다 늦게 메모의 요소 값 확인 (일자 유형)
    @NotBlank
    CharSequence 하위 유형
    유효성 검사 메모의 요소 값이 비어 있지 않습니다 (null, 첫 번째 공백을 제거한 후 길이는 0). @Notempty와 다르며, @NotBlank는 문자열에만 적용되고 비교할 때 첫 번째 공백을 제거합니다.
    @Length(min= 하한, max= 상한)
    CharSequence 하위 유형
    주해의 원소 값 길이가 min과 max 구간에 있는지 확인하기
    @NotEmpty
    CharSequence 하위 유형, Collection, Map, 배열
    유효성 검사 메모의 요소 값이null이고 비어 있지 않음 (문자열 길이는 0, 집합 크기는 0)
    @Range(min= 최소, max= 최대)
    BigDecimal, BigInteger, CharSequence, byte, short, int, long 등 원자 유형과 포장 유형
    메모의 요소 값이 최소값과 최대값 사이인지 확인합니다.
    @Email(regexp=정규 표현식, flag=로고 모드)
    CharSequence 하위 유형(예: String)
    메모의 요소 값이 Email인지 확인하거나regexp와flag를 통해 사용자 정의 이메일 형식을 지정할 수 있습니다
    @Pattern(regexp=정규 표현식, flag=로고 모드)
    String, CharSequence의 하위 유형
    메모의 요소 값이 지정된 정규 표현식과 일치하는지 확인합니다.
    @Valid
    모든 비원자 유형
    귀속 검증 관련 대상 지정하기;사용자 객체에 주소 객체 속성이 있는 경우 사용자 객체를 검증할 때 주소 객체를 함께 검증하려면 주소 객체에 @Valid 메모를 추가하여 종속 인증을 수행합니다.
    여기에는 Hibernate Validator가 제공하는 대부분의 검증 제약 주석만 열거되어 있습니다. Hibernate validator 공식 문서를 참고하여 다른 검증 제약 주석과 사용자 정의 검증 제약 주석의 정의를 이해하십시오.
    이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

    좋은 웹페이지 즐겨찾기