본문 바로가기

OpenSource/Spring

간단한 Spring MVC설정(ControllerClassNameHandlerMapping)

1. 이클립스에서 file > new >dynamic web poject를 하나 생성합니다.

2. web.xml 설정 (/WebContent/WEB_INF/web.xml)
 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Spring_MVC_Ex</display-name>
 
 <!-- 인코딩을 설정하는 부분입니다.  "/*"로 들어오는 모든 것들에 대해 UTF-8인코딩을 적용합니다.-->
 <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을 호출합니다. 호출되는 파일명은 servlet-name속성에서 정의된
  이름 + "-servlet.xml"이 됩니다. 즉, 여기서는 dispatcher-servlet.xml이란 파일을 호출하겠죠. 
  DispatcherServlet은 여러개를 정의 할수 있는데 load-on-startup의 값이 작은 숫자로 된 
   DispatcherServlet부터 실행 되게 됩니다. 여기서는 하나밖에 없으니 신경쓸 필요 없을거같습니다 ㅋ-->

 <servlet>
  <servlet-name>dispatcher</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <!--요청되는 URL중에 ".do"로 끝나는 모든 요청은 dispacher에서 처리하겠다는 의미입니다.-->
 <servlet-mapping>
  <servlet-name>dispatcher</servlet-name>
  <url-pattern>*.do</url-pattern>
 </servlet-mapping>
 
 <!-- log4j 설정파일 호출하는 부분입니다. log4j에 대한 자세한 내용은 여기를 참조하세요^^ http://everlikemorning.tistory.com/category/Programming/Log4J -->
 <listener>
   <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>
 <context-param>
  <param-name>log4jConfigLocation</param-name>
   <param-value>/WEB-INF/log4j.properties</param-value>
 </context-param>
  
 <!-- 프로젝트 실행시 초기 실행되는 파일입니다. -->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
 
</web-app>

3. dispatcher-servlet.xml (/WebContent/WEB_INF/dispatcher-servlet.xml)

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

 <!-- handler mapping -->
 <bean id="urlMappingWithControllers" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"
  p:alwaysUseFullPath="true" p:order="0"/>
 
  <!-- view resolver -->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
   p:viewClass="org.springframework.web.servlet.view.JstlView"
   p:prefix="/" p:suffix=".jsp"/>

 <!-- controller -->
 <bean id="hello" class="com.lcy.controller.HelloController"/>
</beans>


handler mapping은 요청 URL과 매핑되는 컨트롤러를 찾아 해당 컨트롤러에 처리를 요청해 주는 역할을 합니다. SimpleURLHandlerMApping, BeanNameURLHandlerMapping, ControllerClassNameHandlerMapping등 여러가지가 있습니다. 여기서는 그 중에서 ControllerClassNameHandlerMapping을 사용해 보겠습니다.

 <!-- handler mapping -->
 <bean id="urlMappingWithControllers" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"
  p:alwaysUseFullPath="true" p:order="0"/>

ControllerClassNameHandlerMapping은 컨트롤러가 MultiActionController이면,
/HelloControlle/메서드명.*
아니면, HelloControlle* 의 형식이 됩니다.
여기서는 MultiActionController를 사용했고, web.xml에서 url-pattern을 "*.do"로 설정했으므로
/HelloControlle/메서드명.do 가 되겠습니다 ^^

View resolver는 컨트룰러의 처리 결과를 보여줄 뷰를 결정합니다.


  <!-- view resolver -->
  <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
   p:viewClass="org.springframework.web.servlet.view.JstlView"
   p:prefix="/" p:suffix=".jsp"/>

컨트롤러에서 세팅해주는 뷰이름의 앞에 "/"와 뒤에 ".jsp"를 자동으로 붙여서 세팅해줍니다.

다음으로 컨트롤러입니다. 요청을 처리한뒤 결과를 Dispatcher에알려 줍니다. 그러면 Dispatcher의  View resolver가 뷰를 찾아 넘기게 되는거죠.


  <!-- controller -->
 <bean id="hello" class="com.lcy.controller.HelloController"/>
</beans>

HelloController입니다.

 package com.lcy.controller;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class HelloController extends MultiActionController{
 private Logger log = Logger.getLogger(this.getClass());
 
 public ModelAndView hello(HttpServletRequest request, HttpServletResponse response) throws Exception {
  log.debug("================ Method Name : hello");
  ModelAndView mav = new ModelAndView("hello/hello");
  mav.addObject("hello", "hello world");
  return mav;
 }
 
 public ModelAndView now(HttpServletRequest request, HttpServletResponse response) throws Exception {
  log.debug("================== Method Name : now");
  ModelAndView mav = new ModelAndView("hello/now");
  Date curDate = new Date();
  mav.addObject("curDate", curDate);
  return mav;
 }

}


보시면 메서드가 hello와 now가 있습니다. 따라서 http://localhost:8090/Spring_MVC_Ex/hello/hello.do 또는, http://localhost:8090/Spring_MVC_Ex/hello/now.do 형식의 요청이 들어왔을때 각각 처리해서
hello/hello.jsp나 hello/now.jsp의 뷰를 넘겨줍니다. (앞에 "/"와 뒤의 ".jsp"는 view resolver에서 세팅되어있었죠?)


4. view파일 작성
이제 WebContent/hello/에 hello.jsp와 now.jsp를 작성해보겠습니다.

hello.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>hello page2</title>
</head>
<body>
 ${hello}
</body>
</html>

now.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>hello page2</title>
</head>
<body>
 ${curDate}
</body>
</html>

자, 이제 뷰까지 완성하고 프로젝트 클릭 > 우클릭 > run as > run on server 해서 실행하면....
404에러가 뜰겁니다.(걍 예상한거라... 다른 에러가 뜨나... ㅡ_ㅡ;;;)
암튼 원인은 web.xml에 welcome파일을 index.jsp로 설정했기때문에 이 파일이 없어서 그런거죠.
/WebContent/WEB-INF/에 index.jsp를 하나 만들어줍니다.


index.jsp
 <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <jsp:forward page="/hello/hello.do"/>
<!-- <jsp:forward page="/hello/now.do"/> -->
</body>
</html>

요청이 잘 전달될수 있도록 포워딩을 시켜줍니다.
<jsp:forward page="/hello/hello.do"/>

이제 실행하면 잘 될겁니다. http://localhost:8090/Spring_MVC_Ex/ (로컬이라 눌러봐야안됩니다. ㅡ_ㅡ^ 예전에 어떤 분이 낚이셨다고 하셨는데 ㅋㅋㅋ 하X님이었나요? ㅋㅋㅋ)
지금까지 작업한 프로젝트 구조입니다.