View 와 controller의 개발과 설정

1. JSTL 설정과 JSP 헤더 파일 추가

1-1. war/WEB-INF/lib에 아래 파일을 추가한다.

spring-framework-2.5/lib/j2ee/jstl.jar
spring-framework-2.5/lib/jakarta-taglibs/standard.jar

1-2. jsp를 보관할 디렉토리를 war/WEB-INF/ 에 생성한다.

war/WEB-INF/jsp

1-3. header 파일이 될 include.jsp 파일을 생성한다.

war/WEB-INF/jsp/include.jsp

<%@ page session="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

1-4. index.jsp를 업데이트하여 모든 요청이 framework을 통하도록 한다.

<%@ include file="/WEB-INF/jsp/include.jsp" %>
<c:redirect url="/hello.htm"/>

1-5. hello.jsp를 war/WEB-INF/jsp/ 로 이동하고 수정한다.

war/WEB-INF/jsp/hello.jsp

<%@ include file="/WEB-INF/jsp/include.jsp" %>

<html>
  <head><title>Hello :: Spring Application</title></head>
  <body>
    <h1>Hello - Spring Application</h1>
    <p>Greetings, it is now <c:out value="${now}"/></p>
  </body>
</html>

2. controller를 수정한다.

2-1. 모델의 key를 "now"로 테스트를 수정한다.

package springapp.web;

import org.springframework.web.servlet.ModelAndView;

import springapp.web.HelloController;

import junit.framework.TestCase;

public class HelloControllerTests extends TestCase {

    public void testHandleRequestView() throws Exception{
        HelloController controller = new HelloController();
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("WEB-INF/jsp/hello.jsp", modelAndView.getViewName());
        assertNotNull(modelAndView.getModel());
        String nowValue = (String) modelAndView.getModel().get("now");
        assertNotNull(nowValue);
    }
}

2-2. tests 태스크를 실행한다.

now라는 key가 없으므로 에러가 발생한다.

2-3. HelloController에 날자를 기준으로 now key를 설정한다.

package springapp.web;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.util.Date;

public class HelloController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String now = (new Date()).toString();
        logger.info("Returning hello view with " + now);

        return new ModelAndView("WEB-INF/jsp/hello.jsp", "now", now);
    }

}


2-4. tests 태스크를 재실행하여 성공한다.

2-5. http://localhost:8080/springapp/ 을 웹 브라우저에 입력하여 아래와 같은 정상적인 화면을 본다.

사용자 삽입 이미지

http://localhost:8080/springapp/을 입력하는 경우 위의 화면이 보여지는 원인은 다음과 같다.

web.xml에 welcome-file을 index.jsp로 설정했으므로 index.jsp를 호출한다.
index.jsp에서는 hello.htm으로 redirect하라고 했다.
web.xml에 설정한 바에 따르면 *.htm=> springapp => org.springframework.web.servlet.DispatcherServlet의 순서로 호출한다.
DispatcherServlet은 spring의 servlet이므로 springapp_servlet.xml을 읽는다.
springapp_servlet.xml의 설정에 hello.htm은 springapp.web.HelloController로 되어 있으므로 HelloController를 호출한다.
그 후에 HelloController에서 hello.jsp view를 호출하므로 화면이 보여진다.

3. controller와 view의 결합을 제거

3-1. view에 대한 설정을 한다.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
   
    <!-- the application context definition for the springapp DispatcherServlet -->
   
    <bean name="/hello.htm" class="springapp.web.HelloController"/>
   
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>       
    </bean>
           
</beans>

3-2. controller 테스트에서 view name을 변경한 후에 테스트를 실행하여 실패를 확인한다.

package springapp.web;

import org.springframework.web.servlet.ModelAndView;

import springapp.web.HelloController;

import junit.framework.TestCase;

public class HelloControllerTests extends TestCase {

    public void testHandleRequestView() throws Exception{
        HelloController controller = new HelloController();
        ModelAndView modelAndView = controller.handleRequest(null, null);
        assertEquals("hello", modelAndView.getViewName());
        assertNotNull(modelAndView.getModel());
        String nowValue = (String) modelAndView.getModel().get("now");
        assertNotNull(nowValue);
    }
}

3-3. controller소스안의 view 이름을 logical명으로 변경한 후에 재테스트하면 성공한다.

package springapp.web;

import org.springframework.web.servlet.mvc.Controller;
import org.springframework.web.servlet.ModelAndView;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;
import java.util.Date;

public class HelloController implements Controller {

    protected final Log logger = LogFactory.getLog(getClass());

    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String now = (new Date()).toString();
        logger.info("Returning hello view with " + now);

        return new ModelAndView("hello", "now", now);
    }

}

  • 현 시점의 디렉토리 구조

사용자 삽입 이미지


'개발 > 스프링' 카테고리의 다른 글

스프링 tutorial (6)  (0) 2008.07.26
스프링 tutorial (5)  (0) 2008.07.25
스프링 tutorial (4)  (0) 2008.07.17
스프링 tutorial (2)  (0) 2008.07.16
스프링 tutorial (1)  (0) 2008.07.16
Posted by 무혹
,