.jsp 파일에서 값을 입력한 후 다음 단계로 전달하고 싶은 파라미터가 있을 것이다. 이때 값에 접근을 어떻게 할까
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<!-- <meta charset="UTF-8"> -->
<title><spring:message code="member.register"/></title>
</head>
<body>
<h2><spring:message code="term"/></h2>
<p>약관 내용</p>
<form action="step2" method="post">
<label>
<input type="checkbox" name="agree" value="true">
<spring:message code="term.agree"/>
</label>
<input type="submit" value="<spring:message code="next.btn" />" />
</form>
</body>
</html>
위의 코드를 보면 agree에 value를 담아 post 방식으로 전달하고 있다.
@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";
}
위의 코드를 보면 agree 값을 받아와 agree Boolean 변수에 넣어준다. 이때 요청 파라미터 값이 없으면 "false"문자열을 값으로 사용한다.
<@RequestParam 어노테이션의 속성>
POST 방식만을 처리하는 서비스는 직접 URL을 치면 오류가 난다. 그래서 이러한 요청이 들어왔을때 에러 화면이 아닌 알맞은 경로로 리다이렉트를 하는 것이 더 좋을 때가 있다.
return "redirect:경로";
@GetMapping("/register/step2")
public String handleStep2Get() {
return "redirect:/register/step1"; // 해당 주소로 GET 요청이 들어왔을 때 이 주소로 리다이렉트한다.
}
어떠한 폼에서 값을 입력한 후 이 정보들을 서버에 전송하려하는데 HttpServletRequest 객체를 사용하여 get을 한다면 굉장히 코드가 길어지고 가독성이 떨어질 것이다.
이때 사용할 수 있는 것이 커멘드 객체를 만들어서 여기서 그 정보들을 넣어 객체로서 주고 받는 것이다.
커멘드객체라고 거창한 것이 아니다. 받아올 정보들을 멤버변수로 가지고 setter, getter 함수를 가지는 객체일 뿐이다.
@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq, Errors errors){
memberRegisterService.regist(regReq);
return "register/step3";
...
}
위처럼 커멘드 객체를 가져와 사용할 수 있다.
@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq, Errors errors){
memberRegisterService.regist(regReq);
return "register/step3";
...
}
==>
<p><strong>${registerRequest.name}님</strong>
스프링 MVC는 커맨드 객체의(첫 글자를 소문자로 바꾼)클래스 이름과 동일한 속성 이름을 사용해서 커맨드 객체를 뷰에 전달할 수 있다.
만약 커맨드 객체에 접근할 때 사용할 속성 이름을 변경하고 싶다면 커맨드 객체로 사용할 파라미터에 @ModelAttribute 어노테이션을 적용하면 된다.
@PostMapping("/register/step3")
public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq){
memberRegisterService.regist(regReq);
return "register/step3";
...
}