一、Struts的起源
Struts最早是作為Apache Jakarta項目的組成部分,項目的創(chuàng)立者希望通過對該項目的研究,改進和提高JavaServer Pages 、Servlet、標簽庫以及面向對象的技術水準。Struts這個名字來源于在建筑和舊式飛機中使用的支持金屬架。這個框架之所以叫"Struts",是為了提醒我們記住那些支撐我們房屋,建筑,橋梁,甚至我們踩高蹺時候的基礎支撐。這也是一個解釋Struts在開發(fā)Web應用程序中所扮演的角色的精彩描述。當建立一個物理建筑時,建筑工程師使用支柱為建筑的每一層提供支持。同樣,軟件工程師使用Struts為業(yè)務應用的每一層提供支持。它的目的是為了幫助我們減少在運用MVC設計模型來開發(fā)Web應用的時間。我們?nèi)匀恍枰獙W習和應用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優(yōu)點來建立可擴展的應用,Struts是一個不錯的選擇。
早期Smalltalk 程序語言便采用了MVC(Model-View -Controller) 模式( Patterns ) 以增加程序代碼彈性,MVC模式將程序代碼整理切割為三部份,Model 部分是業(yè)務與應用領域( Business domain) 相關邏輯、管理狀態(tài)之對象,Controller 部分接收來自View 所輸入的資料并與Model 部分互動,是業(yè)務流程控制( Flow Control) 之處,View 部分則負責展現(xiàn)資料、接收使用者輸入資料。在Java 應用中,JFC/Swing、AWT、JSP 皆是可用作View 之技術規(guī)格,而JavaBean 與Enterprise JavaBean 規(guī)格則可用于Model 程序代碼,一旦應用程序以MVC 模式加以適當之分割,Model 部分程序代碼可在不同使用者接口外觀之應用程序中重復使用。
隨著JSP 與Servlet 技術大量應用于以Web 為基礎之應用程序,Java 開發(fā)人員群體認為應以較佳之模式以提升Web 應用程序之可維護性與重復使用性。早期JSP 規(guī)格書中曾列舉兩種可行之JSP 應用架構,分別為Model1 與Model 2。
在Model 1 架構中,JSP 直接處理Web 瀏覽器送來之請求( Request ),并輔以JavaBean 處理應用相關邏輯。Model 1 架構單純編寫比較容易,但在Model 1 中JSP 可能同時肩負View 與Controller 角色,兩類程序代碼有可能混雜而不易維護。而Model 2 中將Servlet 納入架構中扮演前端Controller 角色,將Web 瀏覽器送出之請求集中送至Servlet ,Servlet 可集中管理使用者登入、權限控制、多國語言轉換等前置處理,再視需求轉向給對應之JSP 處理。Model 2 中采用了較佳之MVC 模式,但增加了編寫復雜度。
Struts是Apache軟件基金下Jakarta項目的一部分。除Struts之外,還有其他成功的開源產(chǎn)品,包括Tomcat, Ant 和Velocity。2000 年Craig R. McClanahan 先生貢獻了他編寫的JSP Model 2 架構之Application Framework 原始程序代碼給Apache 基金會,成為Apache Jakarta 計劃Struts Framework 前身。
開始的代碼基礎從2000年5月開始開發(fā),直到2001年6月,1.0版本發(fā)布。有30 多個開發(fā)者參與進來,并有數(shù)千人參與到討論組中。Struts 代碼基礎由一個志愿的Commnitter團隊來管理。到2002年,Struts 小組共有9個志愿Commnitter。
Struts框架的主要架構設計和開發(fā)者是Craig R.McClanahan。Craig 也是Tomcat 4的主要架構師,以及Java Web Services Developer Pack的主要架構師和實現(xiàn)者。他現(xiàn)在是Sun的JavaServer Faces (JSR-127) 以及J2EE平臺的Web層架構的規(guī)范領導。Craig R. McClanahan 先生是JCP ExpertGroup 成員之一,曾參與JSP 規(guī)格制定與Tomcat 4 之編寫,因此Struts Framework 廣受Java 開發(fā)人員群體所重視。Borland 自2002 年底開始于開發(fā)工具JBuilder 中支持Struts Framework。
二、Struts安裝
1、安裝Struts需要的軟件
Java Development Kit-- 我們需要download和install 1.2(或之后)版本的JDK。
下載地址:
http://java.sun.com/j2se
Servlet Container -- 通常的選擇是下載Tomcat(至少是3.1版,推薦使用4.0以上的版本)。
下載地址:
http://jakarta.apache.org/tomcat
Ant Build System -- 如果我們通過Struts源碼發(fā)布包安裝,我們必須下載1.1或之后版本的ant build system。在我們通過Struts來開發(fā)我們自己的Web應用程序是,推薦使用ant來build我們的應用。
下載地址:
http://jakarta.apache.org/ant
Servlet API Classes -- 為了編譯Structs自己,或應用程序使用Struts,我們需要一個包含Servlet和JSP API對象的servlet.jar包。大多數(shù)Servlet container(例如Tomcat)已經(jīng)自帶了這個文件。否則,我們必需下載:http://jakarta.apache.org/builds/jakarta-servletapi
XML Parser -- Structs需要一個與Java API for XML Parsing(JAXP)規(guī)格兼容的XML處理器,我們可以使用Xerces。
下載地址:
http://xml.apache.org/xerces-j
Xalan XSLT Processor -- 如果我們通過Structs源碼發(fā)布版來構造我們的Structs系統(tǒng),我們必須下載和安裝1_2_D01或之后版本的Xalan XSLT處理器(Xerces中已自帶Xalan)。這個處理器用于將基于XML的Structs文檔轉換為Html文檔。
2、通過源碼構造Structs
1)下載Structs的源碼發(fā)布包。
2)設置ANT_HOME環(huán)境變量,指向我們的Ant目錄。
3)設置JAVA_HOME環(huán)境變量,指向我們的JDK目錄。
4)設置SERVLETAPI_HOME環(huán)境變量,指向我們的Servlet API目錄(如果我們的CLASSPATH已經(jīng)包含了servlet.jar,就不需要指定該目錄)
5)將Structs的源碼發(fā)布包進行解包。
6)進入Structs目錄,運行以下命令:
./build.sh dist
該命令將創(chuàng)建Struts的二進制發(fā)布包,目錄在../dist/structs(相對于我們的編譯目錄)。
3、通過Struts的二進制發(fā)布包安裝Structs
1)下載Struts的二進制發(fā)布版。
2)將Struts的二進制發(fā)布版進行解包。(如果我們是通過Struts源碼構造Struts,build的結果就已經(jīng)是已解包的Struts)。解包后的Struts包含以下內(nèi)容:
lib/struts.jar -- 這個文件包含了Struts的所有Java對象。我們需要把它拷貝到我們的Web應用的WEB-INF/lib目錄。
lib/structs.tld --這是一個"tag library descriptor"文件,它描述了Struts庫的自由tag。需要將它拷貝到我們的Web應用的WEB-INF目錄。
webapps/struts-documentation.war -- 這是一個"web application archive"文件,包含了所有的Struts文檔。我們可以將它安裝到支持Servlet API 2.2或之后版本的servlet container(推薦使用tomcat)中。
webapps/struts-example.war -- 這是一個web應用實例,它廣泛地演示了Struts的許多功能。我們可以將它安裝到兼容Servlet2.2或之后版本以及JSP1.1或之后版本規(guī)范的servlet容器中(推薦使用tomcat)。
webapps/struts-test.war -- 這個web應用包含了Struts支持的許多tag的測試網(wǎng)頁,可以作為使用Struts tag的例子。
4、Struts的基本組件包
安裝好的struts大約有15包,近200個類所組成,而且數(shù)量還在不斷的擴展。在此我們不能一一介紹,只能列舉幾個主要的簡要的介紹一下。下表說明了目前struts api中基本的幾個組件包,包括
action,actions,config,util,taglib,validator。如下表1所示:
org.apache.struts.action
基本上,控制整個struts framework的運行的核心類、組件都在這個包中,比如我們上面提到的控制器ActionServlet。已經(jīng)Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 類。增加了動態(tài)擴展生成FormBean功能
org.apache.struts.actions
這個包是主要作用是提供客戶的http請求和業(yè)務邏輯處理之間的特定適配器轉換功能,而1.0版本中的部分動態(tài)增刪FromBean的類,也在struts1.1中被Action包的DynaActionForm組件所取代
org.apache.struts.config
提供對配置文件struts-config.xml元素的映射。這也是sturts1.1中新增的功能
org.apache.struts.util
Strtuts為了更好支持web application的應用,體統(tǒng)了一個些常用服務的支持,比如Connection Pool和Message Source。詳細信息請參考http://jakarta.apache.org/struts/api/org/apache/struts/util/package-summary.html
org.apache.struts.taglib
這不是一個包,而是是一個客戶標簽類的集合。下面包括Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags這幾個用于構建用戶界面的標簽類。
org.apache.struts.validator
Struts1.1 framework中增加了validator framework,用于動態(tài)的配置from表單的驗證。詳細信息請參閱 http://home.earthlink.net/~dwinterfeldt/
三、Struts 配置與組件介紹
有關struts組件配置struts-config.xml文件說明在前面的文章中已經(jīng)介紹過,這里就不再說了,下面主要介紹框架中組件與配置。
下表列出了Struts的核心類,即對應的經(jīng)典的MVC組件職責。
表格2 核心Struts 類和MVC 的對應
類 描述
ActionForward 用戶指向或者視圖選擇
ActionForm 狀態(tài)改變的數(shù)據(jù)
ActionMapping 狀態(tài)改變事件
ActionServlet 控制器,接受用戶請求和狀態(tài)改變,以及發(fā)出視圖選擇
Action 控制器的一部分,于模型交互,執(zhí)行狀態(tài)改變或狀態(tài)查詢,以及告訴ActionServlet 下一個選擇的視圖
除了這些核心類, Struts 使用一些配置文件和視圖助手(view helpers)來溝通控制器和模型。下表列出了Struts 配置文件和描述了他們在架構中的角色。
表格3 Strtuts 配置文件
文件 目的
ApplicationResources.properties 存儲本地化信息和標簽,以使應用可以國際化
struts-config.xml 存儲控制器對象的缺省配置,包括模型支持的用戶指向,狀態(tài)改變,狀態(tài)查詢
為將Struts配置數(shù)據(jù)暴露給視圖,框架以JSP標簽的形式提供了大量的助手類,如表4 Strtus 視圖助手。
標記庫描述符 目的
struts-html.tld 擴展HTML Form的JSP標記
struts-bean.tld 擴展處理JavaBean的JSP標記
struts-logic.tld 擴展測試屬性值的JSP標記
控制器組件的配置
框架中的控制器組件是有org.apache.struts.action.ActionServlet類實現(xiàn)的,這個類是javax.servlet.http.HttpServlet類的擴展。
ActionServlet配置:
我們需要在web.xml中聲明ActionServlet,并且將它配置成啟動時進行加載。以下為可以配置的初始化參數(shù):
參數(shù) 默認值 描述
application Null 應用程序的資源集合的類
bufferSize 4096 文件上傳的緩沖區(qū)大小
config /WEB-INF/struts-config.xml 配置文件的位置和名稱
content Text/html 默認的內(nèi)容類型
debug 0 程序調(diào)試的級別
detail 0 程序調(diào)試細節(jié)的級別
factory Null 消息資源工廠,糜詮駛薪饈拖⒆試?/TD>
formBean org.apache.struts.action.ActionFormBean 封裝ActionForm bean信息的類的名稱
forward Org.apache.struts.action.ActionForward 封裝ActionForward對象信息的類的名稱
locale True 為true,將在用戶會話中存儲一個本地對象
mapping Org.apache.struts.action.ActionForward 封裝ActionMapping信息的類的名稱
maxFileSize 250M 上傳文件的最大尺寸
multipartClass Org.apache.struts.action.ActionForward 處理多部分請求的類的名稱
noCache False HTTP標頭是否要設置為禁止緩寸
Null True 設置為true,對于無效的信息關鍵字將返回null
tempDir 作為一個servlet參數(shù)提供給程序的工作目錄 處理下載文件是使用的臨時工作目錄
validate True 是否使用新格式的配置文件
vallidating True 是否對配置文件進行有效性分析
大多數(shù)情況下,標準的servlet就能夠滿足用戶需要。
第一次收到特定請求的URI時,ActionServlet將適當?shù)腁ction類進行實例化,然后ActionServlet在Action類實例中以servlet為變量名存儲一個引用。當被實例化后,Action類會被暫存以備再用。
錯誤處理
struts提供了兩個類來處理錯誤:ActionErrors和ActionError,它們都擴展org.apache.struts.action。ActionErrors保存著ActionError對象的集合,其中每一個代表了獨立的錯誤信息。每個ActionError都包含了關鍵字,能夠映射到資源文件中存儲的錯誤信息,而這個資源文件是在ActionServlet初始化參數(shù)中指定的。
四、Struts的運行
可通過以下的步驟在我們自己的應用程序中使用Struts:
1、將Struts目錄的lib/struts.jar拷貝到web應用的WEB-INF/lib目錄。
2、將Struts目錄的lib/struts*.tld拷貝到web應用的WEB-INF目錄。
3、修改Web應用目錄的WEB-INF/web.xml文件,增加一個<servlet>元素來定義controller servlet,增加一個<servlet-mapping>元素來建立URI請求與servlet的對應關系??梢詤⒄誗truts例子中的WEB-INF/web.xml文件來了解詳細的語法要求。
4、修改Web應用目錄的WEB-INF/web.xml文件,使之包含以下的tag庫定義:
<taglib>
<taglib-uri>/WEB-INF/struts.tld</taglib-uri>
<taglib-location>/WEB-INF/struts.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
</taglib>
5、創(chuàng)建一個WEB-INF/action.xml文件來定義我們的web應用的action映射關系??梢詤⒄誗truts例子中的action.xml文件來了解詳細的語法要求。
6、在使用Struts tag庫的JSP網(wǎng)頁中加入以下tag庫定義:
<@ taglib uri="/WEB-INF/struts.tld" prefix="struts" %>
<@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
7、最后,在編譯我們的web應用的java程序時,不要忘了在CLASSPATH中包含struts.jar文件。
五、Struts優(yōu)缺點
優(yōu)點:
Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟件,這是它的一大優(yōu)點。使開發(fā)者能更深入的了解其內(nèi)部實現(xiàn)機制。除此之外,Struts的優(yōu)點主要集中體現(xiàn)在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發(fā)效率。另外,就目前國內(nèi)的JSP開發(fā)者而言,除了使用JSP自帶的常用標記外,很少開發(fā)自己的標記,或許Struts是一個很好的起點。
關于頁面導航,我們認為那將是今后的一個發(fā)展方向,事實上,這樣做,使系統(tǒng)的脈絡更加清晰。通過一個配置文件,即可把握整個系統(tǒng)各部分之間的聯(lián)系,這對于后期的維護有著莫大的好處。尤其是當另一批開發(fā)者接手這個項目時,這種優(yōu)勢體現(xiàn)得更加明顯。
缺點:
Taglib是Struts的一大優(yōu)勢,但對于初學者而言,卻需要一個持續(xù)學習的過程,甚至還會打亂我們網(wǎng)頁編寫的習慣,但是,當我們習慣了它時,我們會覺得它真的很棒。Struts將MVC的Controller一分為三,在竦媒峁垢憂邐耐保蒼黽恿訟低車母叢傭取:廖摶晌?,要理?Struts 必須接受一定的培訓。隨著變化的不斷加入,這有時會令人很沮喪。
Struts從產(chǎn)生到現(xiàn)在還不過3-4年時間,就已逐步越來越多運用于商業(yè)軟件。雖然它現(xiàn)在還有不少缺點,但它是一種非常優(yōu)秀的J2EE MVC實現(xiàn)方式,如果我們的系統(tǒng)準備采用J2EE MVC架構,那么,不妨考慮一下Struts。
Struts 是一種基于 Web 的 MVC 解決方案,所以必須用 HTML、JSP 文件和 servlet 來實現(xiàn)它,Struts 需要支持 JSP 1.1 和 Servlet 2.2 規(guī)范的 servlet 容器。學習、理解和掌握Struts是我們每個基于J2EE軟件開發(fā)人員一門必修的課程,也是我們對企業(yè)J2EE技術應用的進一步深化。