본문 바로가기
카테고리 없음

[스터디] 11장

by foreverever 2022. 9. 4.
반응형

 

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");
}

 

반응형