2. 요청 매핑 애노테이션을 이용한 경로 매핑
웹 어플리케이션 개발을 위한 코드 작성
1) 특정 URL 처리를 위한 코드
2) 처리결과를 HTML과 같은 형식으로 응답하는 코드
@Controller
public class RegisterController {
private MemberRegisterService memberRegisterService;
public void setMemberRegisterService(
MemberRegisterService memberRegisterService) {
this.memberRegisterService = memberRegisterService;
}
@RequestMapping("/register/step1")
public String handleStep1() {
return "register/step1";
}
@PostMapping("/register/step2")
public String handleStep2(
@RequestParam(value = "agree", defaultValue = "false") Boolean agree,
Model model) {
if (!agree) {
return "register/step1";
}
model.addAttribute("registerRequest", new RegisterRequest());
return "register/step2";
}
@GetMapping("/register/step2")
public String handleStep2Get() {
return "redirect:/register/step1";
}
@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq) {
try {
memberRegisterService.regist(regReq);
return "register/step3";
} catch (DuplicateMemberException ex) {
return "register/step2";
}
}
}
약관 페이지
3. GET과 POST 매핑
https://lollolzkk.tistory.com/18
4. 요청 파라미터 접근
1) HttpServletRequest
@PostMapping("/register/step2_")
public String handleStep2(
HttpServletRequest request, Model model) {
String agree = request.getParameter("agree"); //요청 파라미터 값을 구함
if (!agree.equals("true")) {
return "register/step1";
}
return "register/step2";
}
2) @RequestParam
@PostMapping("/register/step2")
public String handleStep2(
@RequestParam(value = "agree", defaultValue = "false") Boolean agree,
Model model) {
if (!agree) {
return "register/step1";
}
model.addAttribute("registerRequest", new RegisterRequest());
return "register/step2";
}
@RequestParam의 value값은 input태그의 name값을 의미
5. 리다이렉트(3XX)
: 요청을 정상적으로 처리하기 위해 브라우저 측에서 추가적인 처리를 수행해야 함을 나타낸다.
- 301 Moved Permanently
- 302 Found
url에 직접 register/step2를 GET메서드로 요청할 시, 리다이렉트를 통해 step1으로 이동하게끔 처리
@GetMapping("/register/step2")
public String handleStep2Get() {
return "redirect:/register/step1";
}
브라우저의 개발자도구에서 Network를 보면 status가 302로 리다이렉트된 정보를 볼 수 있음
6. 커맨드 객체
요청 파라미터 개수가 많아질수록 Controller의 파라미터 개수도 많아짐에 따라 코드가 복잡해진다.
이를 스프링은 커맨드 객체에 파라미터를 담아주는 기능을 제공함
여기서 커맨드객체는 RegisterRequest로 요청 파라미터값을 필드값으로 가지며
각 필드값에 대한 세터함수가 존재해야한다.
RegisterRequest
public class RegisterRequest {
private String email;
private String password;
private String confirmPassword;
private String name;
//getter...
//setter...
}
컨트롤러
@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq) {
System.out.println("regReq :: " + regReq.toString());
try {
memberRegisterService.regist(regReq);
return "register/step3";
} catch (DuplicateMemberException ex) {
return "register/step2";
}
}
7. 뷰(JSP)에서 커맨드 객체 사용
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>회원가입</title>
</head>
<body>
<p><strong>${registerRequest.name}님</strong>
회원 가입을 완료했습니다.</p>
<p><a href="<c:url value='/main'/>">[첫 화면 이동]</a></p>
</body>
</html>
커맨드 객체의 첫글자는 소문자로
8. @ModelAttribute
모델에서 사용할 속성 이름을 값으로 설정 (아래의 경우 formData라는 이름으로 커맨드 객체에 접근할 수 있음)
@PostMapping("/register/step3")
public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq) {
}
9. 커맨드 객체와 스프링 폼 연동
<h2>회원 정보 입력</h2>
<form:form action="step3" modelAttribute="registerRequest">
<p>
<label>이메일:<br>
<form:input path="email" value="${registerRequest.email}"/>
</label>
</p>
<p>
<label>이름:<br>
<form:input path="name" value="${registerRequest.name}"/>
</label>
</p>
<form:form> 태그 정상 작동을 위해서 커맨드객체를 model에 넣어줘야함
@PostMapping("/register/step2_")
public String handleStep2(
HttpServletRequest request, Model model) {
String agree = request.getParameter("agree");
System.out.println("agree :: " + agree);
if (!agree.equals("true")) {
return "register/step1";
}
model.addAttribute("registerRequest", new RegisterRequest());
return "register/step2";
}
<form:form action="step3" modelAttribute="registerRequest">
10. 컨트롤러 구현 없는 경로 매핑
MvcConfig 클래스에서 /main 경로에 대해 뷰이름을 main으로 사용하겠다는 설정
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/main").setViewName("main");
}