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
<%@ 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/을 입력하는 경우 위의 화면이 보여지는 원인은 다음과 같다.
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 |