스프링은 요청 파라미터 값을 커맨드(command)객체에 담아주는 기능을 제공.
요청 파라미터 값을 전달받을 수 있는 세터 메서드를 포함하는 객체를 커맨드 객체로 사용함.
//객체를 담을 변수생성
private MemberRegisterService memberRegisterService;
//MemberRegisterService 빈객체가 등록되어있고, MemberDao를 함께 주입 받는다.
public void setMemberRegisterService(
MemberRegisterService memberRegisterService ) {
this.memberRegisterService = memberRegisterService;
}
@PostMapping("/register/step3")
public String handleStep3(RegisterRequest regReq) {//커맨드객체로 요청 파라미터 값을 전달 받음
try {
memberRegisterService.regist(regReq);
return "register/step3";
}catch(DuplicateFormatFlagsException ex) {//동일한 회원이 있을 경우 익셉션 발생
return "register/step2";
}
}
RegisterRequest는 세터메서드를 포함하고 있으며, 여기서 커맨드객체이다.
<p><strong>${registerRequest.name }님</strong>
회원가입을 완료했습니다.</p>
<p><a href="<c:url value='/main'/>">[첫 화면 이동]</a>
registerRequest는 커맨드객체에 접근할때 사용한 속성 이름이다.
속성 이름은 @ModelAttribute 애노테이션으로 변경할 수 있다.
↓
@PostMapping("/register/step3")
public String handleStep3(@ModelAttribute("formData") RegisterRequest regReq){
}
스프링 MVC가 제공하는 커스텀 태그를 사용하면 더 간단히 커맨드 객체의 값을 출력할 수 있다.
: < form:form>, < form:input>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 추가해야함
<h2>회원 정보 입력</h2>
<form:form action="step3" modelAttribute="registerRequest">
<p>
<label>이메일:<br>
<form:input path="email"/>
</label>
</p>
<p>
<label>비밀번호:<br>
<form:password path="password"/>
</label>
</p>
<input type="submit" value="가입완료">
</form:form>
< form:form> 태그를 사용하려면 커맨드 객체가 존재해야하며, 커맨드객체를 필요로 하는 view 페이지로 넘어오는 단게에서 해당 객체를 Model에 넣어야 form 태그가 정상 작동한다.
@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";
}
addViewControllers()메서드를 사용하면 컨트롤러 구현 없이 간단한 코드로 요청경로와 뷰 이름을 연결할 수 있다.
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/main").setViewName("main");
}