DispatcherServlet이 모든 연결을 담당.
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
//전달받은 설정 파일을 이용해서 스프링 컨테이너를 생성
//이때 사용하는 설정파일에 이들 빈에 대한 정의가 포함되어 있어야함
</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
config.MemberConfig
config.MvcConfig
config.ControllerConfig
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
DispatcherServlet은 스프링 컨테이너에서 HandlerMapping과 HandlerAdapter 타입의 빈을 사용하므로 핸들러에 알맞은 빈이 스프링 설정에 등록되어 있어야함
-> @EnableWebMvc 애노테이션 추가로 가능!
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{
@EnableWebMvc 애노테이션으로 추가되는 빈 객체 클래스 중에는 다음 두 클래스가 포함되어 있다.
@EnableWebMvc 애노테이션을 사용하면 WebMvcConfigurer 타입 빈을 이용해서 mvc 설정을 추가로 생성한다.
@Configuration
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer{
//HandlerMapping 역할
@Override
public void configureDefaultServletHandling(
DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//ViewResolver 역할
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
}
WebMvcConfigurer 인터페이스를 상속하고있다. 그러므로 MvcConfig는 WebMvcConfigurer 타입 빈이 된다.
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
컨트롤러의 실행결과를 받은 DispatcherServlet은 ViewREsolver에게 뷰 이름에 해당하는 View 객체를 요청.
Model에 담긴 값은 View 객체에 Map 형식으로 전달된다. Map 객체에 담겨있는 키 값을 request.setAttribute()를 이용해서 request의 속성에 저장한 후 해당 경로의 jsp를 실행한다. 결과적으로 컨트롤러에서 지정한 Model 속성은 request 객체 속성으로 jsp에 전달되기 때문에 jsp는 모델에 지정한 속성이름을 사용해서 값을 사용할 수있게 된다.
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
DispatcherSevlet에 대한 매핑경로가 "/"인 경우 .jsp로 끝나는 요청을 제외한 모든 요청을 DispatcherServlet이 처리한다. 그런데 @EnableWebMvc 애노테이션이 등록하는 HandlerMapping은 @Controller 애노테이션을 적용한 빈 객체가 처리할 수 있는 요청 경로만 대응할 수 있다.