Spring Framework 筆記 (一)
當你要開發一個系統的時候,除非只是一個很小的系統,否則搭配一個適合的 Framework 可以簡化你以後開發的速度。例如在 Windows Application 開發上有微軟的 MFC 或 Borland 的 VCL,而在 Web Application 開發上也有不少的 Framework 可以使用。目前比較常被提到的有 Struts、JSF、Spring Framework、WebWork ,而我現在主要就是要以 Spring Framework 來開發系統。
JSF 是我之前拿來開發過一個政府案子的一個 Framework,JSF 最常被拿來跟 Struts 做比較,因為這兩個 Framework 有很多相似的地方,但是 JSF 是屬於由 Sun 官方 Support 的,而 Struts 是由 Jakarta 所 Support。當初會選擇使用 JSF 的主要原因就是因為這是由 Sun 所支援,代表說其他的一些 Java 廠商也會跟著 Support。不過目前網路上使用 Struts Framework 的網站還是比 JSF 多很多。
每一個 Framework 都有其優缺點,所以我個人會傾向於找一個彈性比較大,容易跟其他 Framework 整合的 Framework,而 Spring Framework 就是這樣的一個 Framework。Spring Framework 並不只限於開發 Web Application,你也可以拿 Spring Framework 來開發 Windows Application。
底下是 Spring Framework 的一個架構圖,最重要的就是底層的 Spring Core 核心容器,用來定義了建立、配置和管理 bean 的方式。Spring 擁有自己的 Web MVC、Spring ORM,但是它也可以跟其他的 Framework搭配,也可以跟其他的 ORM 搭配 (例如:Hibernate) ,Spring Framework 就是這麼的彈性。

網路上有不少的 Spring Framework 介紹,包括 Spring Framework 的源由、IoC 概念以及 AOP 等等,所以有興趣的人可以直接從 google 上去找尋到這些資料,這篇文章就直接先從最基本的 hello 程式開始。首先先瞭解一下 Spring Framework 在 Web Application 上的處理流程大概如下圖所示:

所有的 request 都會先經過 Front Controller,再 dalegate 給適當的 Controller,而 Controller 會再回傳到對應的 View Template。
1. 下載 Spring Framework 檔案
Spring Framework 的下載位置在這邊,spring-famework-xxx-with-dependencies.zip 是包含其他一些會有到的 pacakages 全部都打包在一起了,若沒什麼特殊,可以直接下載這個檔案,解開之後,把 spring.jar、log4j.jar 以及 common-logging.jar copy 到 springapp/WEB-INF/lib 下 (假設這個 web-application 叫做 springapp)
2. 修改 web.xml 檔案
Spring Framework 使用一個 Dispatch Servlet 當作所有 request 的入口 (Front Controller),所以得要在 web.xml 指定,如下圖所示。另外在 servlet-mapping 中也指定所有的 *.htm 檔案都會由 Spring Framework 處理。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
<servlet>
<servlet-name>springapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springapp</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
</web-app>
3. 新增 spring 設定檔案
因為在上述的 web.xml 檔案中,我們設定了 Dispatch Servlet 的名字為 springapp,所以 spring 的設定檔案名稱是 springapp-servlet.xml (也可以指定其他的檔案名稱,但是得要額外設定)。內容大致如下:
在 Spring 設定檔案中最主要就是要設定 bean 的資料,首先我們需要設定一個 url mapping 的 bean 來設定哪些 request 需要給哪一個 handler 來處理。Spring 已經內建了幾個常用的 url mapping 機制,在底下我使用的是 SimpleUrlHandlerMapping,作用就只是單純的把 /hello.htm 的 request 丟給 springappController 處理。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<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="springappController" class="com.esolution.Controller.SpringappController"/>
</beans>
4. 撰寫對應的 bean 程式
因為上述的設定需要一個 springappController 程式來處理由 /hello.htm 的 requestM,因此我新增了一個 springappController 的 bean,然後它的 class 資料如下:(com.esolution.Controller.SpringappController)
public class SpringappController implements Controller {
/** Logger for this class and subclasses */
protected final Log logger = LogFactory.getLog(getClass());
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
logger.info("SpringappController - returning hello view");
String now = (new java.util.Date()).toString();
return new ModelAndView("hello.jsp", "now", now);
}
}
這個程式主要需要撰寫的部分在 handleRequest 這個 method 上面,因為我們只是要一個簡單的 hello,所以上面只是回傳一個 ModelAndView object。ModelAndView 顧名思義就是需要 Model 資料以及 View 資訊,在上面的 Model 資料就是現在的日期資訊以及名稱,而 View 資訊就是 hello.jsp。
5. 撰寫 View 程式
因為上面的 SpringappController 會把資訊傳遞到 hello.jsp 這個 JSP 程式,因此我們需要撰寫 hello.jsp。這邊我使用 JSTL 讓整個頁面可以更簡潔,不要讓 script 以及 HTML 混合在一起。下面就是秀出:
Greetings, it is now xxxx
xxxx 就是由上面的 ModelAndView 帶過來的 now 資訊。
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<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>
上面就是一個很簡單的程式,接下來再慢慢說明可以怎樣的變化。
沒有留言:
張貼留言