程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Struts簡介

Struts簡介

編輯:關於JAVA

一、Struts的起源

Struts最早是作為Apache Jakarta項目的組成部分,項目的創立者希望通過對該項目的研究,改進和提高JavaServer Pages 、Servlet、標簽庫以及面向對象的技術水准。Struts這個名字來源於在建築和舊式飛機中使用的支持金屬架。這個框架之所以叫"Struts",是為了提醒我們記住那些支撐我們房屋,建築,橋梁,甚至我們踩高跷時候的基礎支撐。這也是一個解釋Struts在開發Web應用程序中所扮演的角色的精彩描述。當建立一個物理建築時,建築工程師使用支柱為建築的每一層提供支持。同樣,軟件工程師使用Struts為業務應用的每一層提供支持。它的目的是為了幫助我們減少在運用MVC設計模型來開發Web應用的時間。我們仍然需要學習和應用該架構,不過它將可以完成其中一些繁重的工作。如果想混合使用Servlets和JSP的優點來建立可擴展的應用,Struts是一個不錯的選擇。

早期Smalltalk 程序語言便采用了MVC(Model-View -Controller) 模式( Patterns ) 以增加程序代碼彈性,MVC模式將程序代碼整理切割為三部份,Model 部分是業務與應用領域( Business domain) 相關邏輯、管理狀態之對象,Controller 部分接收來自View 所輸入的資料並與Model 部分互動,是業務流程控制( Flow Control) 之處,View 部分則負責展現資料、接收使用者輸入資料。在Java 應用中,JFC/Swing、AWT、JSP 皆是可用作View 之技術規格,而JavaBean 與Enterprise JavaBean 規格則可用於Model 程序代碼,一旦應用程序以MVC 模式加以適當之分割,Model 部分程序代碼可在不同使用者接口外觀之應用程序中重復使用。

隨著JSP 與Servlet 技術大量應用於以Web 為基礎之應用程序,Java 開發人員群體認為應以較佳之模式以提升Web 應用程序之可維護性與重復使用性。早期JSP 規格書中曾列舉兩種可行之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之外,還有其他成功的開源產品,包括Tomcat, Ant 和Velocity。2000 年Craig R. McClanahan 先生貢獻了他編寫的JSP Model 2 架構之Application Framework 原始程序代碼給Apache 基金會,成為Apache Jakarta 計劃Struts Framework 前身。

開始的代碼基礎從2000年5月開始開發,直到2001年6月,1.0版本發布。有30 多個開發者參與進來,並有數千人參與到討論組中。Struts 代碼基礎由一個志願的Commnitter團隊來管理。到2002年,Struts 小組共有9個志願Commnitter。

Struts框架的主要架構設計和開發者是Craig R.McClanahan。Craig 也是Tomcat 4的主要架構師,以及Java Web Services Developer Pack的主要架構師和實現者。他現在是Sun的JavaServer Faces (JSR-127) 以及J2EE平台的Web層架構的規范領導。Craig R. McClanahan 先生是JCP ExpertGroup 成員之一,曾參與JSP 規格制定與Tomcat 4 之編寫,因此Struts Framework 廣受Java 開發人員群體所重視。Borland 自2002 年底開始於開發工具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源碼發布包安裝,我們必須下載1.1或之後版本的ant build system。在我們通過Struts來開發我們自己的Web應用程序是,推薦使用ant來build我們的應用。

下載地址:

http://jakarta.apache.org/ant

Servlet API Classes -- 為了編譯Structs自己,或應用程序使用Struts,我們需要一個包含Servlet和JSP API對象的servlet.jar包。大多數Servlet container(例如Tomcat)已經自帶了這個文件。否則,我們必需下載:http://jakarta.apache.org/builds/jakarta-servletapi

XML Parser -- Structs需要一個與Java API for XML Parsing(JAXP)規格兼容的XML處理器,我們可以使用Xerces。

下載地址:

http://xml.apache.org/xerces-j

Xalan XSLT Processor -- 如果我們通過Structs源碼發布版來構造我們的Structs系統,我們必須下載和安裝1_2_D01或之後版本的Xalan XSLT處理器(Xerces中已自帶Xalan)。這個處理器用於將基於XML的Structs文檔轉換為Html文檔。

2、通過源碼構造Structs

1)下載Structs的源碼發布包。

2)設置ANT_HOME環境變量,指向我們的Ant目錄。

3)設置JAVA_HOME環境變量,指向我們的JDK目錄。

4)設置SERVLETAPI_HOME環境變量,指向我們的Servlet API目錄(如果我們的CLASSPATH已經包含了servlet.jar,就不需要指定該目錄)

5)將Structs的源碼發布包進行解包。

6)進入Structs目錄,運行以下命令:

./build.sh dist

該命令將創建Struts的二進制發布包,目錄在../dist/structs(相對於我們的編譯目錄)。

3、通過Struts的二進制發布包安裝Structs

1)下載Struts的二進制發布版。

2)將Struts的二進制發布版進行解包。(如果我們是通過Struts源碼構造Struts,build的結果就已經是已解包的Struts)。解包後的Struts包含以下內容:

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或之後版本規范的servlet容器中(推薦使用tomcat)。

webapps/struts-test.war -- 這個web應用包含了Struts支持的許多tag的測試網頁,可以作為使用Struts tag的例子。

4、Struts的基本組件包

安裝好的struts大約有15包,近200個類所組成,而且數量還在不斷的擴展。在此我們不能一一介紹,只能列舉幾個主要的簡要的介紹一下。下表說明了目前struts api中基本的幾個組件包,包括

