일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 객체 비교
- 컬렉션프레임워크
- 추상메서드
- oracle
- 대덕인재개발원
- 참조형변수
- 인터페이스
- 사용자예외클래스생성
- 예외미루기
- 오라클
- 생성자오버로드
- 집합_SET
- 한국건설관리시스템
- 예외처리
- GRANT VIEW
- 정수형타입
- 다형성
- cursor문
- 자바
- 컬렉션 타입
- 제네릭
- exception
- 메소드오버로딩
- 환경설정
- NestedFor
- abstract
- 어윈 사용법
- EnhancedFor
- Java
- 자동차수리시스템
- Today
- Total
거니의 velog
231128_SPRING 2 (5-1) 본문
[JSPFormSelectboxTagController.java]
package kr.or.ddit.controller.jsp.selectbox;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/formtag/selectbox")
public class JSPFormSelectboxTagController {
/*
* 11. 셀렉트 박스 요소
*
* - HTML 셀렉트 박스를 출력하려면 <form:select> 요소를 사용한다.
*/
@RequestMapping(value = "/registerFormSelectBox01", method = RequestMethod.GET)
public String registerFormSelectBox01(Model model) {
log.info("registerFormSelectBox01() 실행...!");
Map<String, String> nationalityCodeMap = new HashMap<String, String>();
nationalityCodeMap.put("01", "Korea");
nationalityCodeMap.put("02", "Canada");
nationalityCodeMap.put("03", "Austrailia");
model.addAttribute("nationalityCodeMap", nationalityCodeMap);
model.addAttribute("member", new Member());
return "home/formtag/selectbox/registerFormSelectBox01";
}
}
[registerFormSelectBox01.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerFormSelectBox01</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/selectbox/result">
<table border="1">
<tr>
<td>국적</td>
<td>
<form:select path="nationality" items="${nationalityCodeMap }" multiple="true"></form:select>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/formtag/selectbox/registerFormSelectBox01
@RequestMapping(value = "/registerFormSelectBox02", method = RequestMethod.GET)
public String registerFormSelectBox02(Model model) {
log.info("registerFormSelectBox02() 실행...!");
List<CodeLabelValue> nationalityCodeList = new ArrayList<CodeLabelValue>();
nationalityCodeList.add(new CodeLabelValue("01", "Korea"));
nationalityCodeList.add(new CodeLabelValue("02", "Canada"));
nationalityCodeList.add(new CodeLabelValue("03", "Austrailia"));
model.addAttribute("nationalityCodeList", nationalityCodeList);
model.addAttribute("member", new Member());
return "home/formtag/selectbox/registerFormSelectBox02";
}
[registerFormSelectBox02.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerFormSelectBox02</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/selectbox/result">
<table border="1">
<tr>
<td>국적</td>
<td>
<form:select path="nationality" items="${nationalityCodeList }" multiple="true" itemValue="value" itemLabel="label"></form:select>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/formtag/selectbox/registerFormSelectBox02
@RequestMapping(value = "/registerFormSelectBox03", method = RequestMethod.GET)
public String registerFormSelectBox03(Model model) {
log.info("registerFormSelectBox03() 실행...!");
List<CodeLabelValue> carCodeList = new ArrayList<CodeLabelValue>();
carCodeList.add(new CodeLabelValue("01", "Jeep"));
carCodeList.add(new CodeLabelValue("02", "Bmw"));
carCodeList.add(new CodeLabelValue("03", "Audi"));
model.addAttribute("carCodeList", carCodeList);
model.addAttribute("member", new Member());
return "home/formtag/selectbox/registerFormSelectBox03";
}
[registerFormSelectBox03.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerFormSelectBox03</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/selectbox/result">
<table border="1">
<tr>
<td>차량</td>
<td>
<form:select path="carList" multiple="true">
<form:option value="" label="---선택---" />
<form:options items="${carCodeList }" itemValue="value" itemLabel="label" />
</form:select>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/formtag/selectbox/registerFormSelectBox03
[JSPFormHiddenTagController.java]
package kr.or.ddit.controller.jsp.hidden;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/formtag/hidden")
public class JSPFormHiddenTagController {
/*
* 12. 숨겨진 필드 요소
*
* - HTML 숨겨진 필드를 출력하려면 <form:hidden> 요소를 사용한다.
*/
@RequestMapping(value = "/registerFormHidden01", method = RequestMethod.GET)
public String registerFormHidden01(Model model) {
log.info("registerFormHidden01() 실행...!");
Member member = new Member();
member.setUserId("hong123");
member.setUserName("홍길순");
model.addAttribute("member", member);
return "home/formtag/hidden/registerFormHidden01";
}
}
[registerFormHidden01.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerFormHidden01</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/hidden/result">
<form:hidden path="userId"/>
<table border="1">
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/formtag/hidden/registerFormHidden01
[JSPFormButtonTagController.java]
package kr.or.ddit.controller.jsp.button;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/formtag/button")
public class JSPFormButtonTagController {
/*
* 14. 버튼 요소
*
* - HTML 버튼을 출력하면 <form:button> 요소를 사용한다.
*/
@RequestMapping(value = "/registerFormButton01", method = RequestMethod.GET)
public String registerFormButton01(Model model) {
log.info("registerFormButton01() 실행...!");
Member member = new Member();
model.addAttribute("member", member);
return "home/formtag/button/registerFormButton01";
}
}
[registerFormButton01.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerFormButton01</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/button/result">
<table border="1">
<tr>
<td>유저 ID</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<form:input path="email"/>
<font color="red">
<form:errors path="email" />
</font>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
[registerForLabel01.java]
package kr.or.ddit.controller.jsp.label;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/formtag/label")
public class JSPFormLabelTagController {
/*
* 13. 라벨 요소
*
* - HTML 라벨을 출력하려면 <form:label> 요소를 사용한다.
*/
@RequestMapping(value = "/registerFormLabel01", method = RequestMethod.GET)
public String registerFormLabel01(Model model) {
log.info("registerFormLabel01() 실행...!");
model.addAttribute("member", new Member());
return "home/formtag/label/registerFormLabel01";
}
}
[registerForLabel01.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerForLabel01</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/label/result">
<table border="1">
<tr>
<td>
<form:label path="userId">유저 ID</form:label>
</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/formtag/label/registerFormLabel01
[JSPFormValidationController.java]
package kr.or.ddit.controller.jsp.validation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/formtag/validation")
public class JSPFormValidationController {
/*
* 15. 입력값 검증 에러
*
* - 입력값 검증 에러를 출력하려면 <form:errors> 요소를 사용한다.
*/
@RequestMapping(value = "/registerFormValidation01", method = RequestMethod.GET)
public String registerFormValidation01(Model model) {
log.info("registerFormValidation01() 실행...!");
model.addAttribute("member", new Member());
return "home/formtag/validation/registerFormValidation01";
}
}
[registerFormValidation01.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerFormValidation01</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/formtag/validation/result">
<table border="1">
<tr>
<td>유저 ID</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<form:input path="email"/>
<font color="red">
<form:errors path="email" />
</font>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
package kr.or.ddit.controller.jsp.validation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/formtag/validation")
public class JSPFormValidationController {
/*
* 15. 입력값 검증 에러
*
* - 입력값 검증 에러를 출력하려면 <form:errors> 요소를 사용한다.
*/
@RequestMapping(value = "/registerFormValidation01", method = RequestMethod.GET)
public String registerFormValidation01(Model model) {
log.info("registerFormValidation01() 실행...!");
model.addAttribute("member", new Member());
return "home/formtag/validation/registerFormValidation01";
}
@RequestMapping(value = "/result", method = RequestMethod.POST)
public String registerFormValidationResult(Member member) {
log.info("registerFormValidationResult() 실행...!");
log.info("userId : " + member.getUserId());
log.info("userName : " + member.getUserName());
log.info("email : " + member.getEmail());
return "home/formtag/validation/result";
}
}
[result.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>RESULT</title>
</head>
<body>
<h2>Result</h2>
유저 ID : ${member.userId }<br />
이름 : ${member.userName }<br />
E-Mail : ${member.email }<br />
</body>
</html>
- http://localhost/formtag/validation/registerFormValidation01
[ValidationController.java]
package kr.or.ddit.controller.validation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/validation")
public class ValidationController {
/*
* [ 9장 : 입력 유효성 검증 ]
*
* 1. 입력값 검증
*
* - 스프링 MVC Bean Validaion 기능을 이용해 요청 파라미터 값이 바인딩된 도메인 클래스 (또는 커맨드 클래스)의 입력값 검증을 한다.
*
* [환경설정]
* # 의존 관계 상이
* - 입력값 검증을 위한 의존 라이브러리를 추가한다.
* - pom.xml에서 hibernate-validator 추가
*
* # 입력값 검증 활성화
* - Member 클래스로 넘어가서 임시 테스트로 userId, userName 규칙을 활성화한다.
* - 이 때, 규칙을 활성화하기 위해서 사용할 어노테이션이 있다.
* > @Validates를 지정한다.
* > 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의한다.
* BindingResult에는 요청 데이터의 바인딩 오류와 입력값 검증 오류 정보가 저장된다.
*
* # 입력값 검증 환경설정 순서
* 1. 입력값 검증을 위한 의존 라이브러리 추가
* 2. 입력값 검증 활성화
* > 활성화를 할 도메인 클래스 안에 @Validated 어노테이션을 지정한다.
* 3. 도메인 클래스 내 필드에다가 검증을 위한 어노테이션들로 데이터 검증을 설정한다 (@NotBlank, @Size 등등)
* 4. 에러를 받을 BindingResult를 설정한다. (컨트롤러 메서드 내에 설정한다.)
*/
@RequestMapping(value = "/registerValidationForm01", method = RequestMethod.GET)
public String registerValidationForm01(Model model) {
log.info("registerValidationForm01() 실행...!");
model.addAttribute("member", new Member());
return "validation/registerValidationForm01";
}
}
[registerValidationForm01.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerValidationForm01</title>
</head>
<body>
<form:form modelAttribute="member" method="post" action="/validation/result">
<table border="1">
<tr>
<td>유저 ID</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
<tr>
<td>패스워드</td>
<td>
<form:input path="password"/>
<font color="red">
<form:errors path="password" />
</font>
</td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<form:input path="email"/>
<font color="red">
<form:errors path="email" />
</font>
</td>
</tr>
<tr>
<td>성별</td>
<td>
<form:radiobutton path="gender" value="male" label="Male"/>
<form:radiobutton path="gender" value="female" label="Female"/>
<form:radiobutton path="gender" value="other" label="Other"/>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
[pom.xml]
<!--
입력값을 검증하기 위한 라이브러리 의존 관계 정의
-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.2.Final</version>
</dependency>
package kr.or.ddit.controller.validation;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.vo.Member;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping("/validation")
public class ValidationController {
/*
* [ 9장 : 입력 유효성 검증 ]
*
* 1. 입력값 검증
*
* - 스프링 MVC Bean Validaion 기능을 이용해 요청 파라미터 값이 바인딩된 도메인 클래스 (또는 커맨드 클래스)의 입력값 검증을 한다.
*
* [환경설정]
* # 의존 관계 상이
* - 입력값 검증을 위한 의존 라이브러리를 추가한다.
* - pom.xml에서 hibernate-validator 추가
*
* # 입력값 검증 활성화
* - Member 클래스로 넘어가서 임시 테스트로 userId, userName 규칙을 활성화한다.
* - 이 때, 규칙을 활성화하기 위해서 사용할 어노테이션이 있다.
* > @Validates를 지정한다.
* > 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의한다.
* BindingResult에는 요청 데이터의 바인딩 오류와 입력값 검증 오류 정보가 저장된다.
*
* # 입력값 검증 환경설정 순서
* 1. 입력값 검증을 위한 의존 라이브러리 추가
* 2. 입력값 검증 활성화
* > 활성화를 할 도메인 클래스 안에 @Validated 어노테이션을 지정한다.
* 3. 도메인 클래스 내 필드에다가 검증을 위한 어노테이션들로 데이터 검증을 설정한다 (@NotBlank, @Size 등등)
* 4. 에러를 받을 BindingResult를 설정한다. (컨트롤러 메서드 내에 설정한다.)
*/
@RequestMapping(value = "/registerValidationForm01", method = RequestMethod.GET)
public String registerValidationForm01(Model model) {
log.info("registerValidationForm01() 실행...!");
model.addAttribute("member", new Member());
return "validation/registerValidationForm01";
}
@RequestMapping(value = "/result", method = RequestMethod.POST)
public String registerValidationFormResult(@Validated Member member, BindingResult result) {
log.info("registerValidationFormResult() 실행...!");
log.info("userId : " + member.getUserId());
log.info("userName : " + member.getUserName());
if(result.hasErrors()) {
return "validation/registerValidationForm01";
}
return "validation/success";
}
}
[success.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SUCCESS</title>
</head>
<body>
<h2>유저 등록이 완료되었습니다!</h2>
<p>${member.userName }님! 등록이 완료되었습니다!</p>
</body>
</html>
- http://localhost/validation/registerValidationForm01
[Member.java]
package kr.or.ddit.vo;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
@Data
public class Member {
@NotBlank
private String userId = "a001";
@NotBlank
@Size(max = 3) // 이름은 3글자를 넘어가면 안 됨
private String userName = "hongkd";
private String password = "1234";
private int coin = 100;
@DateTimeFormat(pattern = "yyyy/MM/dd")
private Date dateOfBirth;
private String email;
private String gender;
private String hobby;
private String[] hobbyArray;
private List<String> hobbyList;
private boolean foreigner;
private String developer;
private String nationality;
private Address address;
private List<Card> cardList;
private String cars;
private String[] carArray;
private List<String> carList;
private String introduction;
private String birthDay;
}
/*
* 2. 입력값 검증 결과
*
* - 입력값 검증 대상의 도메인 클래스 직후에 BindingResult를 정의한다.
*
* # BindingResult에는 요청 데이터의 바인딩 에러와 입력값 검증 에러 정보가 저장된다.
*
* 1) 에러 정보 확인을 위한 BindingResult 메서드
*
* hasErrors()
* - 에러가 발생한 경우 true를 반환한다.
* hasGlobalErrors()
* - 객체 레벨의 에러가 발생한 경우 true를 반환한다.
* hasFieldErrors()
* - 필드 레벨의 에러가 발생한 경우 true를 반환한다.
* hasFieldErrors(String)
* - 인수에 지정한 필드에서 에러가 발생한 경우 true를 반환한다.
*/
@RequestMapping(value = "/registerValidationForm02", method = RequestMethod.GET)
public String registerValidationForm02(Model model) {
log.info("registerValidationForm02() 실행...!");
model.addAttribute("member", new Member());
return "validation/registerValidationForm02";
}
@RequestMapping(value = "/result2", method = RequestMethod.POST)
public String registerValidationForm02Result(@Validated Member member, BindingResult result) {
log.info("registerValidationForm02Result() 실행...!");
log.info("result.hasError() : " + result.hasErrors());
if(result.hasErrors()) { // 에러 정보가 존재
List<ObjectError> allErrors = result.getAllErrors();
List<ObjectError> globalErrors = result.getGlobalErrors();
List<FieldError> fieldErrors = result.getFieldErrors();
log.info("allErrors.size() : " + allErrors.size());
log.info("globalErrors.size( : " + globalErrors.size());
log.info("fieldErrors.size() : " + fieldErrors.size());
// 객체와 필드 레벨의 에러정보 모두를 출력한다.
for(int i = 0; i < allErrors.size(); i++) {
ObjectError objError = allErrors.get(i);
log.info("allError : " + objError + "\n");
}
// 객체 레벨의 에러정보를 출력한다.
for(int i = 0; i < globalErrors.size(); i++) {
ObjectError objError = globalErrors.get(i);
log.info("globalError : " + objError + "\n");
}
// 필드 레벨의 에러정보를 출력한다.
for(int i = 0; i < fieldErrors.size(); i++) {
FieldError fieldError = fieldErrors.get(i);
log.info("fieldError : " + fieldError + "\n");
log.info("fieldError.getDefaultMessage : " + fieldError.getDefaultMessage());
}
return "validation/registerValidationForm02";
}
log.info("userId : " + member.getUserId());
log.info("userName : " + member.getUserName());
log.info("email : " + member.getEmail());
log.info("gender : " + member.getGender());
return "validation/success";
}
[registerValidationForm02.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerValidationForm02</title>
</head>
<body>
<!--
[입력값 검증 결과 테스트 시나리오]
1. 사용자 아이디를 빈 값으로 입력 후 진행
2. 사용자 이름을 빈 값으로 입력 후 진행
3. 사용자 이름의 길이를 최대값보다 크게 입력(max=3)
-->
<form:form modelAttribute="member" method="post" action="/validation/result2">
<table border="1">
<tr>
<td>유저 ID</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
<tr>
<td>패스워드</td>
<td>
<form:input path="password"/>
<font color="red">
<form:errors path="password" />
</font>
</td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<form:input path="email"/>
<font color="red">
<form:errors path="email" />
</font>
</td>
</tr>
<tr>
<td>생년월일</td>
<td>
<form:input path="dateOfBirth" type="date"/>
<font color="red">
<form:errors path="dateOfBirth" />
</font>
</td>
</tr>
<tr>
<td>성별</td>
<td>
<form:radiobutton path="gender" value="male" label="Male"/>
<form:radiobutton path="gender" value="female" label="Female"/>
<form:radiobutton path="gender" value="other" label="Other"/>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/validation/registerValidationForm02
/*
* 3. 입력값 검증 규칙
*
* - 입력값 검증 규칙은 Bean Validation이 제공하는 제약 어노테이션으로 설정한다.
*
* 검사 규칙은 크게 세가지로 분류할 수 있다.
* - Bean Validation 표준 제약 어노테이션
* - 서드파티에서 구현한 제약 어노테이션(서드파티란 제3자에서 만든~)
* - 직접 구현한 제약 어노테이션
*
* 1) Member 클래스에서 테스트를 위한 어노테이션으로 설정 (아래 명시되어 있는 내용들을 가지고 테스트 해보시길!)
* - @NotNull : 빈 값이 아닌지를 검사한다.
* - @Null : null 인지를 검사한다.
* - @NotBlank : 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사한다.
* - @NotEmpty : 문자열이 null이거나 비어있는지 검사한다.
* - @Size : 글자수나 컬렉션의 요소 개수를 검사한다.
* > @Size(max=, min=)
* - @Max(value=) : value보다 작거나 같은걸 검사한다.
* - @Min(value=) : value보다 크거나 같은걸 검사한다.
* - @Email : email 주소 형식인지를 검사한다.
* - @Past : 과거 날짜인지를 검사한다.
* - @Future : 미래 날짜인지를 검사한다.
* - @Pattern(regexp=) : CharSequence는 지정된 정규식과 일치해야 하고, 정규식은 Java 정규식 규칙을 따른다.
* - @Positive : 양수여야합니다(0은 에러)
* - @PositiveOrZero : 양수 또는 0이어야 합니다.
* - @Length(min=, max=) : 문자열의 길이가 min과 max 사이인지 확인한다.
*
* [테스트]
* - Member 클래스의 검증 활성화 추가
* > userId, password, userName, email, dateOfBirth
* - 테스트는 registerValidationForm02에서 진행 (시나리오를 기반으로)
*/
package kr.or.ddit.vo;
import java.util.Date;
import java.util.List;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
@Data
public class Member {
// 입력값 검증 규칙을 지정한다.
// 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사한다.
@NotBlank(message = "아이디를 입력해주세요! X_X")
private String userId = "a001";
@NotBlank(message = "이름을 입력해주세요! X_X")
@Size(max = 3) // 이름은 3글자를 넘어가면 안 됨
private String userName = "hongkd";
@NotBlank(message = "비밀번호는 필수!")
private String password = "1234";
private int coin = 100;
// 과거 날짜인지를 검사한다.
@Past
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dateOfBirth;
// 이메일 주소 형식인지를 검사한다.
@Email
private String email;
private String gender;
private String hobby;
private String[] hobbyArray;
private List<String> hobbyList;
private boolean foreigner;
private String developer;
private String nationality;
private Address address;
private List<Card> cardList;
private String cars;
private String[] carArray;
private List<String> carList;
private String introduction;
private String birthDay;
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerValidationForm02</title>
</head>
<body>
<!--
[입력값 검증 결과 테스트 시나리오]
1. 사용자 아이디를 빈 값으로 입력 후 진행
2. 사용자 이름을 빈 값으로 입력 후 진행
3. 사용자 이름의 길이를 최대값보다 크게 입력(max=3)
[입력값 검증 결과 테스트 시나리오]
1. 유효한 데이터 입력
2. 사용자 아이디를 빈 값으로 입력 후 진행
3. 사용자 이름을 빈 값으로 입력 후 진행
4. 사용자 이름이 길이를 최대값보다 크게 입력
5. 사용자 이메일 주소를 형식에 맞지 않게 입력
6. 사용자 생년월일을 과거가 아닌 날짜로 입력
-->
<form:form modelAttribute="member" method="post" action="/validation/result2">
<table border="1">
<tr>
<td>유저 ID</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
<tr>
<td>패스워드</td>
<td>
<form:input path="password"/>
<font color="red">
<form:errors path="password" />
</font>
</td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<form:input path="email"/>
<font color="red">
<form:errors path="email" />
</font>
</td>
</tr>
<tr>
<td>생년월일</td>
<td>
<form:input path="dateOfBirth" type="date"/>
<font color="red">
<form:errors path="dateOfBirth" />
</font>
</td>
</tr>
<tr>
<td>성별</td>
<td>
<form:radiobutton path="gender" value="male" label="Male"/>
<form:radiobutton path="gender" value="female" label="Female"/>
<form:radiobutton path="gender" value="other" label="Other"/>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
- http://localhost/validation/registerValidationForm02
/*
* 4. 중첩된 자바빈즈 입력값 검증
*
* - 중첩된 자바빈즈와 자바빈즈의 컬렉션에서 정의한 프로퍼티에 대해 입력값 검증을 할 때는 @Valid를 지정한다.
*
* 1) 중첩된 자바빈즈 클래스를 정의하고 @Valid를 지정한다.
*
* - Member 클래스 내 Address address 필드에 @Valid 어노테이션을 지정
* - Member 클래스 내 List<Card> cardList 필드에 @Valid 어노테이션을 지정
*
* 2) Address 클래스 내에도 validation을 설정한다.
* 3) Card 클래스 내에도 validation을 설정한다.
*/
@RequestMapping(value = "/registerValidationForm03", method = RequestMethod.GET)
public String registerValidationForm03(Model model) {
log.info("registerValidationForm03() 실행...!");
model.addAttribute("member", new Member());
return "validation/registerValidationForm03";
}
[registerValidationForm03.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registerValidationForm03</title>
</head>
<body>
<!--
[입력값 검증 결과 테스트 시나리오]
1. 유효한 데이터 입력
2. 우편번호를 빈 값으로 입력
3. 카드번호를 빈 값으로 입력
4. 카드 유효년월 과거 날짜 입력
-->
<form:form modelAttribute="member" method="post" action="/validation/result3">
<table border="1">
<tr>
<td>유저 ID</td>
<td>
<form:input path="userId"/>
<font color="red">
<form:errors path="userId" />
</font>
</td>
</tr>
<tr>
<td>이름</td>
<td>
<form:input path="userName"/>
<font color="red">
<form:errors path="userName" />
</font>
</td>
</tr>
<tr>
<td>패스워드</td>
<td>
<form:input path="password"/>
<font color="red">
<form:errors path="password" />
</font>
</td>
</tr>
<tr>
<td>E-Mail</td>
<td>
<form:input path="email"/>
<font color="red">
<form:errors path="email" />
</font>
</td>
</tr>
<tr>
<td>생년월일</td>
<td>
<form:input path="dateOfBirth" type="date"/>
<font color="red">
<form:errors path="dateOfBirth" />
</font>
</td>
</tr>
<tr>
<td>우편번호</td>
<td>
<form:input path="address.postCode"/>
<font color="red">
<form:errors path="address.postCode" />
</font>
</td>
</tr>
<tr>
<td>주소</td>
<td>
<form:input path="address.location"/>
<font color="red">
<form:errors path="address.location" />
</font>
</td>
</tr>
<tr>
<td>카드1 - 번호</td>
<td>
<form:input path="cardList[0].no"/>
<font color="red">
<form:errors path="cardList[0].no" />
</font>
</td>
</tr>
<tr>
<td>카드1 - 유효년월</td>
<td>
<form:input path="cardList[0].validMonth"/>
<font color="red">
<form:errors path="cardList[0].validMonth" />
</font>
</td>
</tr>
<tr>
<td>카드2 - 번호</td>
<td>
<form:input path="cardList[1].no"/>
<font color="red">
<form:errors path="cardList[1].no" />
</font>
</td>
</tr>
<tr>
<td>카드2 - 유효년월</td>
<td>
<form:input path="cardList[1].validMonth"/>
<font color="red">
<form:errors path="cardList[1].validMonth" />
</font>
</td>
</tr>
</table>
<form:button name="register">등록</form:button>
</form:form>
</body>
</html>
package kr.or.ddit.vo;
import java.util.Date;
import java.util.List;
import javax.validation.Valid;
import javax.validation.constraints.Past;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
@Data
public class Member {
// 입력값 검증 규칙을 지정한다.
// 문자열이 null이 아니고 trim한 길이가 0보다 크다는 것을 검사한다.
@NotBlank(message = "아이디를 입력해주세요! X_X")
private String userId = "a001";
@NotBlank(message = "이름을 입력해주세요! X_X")
@Size(max = 3) // 이름은 3글자를 넘어가면 안 됨
private String userName = "hongkd";
@NotBlank(message = "비밀번호는 필수!")
private String password = "1234";
private int coin = 100;
// 과거 날짜인지를 검사한다.
@Past
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dateOfBirth;
// 이메일 주소 형식인지를 검사한다.
@Email
private String email;
private String gender;
private String hobby;
private String[] hobbyArray;
private List<String> hobbyList;
private boolean foreigner;
private String developer;
private String nationality;
// 중첩된 자바빈즈의 입력값 검증을 지정한다.
@Valid
private Address address;
// 자바빈즈 컬렉션의 입력값 검증을 지정한다.
@Valid
private List<Card> cardList;
private String cars;
private String[] carArray;
private List<String> carList;
private String introduction;
private String birthDay;
}
package kr.or.ddit.vo;
import org.hibernate.validator.constraints.NotBlank;
import lombok.Data;
@Data
public class Address {
@NotBlank
private String postCode;
@NotBlank
private String location;
}
package kr.or.ddit.vo;
import java.util.Date;
import javax.validation.constraints.Future;
import org.hibernate.validator.constraints.NotBlank;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
@Data
public class Card {
@NotBlank
private String no;
// 미래 날짜인지를 검사한다.
@Future
@DateTimeFormat(pattern = "yyyyMMdd")
private Date validMonth;
}
@RequestMapping(value = "/result3", method = RequestMethod.POST)
public String registerValidationForm03Result(@Validated Member member, BindingResult result) {
log.info("registerValidationForm03Result() 실행...!");
if(result.hasErrors()) {
return "validation/registerValidationForm03";
}
log.info("userId : " + member.getUserId());
log.info("dateOfBirth : " + member.getDateOfBirth());
Address address = member.getAddress();
if(address != null) {
log.info("postCode : " + address.getPostCode());
log.info("location : " + address.getLocation());
}
List<Card> cardList = member.getCardList();
if(cardList != null && cardList.size() > 0) {
for(int i = 0; i < cardList.size(); i++) {
Card card = cardList.get(i);
log.info("no : " + card.getNo());
log.info("validMonth : " + card.getValidMonth());
}
}
return "validation/success";
}
- http://localhost/validation/registerValidationForm03
'대덕인재개발원 > 대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글
231129_SPRING 2 (6-1) (0) | 2023.11.29 |
---|---|
231128_SPRING 2 (5-2) (0) | 2023.11.28 |
231127_SPRING 2 (4-2) (0) | 2023.11.27 |
231127_SPRING 2 (4-1) (0) | 2023.11.27 |
231124_SPRING 2 (3-2) (1) | 2023.11.24 |