1) xml spring 설정 읽어들이도록 DispatcherServlet 설정
2) Java config spring 설정 읽어들이도록 DispatcherServlet 설정
url-pattern을 '/'으로 두어 모든 요청이 들어올 수 있도록 함
JavaConfig로 DispatcherServlet이 읽어들여야 할 설정을 정의
@Configuration
Java Config 파일임을 명시
@EnableWebMvc
Web에 필요한 대부분의 빈들을 자동으로 설정
@ComponentScan
WebMvcConfigurerAdapter
@RequestMapping
@RequestMapping(value="/users", method=RequestMethod.POST)
@RequestMapping(method = RequestMethod.GET, headers = "content-type=application/json")
@RequestMapping(method = RequestMethod.GET, params = "type=raw")
@RequestMapping(method = RequestMethod.GET, consumes = "application/json")
@RequestMapping(method = RequestMethod.GET, produces = "application/json")
전체적인 파일 구조는 아래 사진 참고
WebMvcContextConfiguration.java
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" })
// controller에서 컴포넌트 스캔할 것, base packages는 꼭 지정하기
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// css, img 등의 파일들까지 요청 들어올 때는 특정 부분에서만 찾도록 하여 컨트롤러 request mapping까지 가지 않도록 함
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를 사용하게 합니다.
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// 핸들러 사용 -> 매핑 정보가 없는 url 요청을 처리
// WAS의 default servlet에 넘김 -> static한 자원 읽어 view
configurer.enable();
}
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
// 특정 URL에 대한 처리를 컨트롤러 클래스 작성하지 않고 처리
System.out.println("addViewControllers가 호출됩니다. ");
registry.addViewController("/").setViewName("main");
}
@Bean
public InternalResourceViewResolver getInternalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // view name 앞에 붙임
resolver.setSuffix(".jsp"); // view name 뒤에 붙임
// 즉 이 메서드를 거쳐 /WEB-INF/views/main.jsp 파일을 보여주게 되는 것
return resolver;
}
}
web.xml
<?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>Archetype Created Web Application</display-name>
<servlet>
<!-- servlet-mapping과 연결되어 있음 -->
<servlet-name>mvc</servlet-name>
<!-- Front Controller로 사용하기 위해 DispatcherServlet 클래스 등록 -->
<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>
<!-- Configuration 정보 읽어내기 위해 위치 등록 -->
<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>
<servlet-name>mvc</servlet-name>
<!-- 모든 요청이 들어오면 servlet-name과 같은 서블릿에 등록되어 있는 서블릿 클래스 실행 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
main.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h1>main page!</h1>
</body>
</html>
No mapping found for HTTP request with URI [/mvcexam/] in DispatcherServlet with name 'mvc'
web.xml is missing and <failOnMissingWebXml> is set to true
크게 다음과 같은 두가지 에러를 마주쳤다. 첫번째는 구글링해보니 컨트롤러 부분과 관련이 있다는데, 나는 addViewControllers를 사용하고 있는지라 관련이 없어보였다.
두번째 문제는 web.xml 파일과 pom.xml 파일 간의 에러였는데 Deployment Assembly를 건들다가 생긴 오류 같았다.
아래는 정상적으로 동작한 프로젝트의 deploy path이니 나중에 에러가 난다면 참고해봐야겠다.
분명 코드도 잘 작성했고 버전도 맞고 다른사람들 보니 잘 작동되는 듯 했는데 안되고 몇시간째 해결책을 찾던 중 다음 글을 발견했다.
https://stackoverflow.com/questions/28054929/eclipse-fails-to-import-maven-project
결국 이클립스 설정을 건들다보니 꼬여버렸던 것 같다. 하루를 지나지 않고 문제가 해결되어 참 다행이었다...