JSR-303 어제 했던 연장으로 하겠다.
똑같다 방식은. 어제는 Max 와 Size를 했었다.
오늘은
@AssertTrue : true가 아닌 값이 들어오면 오류
@AssertFalse : false가 아닌 값이 들어오면 오류
@Max(값) : 값 보다 큰 값이 들어오면 오류
@Min(값) : 값 보다 작은 값이 들어오면 오류
@DecimalMax(value=값, inclusive=true/false) : 값보다 작거나 같은 값이 들어와야 한다. inclusive 가 false면 값은 포함하지 않는다. 생략하면 true 이다.
@DecimalMin(value=값, inclusive=true/false): 상동. min과 max는 이상 이하 이다. 이건 보통 초과 미만 때 사용한다.
@Null : 값이 들어오면 오류가 발생
@NotNull : 값이 들어오지 않으면 오류가 발생
@Digits(integer=자릿수, fraction = 자릿수) : 지정된 자릿수의 숫자가 아닐 경우 오류가 발생. Integer는 정수 자릿수 fraction 은 소숫점 자릿수이다.
@Size(min=글자 수,max=글자 수) : 지정된 글자 수 보다 짧거나 길면 오류가 발생
@Pattern(regexp=정규식):주어진 정규식에 위배되면 오류 발생
ServletAppContext.java에 message 등록은 기본~
@Pattern(regexp="[a-zA-Z]*") 와 같이 이용한다. 알파벳만 받는다는 뜻이다.
JSR-380 도 방식은 같으니 어떤 것이 있는지만 보자.
@NotEmpty : 주입된 값의 길이가 0이면 오류 발생. 공백도 글자로 인식한다.
@NotBlank : 주입된 값이 공백을 제거하고 길이가 0이면 오류 발생
@Positive : 양수가 아니라면 오류 발생
@PositiveOrZero : 0 또는 양수가 아니라면 오류 발생
@Negative : 음수가 아니라면 오류 발생
@NegativeOrZero : 0 또는 음수가 아니라면 오류 발생
@Email : 이메일 형식이 아니라면 오류 발생. 중간에 @가 있는지 정도만 확인한다.
이제 JSR-303 308이 아닌 커스텀해서 내가 원하는 유효성 검사를 해보자.
먼저 Validator 인터페이스를 구현해야 한다.
패키지를 만들고 내부에 validator 클래스를 만들자 나는 DataBean1Validator.java로 만들었다.
그리고 validator를 implements를 한 후에 메서드를 Override 한다.
supports 메서드는 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지를 확인한다.
validate 메서드는 유효성 검사를 하는 메서드이다.
그리고 이 validator를 controller에 등록해 준다. controller 자바에 다음과 같이 기입한다.
여러개면 binder.addValidators 를 이용한다.
이 메서드가 @Validate 붙은 빈 객체들을 가지고 와서 validator 해준다.
@Validate 가 붙은 객체들은
다음 validate 메서드의 Object 'target' 으로 들어오게 된다.
이제 들어온 값들에 대해 간단히 검사를 해줄 수가 있다.
ValidationUtils.rejectIfEmpty(errors,"data2","error2");
는 값이 비어있는지 확인한다. 공백도 글자로 취급한다. data2 를 검사하고 만약 에러가 있으면 이 에러를 error2로
호칭한다.
밑에는 공백만 있어도 에러가 뜬다.
이렇게 입력값에 문제가 있으면 error 객체에 오류정보를 저장하고, 사용할 오류 메세지는
"코드이름(error2같은).bean객체 이름.프로퍼티이름(data2 같은) 으로 구성이 된다.
error_message.properties 에
'error3.dataBean1.data3= data3은 공백을 제외하고 길이가 0보다 커야 합니다.'
다음과 같이 적을 수 있겠다.
객체를 받아온 object를 형변환 시켜서 data 값을 뽑아내고
if 문으로 유효성 검사를 해주고 위배시에 rejectValue를 통해 오류 정보를 저장한다.
errors.rejectValue("프로퍼티이름","코드이름") 이렇게 저장한다.
그런데 이거를 하게되면 기존의 JSR 이 자꾸 안먹힌다 이상하다 이 부분은 아직 모르겠다.
ㄴ 이거 setValidator 말고 addValidators 방식으로 넣으면 해결된다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Interceptor
* 요청 발생 시 호출되는 메서드의 코드가 중복 되는 부분이 있을 때 Interceptor를 통해 처리하게 된다.
* 로그인 여부 확인, 권환 확인 등의 작업을 처리할 때 많이 사용된다.
먼저, Interceptor 는 HandlerInterceptor 인터페이스를 구현하거나,
HandlerInterceptorAdapter를 상속받은 클래스를 만들고 다음의 메서드를 구현한다.
1.preHandle : Controller의 메서드가 호출되기 전 호출된다.
2.postHandle : Controller의 메서드의 수행이 완료되고 view 처리를 수행하기 전에 호출된다.
3.afterCompletion : view 처리까지 완료되고 응답결과가 브라우저로 전달되기 전에 호출된다.
TestController.java 에는 test1 와 test2 getmapping 이 들어오면 각 test1,test2를 print 해주는 코드로 설정해놨다.
각 Testinterceptor숫자 java파일은 다음과 같이 하였다.
다음은ServletAppContext.java 파일에 등록한 코드이다.
addInterceptors 메서드를 이용한다. 등록할 각 객체를 만들고,
InterceptorRegistration reg1=registry.addInterceptor(inter1); 다음과 같이 등록한다. 이 순서가 실행되는 순서이다.
그리고 패턴에 맞게 reg1.addPathPatterns() 로 설정한다.
캡처처럼 reg4로 여러개를 등록할 떄에는 ',' 로 끊어서 등록하면 된다.
/* 에서 * 는 1덩이를 뜻한다. 어떤 것이든 한 덩이면 다 해당이된다. 하지만 만약 /sub1/test1 이런거라면 안되겠다.
/ 하고 아무것도 없는 첫화면에도 당연히 된다. 그런데 그 다음줄에 exclude 로 / 하나는 뺏기때문에 메인화면에서는 되지 않는다.
이것이 /** 로 등록을 할 경우엔 그냥 / 이후 모든거 다 된다는 뜻이다.
다음은 xml 등록방법이다. 맨 위에 inter1 를 기준으로 등록해놓고 path 써놓고 ref bean 으로 inter1 을 등록한 것도 있고, 1번만 쓸거여서 즉석에서 beans:bean class 로 등록해준 것이 있는 것을 볼 수가 있다.
다음과 같이 나온다. 아 postHandle 과 afterCompletion은 등록 순서의 반대로 나오게 된다.
오늘은 요까지 끝~
'공부 기록들' 카테고리의 다른 글
2020.04.24 - 미니프로젝트(1) (틀 구성하고 페이지 연결하기) (0) | 2020.04.24 |
---|---|
2020.04.22~23 - MVC(8) (예외처리, MyBatis Java, MyBatis XML, RestController) (0) | 2020.04.23 |
2020.04.20 MVC(6) (쿠키, 유효성 검사, JSR-303) (0) | 2020.04.20 |
2020.04.17 MVC(5) ( SessionScope, ApplicationScope) (0) | 2020.04.17 |
2020.04.16 MVC(4) ( Bean 주입 java/xml, form 태그, redirect, forward, requestScope ) (0) | 2020.04.17 |