Spring Framework MVC application step-by-step part2

จากเว็บ 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

About llun

Just a programmer

,

  • http://www.facebook.com/people/Kuan-Panthephin/100001267766431 Kuan Panthephin

    รันไม่ได้ค่ะอันนี้ เหมือนกันมันบอกว่า prodMan ยังว่างอยู่