유효성 검사를 통해 오류를 검출할 때 그대로 출력하면 JSR-303 에러이다.(우리가 이전 시간에 했던 것)
기본 메세지말고 우리가 만든 메세지를 출력할 수는 없을까?
codes[0]을 통해 [에러종류.빈이름.프로퍼티이름]를 확인할 수 있었다.
<ServletAppContext.java>
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
res.setBasename("/WEB-INF/properties/error_message");
return res;
}
메세지를 나타내기 위해서는 당연하게도 properties 파일을 인식시키기 위해 ReloadableResourceBundleMessageSource를 @Bean으로 주입해야 한다.
우리가 Properties 파일에 위의 양식의 이름으로 메세지를 등록하면 된다. 다국어처리도 가능하다.
<error_message.properties>
Size.dataBean1.data1 = data1은 2~10글자여야 합니다.
Max.dataBean1.data2 = data2는 100 이하여야 합니다.
유효성 검증에 통과하지 못해 다시 입력화면으로 돌아갈 때, 기존에 입력했던 내용을 유지해야 한다.
이때 입력화면에 전달된 Bean객체에 input태그에 값을 주입하면 된다.
<input_data.jsp>
<%@ taglib prefix="form" ....>
<form:form action="input_pro" method="post" modelAttribute="dataBean1">
data1: <form:input type="text" path="data1" />
<form:errors path="data1" />
data2: <form:input type="text" path="data2" />
<form:erros path="data2" />
<form:button type="submit">확인</form:button>
</form:form>
===============================================================
<%@ taglib prefix="spring"....>
<%@ taglib prefix="c" ....>
<form action="input_pro" method="post" modelAttribute="dataBean1">
data1 : <input type="text" name="data1"/>
<spring:hasBindErrors name="dataBean1">
<c:if test="${errors.hasFieldErrors('data1') }">
<spring:message code="${errors.getFieldError('data1').codes[0]}" />
</c:if>
</spring:hasBindErrors>
data2 : <input type="text" name="data2"/><br/>
<spring:hasBindErrors name="dataBean1">
<c:if test="${errors.hasFieldErrors('data2') }">
<spring:message code="${errors.getFieldError('data2').codes[0]}" />
${errors.getFieldError('data2').defaultMessage }<br/>
</c:if>
</spring:hasBindErrors>
<button type="submit">확인</button>
</form>
<복잡환 과정>
jsp의 경우, error가 난다면 error에 대한 정보를 출력하고 싶다. taglib중에 c와 spring을 이용하면 길다.
spring에서 hasBindErros를 사용하여 if문으로 검사 뒤, message로 출력한다.
<간편한 과정>
이것을 쉽게 할 수 있는 것은 taglib중에 form:errors을 이용하는 것이다. form:errors path="data1"만 사용하면 해당 값이 자동으로 아래 정의한 모든 과정을 수행하게 된다.
<TestController.java>
@GetMapping("/input_data")
public String input_data(DataBean1 dataBean1) {
return "input_data";
}
@PostMapping("/input_pro")
public String input_data(@Valid DataBean1 dataBean1, BindingResult result) {
if(result.hasErrors()) {
return "input_data";
}
return "input_success";
}
1. ("/input_data")
만약, input_data를 처음에 로그인 한다면, default 값이 정해져 있지 않으므로 modelAttribute의 dataBean1은 null이다. 따라서 오류가 나기 때문에 Controller의 매개변수에 Databean1을 넣는다. 그래야 자동으로 request에 DataBean1의 내용이 저장되고 jsp에서 modelAttribute로 출력이 가능하다.
@Valid가 없으므로 유효성 검사를 위한 것이 아닌, 주입받은 Bean을 input_data.jsp에 표시하기 위함이다.
2. ("/input_pro")
파라미터에서 주입받은 DataBean1 객체 dataBean1은 request에 저장되므로 자연스럽게 input_data와 input_success에 모두 사용 가능하다. (생략되었지만 @ModelAttribute를 자동으로 주입받고 또한 requst에 저장된다는 의미)
(*보통 사용자 입장에서는 submit전에 해당 영역에 값이 잘 들어갔는지 바로바로 체크해 주는게 더 편하지 않을까?)
(properties + form custom태그 라이브러리 + message 등록)
'Spring > Spring MVC 5' 카테고리의 다른 글
Validator 커스터마이징 (0) | 2020.05.27 |
---|---|
JSR-303 / JSR-383 (0) | 2020.05.27 |
유효성 검사 (0) | 2020.05.27 |
Properties / Message (0) | 2020.05.27 |
RequestScope 빈 주입 (0) | 2020.05.26 |