JSP를 위한 ViewResolver
컨트롤러 처리 결과를 JSP를 이용해서 생성하기 위해 다음과 같은 설정을 사용해야 합니다.
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.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
WebMvcConfigurer 인터페이스에 정의된 configureViewResolvers() 메서드는 ViewResolverRegistry 타입의 registry 파라미터를 갖습니다. ViewResolver Registry.jsp() 메서드를 사용하면 JSP를 위한 ViewResolver를 설정할 수 있습니다.
위 설정은 InternalResourceViewResolver 클래스를 이용해서 아래의 소스와 같이 빈을 등록합니다.
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver vr = new InternalResourceviewResolver();
vr.setPrefix("/WEB-INF/view/");
vr.setSuffix(".jsp");
return vr;
}
컨트롤러의 실행 결과를 받은 DispatcherServlet은 ViewResolver에게 뷰 이름에 해당하는 View 객체를 요청합니다. 이때, InternalResourceViewResolver는 "prefix+뷰이름+suffix"에 해당하는 경로를 뷰 코드로 사용하는 InternalResourceView타입의 View 객체를 리턴합니다. 예로, 뷰 이름이 hello 일 때, /WEB-INF/view/hello.jsp 경로를 뷰 코드로 사용하는 InternalResourceView 객체를 리턴합니다.
DispatcherServlet이 InternalResourceView 객체에 응답 생성을 요청하면 InternalResourceView 객체는 경로에 지정한 JSP 코드를 실행해서 응답 결과를 생성합니다.
DispatcherServlet은 컨트롤러의 실행 결과를 HandlerAdpater를 통해서 ModelAndView 형태로 주고받는데, Model에 담긴 값은 View 객체에 Map 형식으로 전달됩니다.
package chap09;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model,
@RequestParam(value = "name", required = false) String name) {
model.addAttribute("greeting", "안녕하세요, " + name);
return "hello";
}
}
위 소스의 경우 DispatcherServlet은 View 객체에 응답 생성을 요청할 때 greeting 키를 갖는 Map 객체를 View 객체에 전달합니다. View 객체는 전달받은 Map 객체에 담긴 값을 이용해서 알맞은 응답 결과를 출력합니다. InternalResourceView는 Map 객체에 담겨 있는 키 값을 request.setAttribute()를 이용해서 request의 속성에 저장합니다. 그런 뒤에 해당 경로의 JSP를 실행합니다.
결과적으로 컨트롤러에서 지정한 Model 속성은 request 객체 속성으로 JSP에 전달되기 때문에 JSP는 다음과 같이 모델에 지정한 속성 이름을 사용해서 값을 사용할 수 있게 됩니다.
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
인사말: ${greeting}
</body>
</html>
'Spring' 카테고리의 다른 글
[Spring] MVC 주요 에러 발생 원인 알아보기 (Logback 설정) (0) | 2024.04.17 |
---|---|
[Spring] 디폴트 핸들러와 HandlerMapping의 우선순위 (0) | 2024.04.08 |
[Spring] WebMvcConfigurer 인터페이스와 설정 (0) | 2024.04.03 |
[Spring] DispatcherServlet과 스프링 컨테이너 (0) | 2024.04.03 |
[Spring] controller와 handler (0) | 2024.04.01 |