springMVC 는 입력 데이터 검증 실현 코드 를 어떻게 합 니까?
데이터 의 검증 은 상호작용 사이트 의 불가 또는 부족 한 기능 으로 데이터 검증 은 클 라 이언 트 검증 과 서버 측 검증 으로 나 뉜 다.전단 의 js 검 사 는 사용자 이름 의 유일 성,생일 형식,메 일 형식 검사 등 대부분의 검사 직책 을 포함 할 수 있 습 니 다.그러나 사용자 가 브 라 우 저 를 돌아 가지 않도록 http 도 구 를 사용 하여 백 엔 드 에 불법 데 이 터 를 직접 요청 합 니 다.서버 의 데이터 검증 도 필요 합 니 다.더러 운 데이터 가 데이터 베이스 에 떨 어 지 는 것 을 방지 할 수 있 습 니 다.만약 에 데이터 베이스 에 불법 메 일 형식 이 나타 나 면 운영 자 들 을 골 치 아 프 게 할 수 있 습 니 다.서버 측 검증 은 전체 응용 프로그램 이 불법 데 이 터 를 막 는 마지막 방어선 입 니 다.응용 프로그램 에서 프로 그래 밍 을 통 해 이 루어 집 니 다.
클 라 이언 트 인증 은 대부분의 경우 자바 스 크 립 트 를 사용 하여 클 라 이언 트 인증 을 하 는 절 차 는 다음 과 같 습 니 다.
검증 함 수 를 작성 합 니 다
JSR 303/JSR-349,hibenate validation,spring validation 간 의 관계
JSR 303 은 표준 입 니 다.JSR-349 는 업그레이드 버 전 입 니 다.새로운 기능 을 추 가 했 습 니 다.그들 은 일부 검증 규범 즉 검증 주 해 를 규정 합 니 다.예 를 들 어@Null,@NotNull,@Pattern 은 자바 x.vaidation.constraints 가방 에 있 고 규범 만 제공 하고 실현 되 지 않 습 니 다.한편,hibenate vaidation 은 이 규범 에 대한 실천(hibenate 와 데이터베이스 orm 프레임 워 크 를 연결 하지 마 십시오)입 니 다.그 는 해당 하 는 실현 을 제공 하고 다른 검증 주 해 를 추 가 했 습 니 다.예 를 들 어@Email,@Length,@Range 등 은 org.hibenate.vaidator.constraints 가방 에 있 습 니 다.한편,만능 spring 은 개발 자 에 게 편리 함 을 제공 하기 위해 hibenate vaidation 을 2 차 로 패 키 징 했 습 니 다.검증 vaidated bean 을 표시 할 때 spring vaidation 이나 hibenate vaidation 을 사용 할 수 있 습 니 다.spring vaidation 의 또 다른 기능 은 springmvc 모델 에 자동 검증 을 추가 하고 검증 정 보 를 특정한 클래스 에 패키지 하 는 것 입 니 다.이것 은 의심 할 여지없이 우리 의 웹 개발 을 편리 하 게 했다.본 고 는 주로 springmvc 에서 자동 으로 검사 하 는 메커니즘 을 소개 한다.
springMVC 입력 데이터 검증 실현
우선 Maven 프로젝트 에 관련 jar 패 키 지 를 도입 합 니 다.
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.13.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
spring 의 Valid 기능 열기
<mvc:annotation-driven />
검 증 될 실체 클래스 만 들 기
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
// users
public class UserInfo {
private int id;
@Pattern(regexp = Constants.USERNAMR, message = Constants.USERNAMRERROR)
private String username;
@NotBlank(message = Constants.NAMEERROR)
private String name;
@Email(message = Constants.EMAILERROR)
private String email;
@Length(min = 6, max = 16, message = Constants.PASSWORDERROR)
private String password;
@Pattern(regexp = Constants.PHONE, message = Constants.PHONEERROR)
private String phoneNum;
//...get/set
}
이 주석 들 은 비교적 간단명료 하고 이해 하기 쉽다.필드 의 주석 이름 은 검사 내용 을 추정 할 수 있다.모든 주석 은 message 필드 를 포함 하고 있 으 며,검사 실패 시 알림 정보 로 사용 되 며,특수 한 검사 주해,예 를 들 어 Pattern(정규 검사)은 정규 표현 식 을 추가 할 수 있다.
JSR :
@Null null
@NotNull null
@AssertTrue true
@AssertFalse false
@Min(value) ,
@Max(value) ,
@DecimalMin(value) ,
@DecimalMax(value) ,
@Size(max=, min=)
@Digits (integer, fraction) ,
@Past
@Future
@Pattern(regex=,flag=)
Hibernate Validator :
@NotBlank(message =) null, 0
@Email
@Length(min=,max=)
@NotEmpty
@Range(min=,max=,message=)
저 희 는 message 오류 정 보 를 Constants 클래스 에 두 었 습 니 다.
public class Constants {
public static final String PHONE = "^1[3|4|5|7|8][0-9]{9}$";
public static final String USERNAMR = "^NH[0-9]{7}$";
public static final String NAMEERROR = " ";
public static final String PHONEERROR = " ";
public static final String EMAILERROR= " ";
public static final String USERNAMRERROR = " ";
public static final String PASSWORDERROR = " 6~16 ";
public static final String DATENOTNULL = " ";
}
@Controller 에서 데 이 터 를 검사 합 니 다.@Valid 와 BindingResult 는 일일이 대응 합 니 다.@Valid 가 여러 개 있 으 면@Valid 뒤에 따 르 는 BindingResult 가 바로 이@Valid 의 검증 결과 입 니 다.순서 가 어 지 러 워 서 는 안 됩 니 다.
//
@RequestMapping("/save.do")
//@PreAuthorize("authentication.principal.username == 'NH1905001'")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String save(@Valid @ModelAttribute(value="userInfo") UserInfo userInfo, BindingResult result) throws Exception {
if(result.hasErrors()){
List<FieldError> errors = result.getFieldErrors();
for (FieldError fieldError : errors) {
System.out.println(" :" + fieldError.getDefaultMessage());
System.out.println(" ?" + fieldError.getField());
System.out.println(fieldError);
System.out.println("------------------------");
}
return "user-add";
}else {
userService.save(userInfo);
return "redirect:findAll.do";
}
}
오류 대상 의 대표 자 는 Errors 인터페이스 입 니 다.데이터 바 인 딩 오류 와 오류 검증 에 관 한 인 터 페 이 스 를 저장 하고 노출 하 며 관련 저장 과 오류 메 시 지 를 얻 는 방법 을 제공 합 니 다.다음 과 같은 몇 가지 실현 유형 이 있 습 니 다.
void addAllErrors(Errors var1);
boolean hasErrors();
int getErrorCount();
List<ObjectError> getAllErrors();
boolean hasGlobalErrors();
int getGlobalErrorCount();
List<ObjectError> getGlobalErrors();
@Nullable
ObjectError getGlobalError();
boolean hasFieldErrors();
int getFieldErrorCount();
List<FieldError> getFieldErrors();
@Nullable
FieldError getFieldError();
boolean hasFieldErrors(String var1);
int getFieldErrorCount(String var1);
List<FieldError> getFieldErrors(String var1);
@Nullable
FieldError getFieldError(String var1);
@Nullable
Object getFieldValue(String var1);
@Nullable
Class<?> getFieldType(String var1);
방법 이름 에 따라 방법의 작용 을 알 수 있다출력 검사 정보
:
?name
Field error in object 'userInfo' on field 'name': rejected value []; codes [NotBlank.userInfo.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.name,name]; arguments []; default message [name]]; default message [ ]
------------------------
:
?email
Field error in object 'userInfo' on field 'email': rejected value [111]; codes [Email.userInfo.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@462d227d,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@2a8eb300]; default message [ ]
------------------------
:
?username
Field error in object 'userInfo' on field 'username': rejected value []; codes [Pattern.userInfo.username,Pattern.username,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.username,username]; arguments []; default message [username],[Ljavax.validation.constraints.Pattern$Flag;@63f401ef,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@72436888]; default message [ ]
------------------------
:
?phoneNum
Field error in object 'userInfo' on field 'phoneNum': rejected value []; codes [Pattern.userInfo.phoneNum,Pattern.phoneNum,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.phoneNum,phoneNum]; arguments []; default message [phoneNum],[Ljavax.validation.constraints.Pattern$Flag;@63f401ef,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@5d528277]; default message [ ]
------------------------
: 6~16
?password
Field error in object 'userInfo' on field 'password': rejected value []; codes [Length.userInfo.password,Length.password,Length.java.lang.String,Length]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userInfo.password,password]; arguments []; default message [password],16,6]; default message [ 6~16 ]
------------------------
데이터 검사 오류 정보 표시controller 처리 방법의 형 삼 pojo 가 정의 하 는 대상 은 이 유형 과 같 습 니 다.이니셜 소문 자 입 니 다.이 때 spring 은 자동 으로 이 대상 을 key 라 고 부 릅 니 다.이 대상 을 value 로 하여 request 에 저장 할 수 있 습 니 다.물론@Valid@ModelAttribute(value="userInfo")UserInfo userInfo 를 통 해 이름 을 사용자 정의 할 수도 있 습 니 다.
model Attribute="userInfo"에서 userInfo 는 contrller 방법의 형 삼 pojo 가 정의 하 는 대상 과 같 습 니 다.
페이지 도입 주의
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<form:form modelAttribute="userInfo" action="${pageContext.request.contextPath}/user/save.do"
method="post">
<!-- -->
<section class="content"> <!-- -->
<div class="panel panel-default">
<div class="panel-heading"> </div>
<div class="row data-type">
<div class="col-md-2 title"> </div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="username"
placeholder=" " value="">
</div>
<div class="col-md-6 data">
<form:errors path="username" cssStyle="color:red"/>
</div>
<div class="col-md-2 title"> </div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="name"
placeholder=" " value="">
</div>
<div class="col-md-6 data">
<form:errors path="name" cssStyle="color:red"/>
</div>
<div class="col-md-2 title"> </div>
<div class="col-md-4 data">
<input type="password" class="form-control" name="password"
placeholder=" " value="">
</div>
<div class="col-md-6 data">
<form:errors path="password" cssStyle="color:red"/>
</div>
<div class="col-md-2 title"> </div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="email"
placeholder=" " value="">
</div>
<div class="col-md-6 data">
<form:errors path="email" cssStyle="color:red"/>
</div>
<div class="col-md-2 title"> </div>
<div class="col-md-4 data">
<input type="text" class="form-control" name="phoneNum"
placeholder=" " value="">
</div>
<div class="col-md-6 data">
<form:errors path="phoneNum" cssStyle="color:red"/>
</div>
<div class="col-md-2 title"> </div>
<div class="col-md-4 data">
<select class="form-control select2" style="width: 100%"
name="status">
<option value="0" selected="selected"> </option>
<option value="1"> </option>
</select>
</div>
</div>
</div>
<!-- /--> <!-- -->
<div class="box-tools text-center">
<button type="submit" class="btn bg-maroon"> </button>
<button type="button" class="btn bg-default"
onclick="history.back(-1);"> </button>
</div>
<!-- /--> </section>
<!-- /-->
</form:form>
데이터 검사 오류 정보 표시 방법 2
model 방식 으로 request 에 지정 한 key 와 value 를 저장 합 니 다.다음 과 같 습 니 다.
//
@RequestMapping("/transformClients.do")
public String transformClientsById(@Valid @ModelAttribute("publicSea") PublicSea publicSea, BindingResult result, Model model) throws Exception {
if(result.hasErrors()){
model.addAttribute("failueError",failueError.getDefaultMessage());
model.addAttribute("failueDesc",publicSea.getFailueDesc());
model.addAttribute("cNumber",publicSea.getcNumber());
return "publicSea-change";
}else {
return "redirect:findAll.do";
}
}
클 라 이언 트 코드
<form action="${pageContext.request.contextPath}/clients/transformClients.do"
method="post">
<!-- -->
<section class="content"> <!-- -->
<div class="panel panel-default">
<div class="panel-heading"> </div>
<div class="row data-type">
<input type="text" style="display:none" name="cNumber"
placeholder=" Id" value="${cNumber}">
<div class="col-md-2 title rowHeight2x"> </div>
<div class="col-md-10 data rowHeight2x">
<textarea class="form-control" rows="3" placeholder=" "
name="failueDesc">${failueDesc}</textarea>
</div>
<div class="col-md-12 data rowHeight2x">
<label>${failueError}</label>
</div>
</div>
</div>
<!-- /--> <!-- -->
<div class="box-tools text-center">
<button type="submit" class="btn bg-maroon"> </button>
<button type="button" class="btn bg-default"
onclick="history.back(-1);"> </button>
</div>
<!-- /--> </section>
<!-- /-->
</form>
그룹 검사사용자 정의 검사
수 동 검사
방법 기반 검사
입력 데이터 검증 에 대한 springMVC 의 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springMVC 데이터 검증 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Spring MVC] [1] 5. 스프링 MVC - 구조 이해핸들러 조회: 핸들러 매핑을 통해 요청 URL에 매핑된 핸들러(컨트롤러)를 조회 핸들러 어댑터 조회: 핸들러를 실행할 수 있는 핸들러 어댑터를 조회 핸들러 어댑터 실행: 핸들러 어댑터를 실행 핸들러 매핑 org.sp...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.