Hello Spring!! 확장II
이번에는 이전의 예제 보다 더 변형을 시켜 보겠습니다…
비즈니스 로직, 빈즈, 메시지 리소스 번들 등이 추가되었는데 큰 흐름을 이해한다는 관점에서 천천히 따라해 보시기 바랍니다. 이전 강좌 내용에 이어서 진행됩니다.
1. Conreoller에서 VIEW를 부를 때 뷰 이름에서 prefix and suffix를 제거하기 위해 다음과 같이 /WEB-INF/springapp-servlet.xml 파일을 수정 합니다. 즉 /jsp/hello.jsp 라고 부르는 것을 hello 만으로 부르겠다는 의미 입니다.
[springapp-servlet.xml]
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><!-- - Application context definition for "springapp" DispatcherServlet. -->
<beans>
<bean id="springappController" class="SpringappController"/>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">springappController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
</beans>
2. 이번엔 Controller 입니다. new ModelAndView 부분이 어떻게 변했는지 잘 보세요~~~
[SpringappController.java]
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 java.io.IOException;
public class SpringappController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String now = (new java.util.Date()).toString();
//now 라는 이름으로 현재시간을 담고 있는 객체를 메모리에 저장 합니다.
//이것을 View 역할을 하는 JSP(hello.jsp)에서 사용 합니다.
//return new ModelAndView("/jsp/hello.jsp", "now", now); 이전 강좌에서는 이렇게… 했죠^^
return new ModelAndView("hello", "now", now);
}
}
3. 이번엔 간단한 비즈니스 로직을 추가해 볼까요… bus package에 만듭니다. 이 비즈니스 로직을 가지는 클래스는 서로 다른 Application Layer를 왔다 갔다 할 수 있으므로 Sericalizable을 구현했습니다.
[Product.java]
package bus;
import java.io.Serializable;
public class Product implements Serializable
{
private String description;
private Double price;
public void setDescription(String s) {
description = s;
}
public String getDescription() {
return description;
}
public void setPrice(Double d) {
price = d;
}
public Double getPrice() {
return price;
}
}
4. 위에서 만든 Product Class를 다루기 위한 ProductManager.java 파일을 만듭니다. Product list를 가지고 있는 자바 빈 입니다. bus package에 만드세요~
[ProductManager.java]
package bus;
import java.io.Serializable;
import java.util.List;
public class ProductManager implements Serializable {
private List products;
public void setProducts(List p) {
products = p;
}
public List getProducts() {
return products;
}
}
5. 이번엔 ProductManager의 참조를 가지는 Controller를 바꾸어 보자구요,,, 그리고 뷰에 product 정보를 넘기기 위한 부분도 있으니 잘 보세요… getModelAndView 메소드는 date와 time 그리고 ProductManager의 참조를 리턴 합니다.
(비즈니스 로직과 web 영역을 분리하기 위해 Controller를 web package를 새로 만들어 이동 시켰습니다.)
[SpringappController.java]
package 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 java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import bus.Product;
import bus.ProductManager;
public class SpringappController implements Controller {
private ProductManager prodMan;
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String now = (new java.util.Date()).toString();
//now 라는 이름으로 현재시간을 담고 있는 객체를 메모리에 저장 합니다.
//이것을 View 역할을 하는 JSP(hello.jsp)에서 사용 합니다.
//return new ModelAndView("/jsp/hello.jsp", "now", now);
Map myModel = new HashMap();
myModel.put("now", now);
myModel.put("products", getProductManager().getProducts());
return new ModelAndView("hello", "model", myModel);
}
public void setProductManager(ProductManager pm) {
prodMan = pm;
}
public ProductManager getProductManager() {
return prodMan;
}
}
6. 이번엔 VIEW 역할을 하는 JSP를 수정해 볼까요… 비즈니스 데이터와 메시지 번들 처리를 위한 부분이 추가 되는데 JSTL의 <c:forEach> 태그를 이용하여 product 정보를 Display 하며 title과 인사말을 JSTL의 <fmt:message> 태그를 이용하여 Display 했습니다.
[hello.jsp]
<%@ include file="/jsp/include.jsp"%>
<html>
<head>
<title><fmt:message key="title" /></title>
</head>
<body>
<h1><fmt:message key="heading" /></h1>
<p><fmt:message key="greeting" /> <c:out value="${model.now}" /></p>
<h3>Products</h3>
<c:forEach items="${model.products}" var="prod">
<c:out value="${prod.description}" />
<i>$<c:out value="${prod.price}" /></i>
<br>
<br>
</c:forEach>
</body>
</html>
7. /WEB-INF/springapp-servlet.xml 파일을 수정 합니다. 빈과 메시지 리소스 번들을 사용하기 위한 부분이 추가 되었습니다.
[springapp-servlet.xml]
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"><!-- - Application context definition for "springapp" DispatcherServlet. --><beans> <bean id="springappController" class="web.SpringappController">
<property name="productManager">
<ref bean="prodMan"/>
</property>
</bean>
<bean id="prodMan" class="bus.ProductManager">
<property name="products">
<list>
<ref bean="product1"/>
<ref bean="product2"/>
<ref bean="product3"/>
</list>
</property>
</bean>
<bean id="product1" class="bus.Product">
<property name="description"><value>Lamp</value></property>
<property name="price"><value>5.75</value></property>
</bean>
<bean id="product2" class="bus.Product">
<property name="description"><value>Table</value></property>
<property name="price"><value>75.25</value></property>
</bean>
<bean id="product3" class="bus.Product">
<property name="description"><value>Chair</value></property>
<property name="price"><value>22.79</value></property>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename"><value>messages</value></property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">springappController</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property>
<property name="prefix"><value>/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>
</beans>
8. 이번에는 메시지 처리를 위한 WEB-INF/classes/messages.properties
파일을 작성 합니다.
[messages.properties ]
title=Spring Application
heading=Hello Spring Application
greeting=Hello~ OracleJava
8. 결과 확인
http://localhost:8080/springapp/hello.htm
댓글 없음:
댓글 쓰기