1. @RequestMapping, @GetMapping, @PostMapping

@DeleteMapping, @PutMapping ... 별거없으므로 설명하지않겠다.

@Controller
@RequestMapping("/survey")
public class SurveyController {

    @GetMapping
    public String form() { ... }

    @PostMapping
    public String submit(@ModelAttribute("ansData") AnsweredData data) { ... }
}

2. 리다이렉트

/join 접속시 /register/step1 로 redirect 하는 예제

@Controller
public class RegisterController {

    @GetMapping("/join")
    public String redirectToStep1() {
        return "redirect:/register/step1";
    }

    @GetMapping("/register/step1")
    public String register() {
    }
}

 

"redirect: (경로)" 를 리턴하면 됨.

 

이 때 (경로)가 "/"로 시작할 경우 웹 애플리케이션 경로(context path)를 기준으로 이동경로를 생성함.

 

* 웹 애플리케이션과 Context Path 란? *

dololak.tistory.com/155

 

3. 요청 파라미터 접근

HTML form 태그로부터 오는 요청을 받는 방법

3.1 HttpServletRequest 직접 이용

@Controller
@RequestMapping("/register")
public class JoinController {

    @PostMapping("/step2")
    public String handleStep2(HttpServletRequest request) {
        String agreeParam = request.getParameter("agree");
        
        if (Objects.isNull(agreeParam) || "true".equals(agreeParam)) {
            return "join/writeinfo";
        }
        return "join/agree";
    }
}

3.2 @RequestParam 어노테이션 이용

@Controller
@RequestMapping("/register")
public class RegisterController {

    @PostMapping("/step2")
    public String handleStep2(@RequestParam(required="true" defaultValue=false) Boolean agree) {
        if (!agreeValue) {
            return "register/step1";
        }
        return "register/step2";
    }
}
@Controller
@RequestMapping("/register")
public class RegisterController {

    @PostMapping("/step2")
    public String handleStep2(@RequestParam(value="agree" required="true" defaultValue=false) Boolean agreeValue) {
        if (!agreeValue) {
            return "register/step1";
        }
        return "register/step2";
    }
}

 

* @RequestParam 속성

value

HTTP request 파라미터 이름 지정

디폴트는 파라미터 변수 이름

 

required

required=true 인 파라미터에 들어가는 값이 없으면 exception 발생

 

defaultValue

파라미터에 들어가는 값이 없을 때 default로 집어넣을 값 설정

 

3.3 커맨드 객체를 이용해서 요청 파라미터 사용하기

@Controller
@RequestMapping("/register")
public class RegisterController {

    @PostMapping("/step1")
    public String agree(AgreeRequest agreeRequest) {
        if (!agreeRequest.isAgree()) {
            return "register/step1";
        }
        return "register/step2";
    }
}

앞서 HttpServletRequest 혹은 @RequestParam 으로 요청 파라미터를 받는 방식은 파라미터가 많아질 경우 유지보수적으로 안좋아지는데 이 때 커멘드 객체를 이용해서 요청 파라미터를 받으면 된다.

 

4. 커멘드 객체를 뷰(JSP)에서 사용하기

스프링 MVC 는 커맨드 객체의(첫 글자를 소문자로 바꾼) 클래스 이름과 동일한 속성 이름을 사용해서 커맨드 객체를 뷰에 전달한다.

 

@ModelAttribute 어노테이션으로 커맨드 객체 속성 이름 변경

@Controller
@RequestMapping("/register")
public class RegisterController {
    
    @PostMapping("/step1")
    public String agree(AgreeRequest agreeRequest) {
        if (!agreeRequest.isAgree()) {
            return "register/step1";
        }
        return "register/step2";
    }
}

 

WEB-INF/view/register/step2.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
    <title>회원가입</title>
</head>
<body>
    <p>약관 동의 결과 : ${agreeRequest.agree}</p>    <!-- true -->
</body>
</html>

5 커맨드 객체와 스프링 폼 연동

스프링 MVC는 <form:form>, <form:input> 등,

HTML 폼과 커맨드 객체를 연동하기 위한 JSP 태그 라이브러리를 제공한다.

 

* 회원가입 입력 오류시 이메일과 이름을 이전값으로 채워넣는 예제

1. <form:form> 사용 전

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>회원가입</title>
</head>
<body>
    <h2>회원 정보 입력</h2>
    <form action="step3" method="post">
    <p>
        <label>이메일:<br>
        <input type="text" name="email" value="${registerRequest.email}"/>
        </label>
    </p>
    <p>
        <label>이름:<br>
        <input type="text" name="name" value="${registerRequest.name}"/>
        </label>
    </p>
    <p>
        <label>비밀번호:<br>
        <input type="password" name="password"/>
        </label>
    </p>
    <p>
        <label>비밀번호 확인:<br>
            <input type="password" name="confirmPassword"/>
        </label>
    </p>
    <input type="submit" value="가입 완료">
    </form>
</body>
</html>

2. <form:form> 사용

<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
    <title>회원가입</title>
</head>
<body>
    <h2>회원 정보 입력</h2>
    <form:form action="step3" method="post" modelAttribute="registerRequest">
    <p>
        <label>이메일:<br>
        <form:input path="email"/>
        </label>
    </p>
    <p>
        <label>이름:<br>
        <form:input path="name"/>
        </label>
    </p>
    <p>
        <label>비밀번호:<br>
        <form:password path="password"/>
        </label>
    </p>
    <p>
        <label>비밀번호 확인:<br>
            <form:password path="confirmPassword"/>
        </label>
    </p>
    <input type="submit" value="가입 완료">
    </form:form>
</body>
</html>

 

DispatcherServlet 은 컨트롤러의 실행 결과를 HandlerAdapter를 통해서 ModelAndView 형태로 받는다.

그런 다음 DispatcherServlet은 ViewResolver에게 View 객체를 요청하고, 리턴된 View 객체에게 응답 생성을 요청한다.

바로 이 때, 즉 DispatcherServlet이 View객체에게 응답 생성을 요청할 때

Model에 담긴 값을 Map 형식으로 전달한다.

 

이 예제의 경우 key가 "registerRequest" 이고 값이 RegisterRequest 객체인 요소가 Map 에 들어있는 것이다. 이 Map이 View에게 전달되는 것이다.

 

그런데 <form:form ... modelAtribute="(attributeName)"> 에서 (attributeName) 을 key로 갖는 객체가 이 Map에 없으면 Internal Server Error 가 발생한다. <form:form> 을 사용할때는 이에 대응하는 modelAttribute 가 반드시 존재해야한다.

 

6 컨트롤러 구현 없는 경로 매핑

<p><a href="<c:url value='/main'/>">[첫화면으로 이동]</a></p>
@Controller
public class MainController {
    @RequestMapping("/main")
    public String main() {
        return "main";
    }
}

위 컨트롤러 코드는 요청 경로와 뷰 이름을 연결해주는것에 불과하다.

이런 경우 다음과 같이 WebMvc 설정코드로 대체할 수 있다.

package config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

	...

	@Override
	public void addViewControllers(ViewControllerRegistry registry) {
		registry.addViewController("/main")
			.setViewName("main");
	}
}

 

 

커맨드 객체 : 중첩, 컬렉션 프로퍼티

.

 

Model 을 통해 컨트롤러에서 뷰에 데이터 전달하기

.

 


웹 애플리케이션 경로(context path)

dololak.tistory.com/155

+ Recent posts