<url-pattern>/</url-pattern> // 이 부분으로 인해 모든 요청을 다 받아들임
// WebMvcContextConfiguration.java : DispatcherServlet이 실행될 때 읽어들이는 설정 파일
package kr.or.connect.mvcexam.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "kr.or.connect.mvcexam.controller" })
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
/* <url-pattern>/</url-pattern>을 사용해 모든 요청을 다 받아들이도록 하고 있음
* 각각의 디렉토리를 만들어 놓고 / 이하 요청이 들어오면 해당 디렉터리에서 찾는다는 의미
* URL /css/** 요청 -> /css/ 디렉터리에서 찾음
* */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
/* default servlet handler를 사용하게 한다.
* Mapping 정보가 없는 url 요청은 Spring의 DefaultServletHttpRequestHandler가 처리하게 한다.
* DefaultServletHttpRequestHandler는 WAS의 DefaultServlet에게 해당 일을 넘긴다.
* WAS는 DefaultServlet이 static한 자원을 읽어서 보여주게 한다.
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/* 특정 URL에 대한 처리를 Controller 클래스를 작성하지 않고 매핑할 수 있도록 해준다.
* 요청이 "/"로 들어오면 "main" 이름의 view로 보여준다.
* main 이름만으로는 보여줄 수 없고 view name은 ViewResolver 객체를 이용해서 찾아온다.
* 뷰 정보는 아래 getInternalResourceViewResolver()를 통해 찾는다.
* 결국 /WEB-INF/views/main.jsp 를 찾으면 된다.
*/
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
System.out.println("addViewControllers가 호출됩니다. ");
registry.addViewController("/").setViewName("main");
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926);
registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926);
registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926);
registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926);
}
/* default servlet handler를 사용하게 한다.
* Mapping 정보가 없는 url 요청은 Spring의 DefaultServletHttpRequestHandler가 처리하게 한다.
* WAS는 DefaultServlet에게 해당 일을 넘겨 static한 자원을 읽게 하고 보여주게 해준다.
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
/* 특정 URL에 대한 처리를 Controller 클래스를 작성하지 않고 매핑할 수 있도록 해준다.
* 요청이 "/"로 들어오면 "main" 이름의 view로 보여준다.
* main 이름만으로는 보여줄 수 없고 view name은 ViewResolver 객체를 이용해서 찾아온다.
* 뷰 정보는 아래 getInternalResourceViewResolver()를 통해 찾는다.
* 결국 /WEB-INF/views/main.jsp 를 찾으면 된다.
*/
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
System.out.println("addViewControllers가 호출됩니다. ");
registry.addViewController("/").setViewName("main");
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<display-name>Spring JavaConfig Sample</display-name>
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 설정 파일 클래스가 등록되고 있다. 항상 패키지명까지 포함해서 등록해야 한다. -->
<!-- AnnotationConfigWebApplicationContext를 사용할 것이다. 컨테이너 등록 -->
<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>kr.or.connect.mvcexam.config.WebMvcContextConfiguration</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- url이 "/" 즉 모든 요청이 들어오면 -->
<!-- mvc라는 이름을 가진 sevlet element 안에 있는 mvc를 찾고 그곳에 등록되어 있는 servlet-class를 본다. -->
<!-- Spring이 제공하고 있는 DispatcherServlet를 FrontController로 하는 것을 볼 수 있다. -->
<servlet-name>mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
결과