จากเว็บ http://www.springframework.org/docs/MVC-step-by-step/Spring-MVC-step-by-step-Part-2.html จะเริ่มที่ Step13 แต่ที่เขียนจากตอนที่แล้วรู้สึกขั้นสุดท้ายจะเป็น Step 8 แฮะ งั้นคราวนี้ก็เริ่มที่ Step 9 ละกัน
Step9 ปรับ index.jsp ให้ดีขึ้นหน่อย
- ขั้นแรกเลย Copy ไฟล์ jstl.jar จาก spring-framework-2.0/lib/j2ee/ มาใส่ไว้ใน WEB-INF/lib
- Copy ไฟล์ standard.jar จาก spring-framework-2.0/lib/jakarta-taglib/ มาใส่ไว้ใน WEB-INF/lib
- เข้าไปใน Eclipse แล้วกด F5 หรือ Refresh เพื่อให้ Library ที่ copy มาใส่ โผล่ขึ้นมา
- สร้าง Directory jsp ขึ้นมาใน Directory /WEB-INF เพื่อแยกไฟล์ jsp มาอยู่ในนี้ให้เป็นระเบียบ และกันไม่ให้สามารถเรียกไฟล์ jsp ได้โดยตรงเพื่อความปลอดภัย
- สร้างไฟล์ include.jsp ใน Directory ที่สร้างขึ้นมาใหม่ เพื่อรวบรวม tag ต่างๆ ที่ใช้เหมือนกันในทุกไฟล์ แล้วพิมพ์โค้ดตามด้านล่างลงไป
<%@ page session="true" %> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt" %>
- แก้ไขหน้า index.jsp ตามโค้ดด้านล่าง
<%@ include file="/WEB-INF/jsp/include.jsp" %> <%-- Redirected beacause we can't set welcome page to a virtual URL. --%> <c:redirect url="/hello.htm" />
Step10 ปรับ View กับ Controller ให้ดีขึ้น
- ย้ายไฟล์ hello.jsp มายัง Directory /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>
- แก้ไขคลาส SpringappController เพื่อให้ทำงานมากขึ้นหน่อย (gen เวลาที่เปิดหน้านี้ขึ้นมาแล้วนำมาแสดง) จากนั้นลองรัน Springapp ดูจะได้หน้า hello ที่แสดงเวลาปัจจุบันขึ้นมา
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(); return new ModelAndView("WEB-INF/jsp/hello.jsp", "now", now); } }
Step11 แก้ไข View กับ Controller ให้ดูดีขึ้นอีก
- จากขั้นตอนด้านบน Controller เมื่อทำงานเสร็จจะเปลี่ยนไป View ยังต้องระบุ Path แบบเต็มๆ อยู่ ในขั้นนี้จะแก้ให้ระบุเพียงแต่ชื่อไฟล์
- แก้ไข springapp-servlet.xml โดยเพิ่ม ViewResolver เข้าไปตามโค้ดด้านล่าง
<?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>/WEB-INF/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans>
- แก้ไข Controller โดยเอา prefix กับ suffix จากหน้าที่จะส่งต่อออก จากนั้นก็ลองรันดูใหม่
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(); return new ModelAndView("hello ", "now", now); }
Step12 เพิ่ม Class สำหรับ business logic
- จากโค้ดที่ทำมาทั้งหมด Application นี้ยังทำไรไม่มากนัก (ไม่ทำไรเลยมากกว่าแค่โชว์ว่าเข้ามาดูเมื่อไหร่) ฉะนั้นก็เลยเพิ่ม business logic ขึ้นมานิดหน่อยแต่ก่อนอื่นต้องสร้างคลาสที่เก็บข้อมูลขึ้นมาก่อนสองคลาส
- คลิกขวาที่ Java Resource ใน Eclipse แล้วเลือก New -> Class
- ใส่ชื่อ Package เป็น bus และชื่อคลาส เป็น Product ที่ช่อง Implements กด Add และพิมพ์ Serializable จากนั้นกด OK แล้วก็ Finish เพื่อสร้างคลาส Product
package bus; import java.io.Serializable; @SuppressWarnings("serial") public class Product implements Serializable { private String description; private Double price; public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } }
- สร้างคลาส ProductManager เหมือน Product
package bus; import java.io.Serializable; @SuppressWarnings("serial") public class ProductManager implements Serializable { private List products; public void setProducts(List p) { products = p; } public List getProducts() { return products; } }
- ปรับปรุง SpringappController ให้ดีขึ้น
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(); 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; } }
Step13 แก้ไข View เพื่อให้แสดงข้อมูลจาก Product
- เพิ่ม tag foreach เข้าไปเพื่อให้วนแสดงข้อมูลออกมาทั้งหมดในไฟล์ hello.jsp สำหรับ tag fmt:message จะพูดถึงภายหลัง
<%@ include file="/WEB-INF/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>
Step14 เพิ่มข้อมูลตัวอย่างสำหรับทดสอบ แก้ไขไฟล์ springapp-servlet.xml เพื่อให้เก็บข้อมูลและ map message ตามโค้ดด้านล่าง
<?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="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.ReloadableResourceBundleMessageSource">
<property name="basename">
<value>WEB-INF/messages</value>
</property>
</bean>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello.htm">springappController</prop>
<prop key="/priceincrease.htm">priceIncreaseForm</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>/WEB-INF/jsp/</value> </property>
<property name="suffix"> <value>.jsp</value>
</property>
</bean>
</beans>
Step15 สร้าง message และลองรัน
- สร้างไฟล์ message.properties ใน /WEB-INF แล้วใส่โค้ดตามด้านล่างลงไป เซฟแล้วลองรัน
title=SpringAppheading=Hello :: Spring Applicationgreeting=Greeting, it is now