[포스코DX|@Valid|7주] 33일차 수업
포스코DX X 비트교육센터 6기 - Spring @Valid
validate
input 창에 대한 처리
성공 / 실패 (리다이랙션)
바인딩 결과를 넘겨주는 과정이 필요함.
@RequestMapping(value="/join", method=RequestMethod.POST)
public String join(@Valid UserVo userVo, BindingResult result, Model model) {
if(result.hasErrors()) {
model.addAllAttributes(result.getModel());
return "user/join";
}
userService.join(userVo);
return "redirect:/user/joinsuccess";
}
- pom.xml
<!-- validation -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.3.Final</version>
</dependency>
- UserVo
(+) 정규표현식: [0-9a-zA-z]{8-16}
- 아무 내용없이 가입하기를 누를 경우, join페이지로 redirect되며, 에러를 볼 수 있음.
@RequestMapping(value="/join", method=RequestMethod.POST)
public String join(@Valid UserVo userVo, BindingResult result, Model model) {
if(result.hasErrors()) {
System.out.println(result);
//model.addAllAttributes(result.getModel());
return "user/join";
}
userService.join(userVo);
return "redirect:/user/joinsuccess";
}
(+) 입력폼(JSP) 에서 에러 메세지 출력하기1
- UserController.java
@RequestMapping(value="/join", method=RequestMethod.POST)
public String join(@Valid UserVo userVo, BindingResult result, Model model) {
if(result.hasErrors()) {
//List<ObjectError> list = result.getAllErrors();
//for(ObjectError error : list) {
// System.out.println(error);
//}
model.addAllAttributes(result.getModel());
return "user/join";
}
userService.join(userVo);
return "redirect:/user/joinsuccess";
}
- Join.jsp
<spring:hasBindErrors name="userVo">
<c:if test="${errors.hasFieldErrors('name') }">
${errors.getFieldError("name").defaultMessage }
</c:if>
</spring:hasBindErrors>
- 결과
에러 메시지는 두가지의 경우 랜덤으로 디폴트 메시지로 여겨서 하나만 나옴.
- 추가 처리
<input id="name" name="name" type="text" value="${userVo.name }">
value값을 통해 사용자가 join에 실패해도 이전 작성한 input입력 폼이 남아있도록 한다.
@RequestMapping(value="/join", method=RequestMethod.POST)
public String join(@ModelAttribute @Valid UserVo userVo, BindingResult result, Model model) {
if(result.hasErrors()) {
//List<ObjectError> list = result.getAllErrors();
//for(ObjectError error : list) {
// System.out.println(error);
//}
model.addAllAttributes(result.getModel());
return "user/join";
}
userService.join(userVo);
return "redirect:/user/joinsuccess";
}
@ModelAttribute 추가를 통해 Controller에 저장이되고 Controller에서 JSP로 특별하게 보내는 코드도 없어 보이는데 JSP 코드에서 저렇게 값이 정상적으로 출력
(+) 입력폼(JSP) 에서 에러 메세지 출력하기2 (default message가 맘에 들지 않고, 나의 메시지를 띄우려고 하는 경우 + 다국어 버전을 사용하는 경우)
- join.jsp
<p style="padding:3px 0 0; text-align:left; color:#f00;">
<spring:hasBindErrors name="userVo">
<c:if test="${errors.hasFieldErrors('name') }">
<spring:message code='${errors.getFieldError("name").codes[0] }'/>
</c:if>
</spring:hasBindErrors>
</p>
- spring-servlet (다국어 설정 과정도 이곳에서 이루어짐.)
<!-- 6. MessageSource -->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages/messages_ko</value>
<value>messages/messages_en</value>
</list>
</property>
</bean>
- 다음 내용을 파일에 담을 것이다. 미리 메모장에 적어둔다.
다국어 버전을 만들어가는 과정 포함
messages_ko.properties
user.join.label.password = 비밀번호
NotEmpty.userVo.name = 사용자 이름은 필수 입니다.
Length.uerVo.name = 사용자 이름은 2~8자이어야 합니다.
NotEmpty.userVo.email = 사용자 메일은 필수 입니다.
Email.uerVo.email= 메일 형식이 맞지 않습니다.
NotEmpty.userVo.password = 사용자 비밀번호는 필수 입니다.
Length.uerVo.password= 사용자 비밀번호는 2~8자이어야 합니다.
messages_en.properties
user.join.label.password = password
NotEmpty.userVo.name = user name is nes..
Length.uerVo.name = user name
messages_cn.properties
NotEmpty.userVo.name = user name is nes..
Length.uerVo.name = user name
- properties에서 다음 설정을 알아 본다. (UTF-8로 들어가면 안됨.)
- 폴더와 파일을 생성한다.
- 메모장 내용을 갖다 붙히면 알아서 엔코딩 된다.
- 다국어 지원을 해주려면,
user.join.label.password=비밀번호
user.join.label.password=password
를 각 파일에 넣어준다.
그리고 join.jsp에서 다음을 넣어주면!! 된다.
(+) 입력폼(JSP) 에서 에러 메세지 출력하기3
<%@ taglib uri="http://www.springframework.org/tags" prefix="form"%>
내부에서 html을 만드는 태그 라이브러리 (내부는 자바 코드)
join.jsp 상단에 붙여준다.
:form 과 input을 추가
controller에서도 @ModelAttribute 를 추가
join.jsp
<label class="block-label" for="email">이메일</label>
<input id="email" name="email" type="text" value="">
<form:input path="email" />
<input type="button" value="중복체크">
<p style="padding:3px 0 5px 0; text-align: left; color: #f00">
<form:errors path="email" />
</p>
(+) 체크박스
<fieldset>
<legend>성별</legend>
<form:radiobutton path="gender" value="female" label="여" checked="checked" />
<form:radiobutton path="gender" value="male" label="남" checked="checked" />
</fieldset>