action,actions,config,util,taglib,validator。如下表1所示: org.apache.struts.action 基本上,控制整個struts framework的運行的核心類、組件都在這個包中,比如我們上面提到的控制器ActionServlet。已經Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 類。增加了動態擴展生成FormBean功能 org.apache.struts.actions 這個包是主要作用是提供客戶的http請求和業務邏輯處理之間的特定適配器轉換功能,而1.0版本中的部分動態增刪FromBean的類,也在struts1.1中被Action包的DynaActionForm組件所取代 org.apache.struts.config 提供對配置文件struts-config.xml元素的映射。這也是sturts1.1中新增的功能 org.apache.struts.util Strtuts為了更好支持web application的應用,體統了一個些常用服務的支持,比如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,用於動態的配置from表單的驗證。詳細信息請參閱 http://home.earthlink.net/~dwinterfeldt/

下面的圖則顯現了這幾個組件包之間的關系。其中action是整個struts 架構的核心。

三、Struts 配置與組件介紹

有關struts組件配置struts-config.xml文件說明在前面的文章中已經介紹過,這裡就不再說了,下面主要介紹框架中組件與配置。

下表列出了Struts的核心類,即對應的經典的MVC組件職責。

表格2 核心Struts 類和MVC 的對應 類 描述 ActionForward 用戶指向或者視圖選擇 ActionForm 狀態改變的數據 ActionMapping 狀態改變事件 ActionServlet 控制器,接受用戶請求和狀態改變,以及發出視圖選擇 Action 控制器的一部分,於模型交互,執行狀態改變或狀態查詢,以及告訴ActionServlet 下一個選擇的視圖

除了這些核心類, Struts 使用一些配置文件和視圖助手(view helpers)來溝通控制器和模型。下表列出了Struts 配置文件和描述了他們在架構中的角色。

表格3 Strtuts 配置文件

文件 目的 ApplicationResources.properties 存儲本地化信息和標簽,以使應用可以國際化 struts-config.xml 存儲控制器對象的缺省配置,包括模型支持的用戶指向,狀態改變,狀態查詢

為將Struts配置數據暴露給視圖,框架以JSP標簽的形式提供了大量的助手類,如表4 Strtus 視圖助手。

標記庫描述符 目的 struts-html.tld 擴展HTML Form的JSP標記 struts-bean.tld 擴展處理JavaBean的JSP標記 struts-logic.tld 擴展測試屬性值的JSP標記

控制器組件的配置

框架中的控制器組件是有org.apache.struts.action.ActionServlet類實現的,這個類是javax.servlet.http.HttpServlet類的擴展。

ActionServlet配置:

我們需要在web.xml中聲明ActionServlet,並且將它配置成啟動時進行加載。以下為可以配置的初始化參數: 參數 默認值 描述 application Null 應用程序的資源集合的類 bufferSize 4096 文件上傳的緩沖區大小 config /WEB-INF/struts-config.xml 配置文件的位置和名稱 content Text/html 默認的內容類型 debug 0 程序調試的級別 detail 0 程序調試細節的級別 factory Null 消息資源工廠,用於國際化中解釋消息資源 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參數提供給程序的工作目錄 處理下載文件是使用的臨時工作目錄 validate True 是否使用新格式的配置文件 vallidating True 是否對配置文件進行有效性分析

大多數情況下,標准的servlet就能夠滿足用戶需要。

第一次收到特定請求的URI時,ActionServlet將適當的Action類進行實例化,然後ActionServlet在Action類實例中以servlet為變量名存儲一個引用。當被實例化後,Action類會被暫存以備再用。

錯誤處理

struts提供了兩個類來處理錯誤:ActionErrors和ActionError,它們都擴展org.apache.struts.action。ActionErrors保存著ActionError對象的集合,其中每一個代表了獨立的錯誤信息。每個ActionError都包含了關鍵字,能夠映射到資源文件中存儲的錯誤信息,而這個資源文件是在ActionServlet初始化參數中指定的。

四、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的對應關系。可以參照Struts例子中的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、創建一個WEB-INF/action.xml文件來定義我們的web應用的action映射關系。可以參照Struts例子中的action.xml文件來了解詳細的語法要求。

6、在使用Struts tag庫的JSP網頁中加入以下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優缺點

優點:

Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟件,這是它的一大優點。使開發者能更深入的了解其內部實現機制。除此之外,Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。

關於頁面導航,我們認為那將是今後的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對於後期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。

缺點:

Taglib是Struts的一大優勢,但對於初學者而言,卻需要一個持續學習的過程,甚至還會打亂我們網頁編寫的習慣,但是,當我們習慣了它時,我們會覺得它真的很棒。Struts將MVC的Controller一分為三,在獲得結構更加清晰的同時,也增加了系統的復雜度。毫無疑問,要理解 Struts 必須接受一定的培訓。隨著變化的不斷加入,這有時會令人很沮喪。

Struts從產生到現在還不過3-4年時間,就已逐步越來越多運用於商業軟件。雖然它現在還有不少缺點,但它是一種非常優秀的J2EE MVC實現方式,如果我們的系統准備采用J2EE MVC架構,那麼,不妨考慮一下Struts。

Struts 是一種基於 Web 的 MVC 解決方案,所以必須用 HTML、JSP 文件和 servlet 來實現它,Struts 需要支持 JSP 1.1 和 Servlet 2.2 規范的 servlet 容器。學習、理解和掌握Struts是我們每個基於J2EE軟件開發人員一門必修的課程,也是我們對企業J2EE技術應用的進一步深化。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved