自學
預備知識
在開始學習Struts以前,以下的知識點,需要有所了解: 模型-視圖-控制的軟件構架模式,JSP/Servlet的web層應用,J2EE體系結構。如果對客戶標簽類(Customer TagLib)有所了解也許更容易理解Struts本身的TagLib。
概述
本文主要從概念上講解什么是struts framework,它的框架結構,組件結構,以及簡單的配置講解。對于其應用請參考后面的“struts安裝及應用”和“struts實用案例分析”。
文章的包括了如下四大部分:
一、 Framework的概念和體系簡介 (Framework Conception and Architecture)
二、 Struts的概念和體系結構(Struts Conception and Architecture)
三、 Struts的工作原理和組件(Struts Componennts)
四、 Struts配置文件簡介(Struts Deployment Description)
一、 Framework概念
一直以來我們都說struts是一個web framework。那么讓我么先來看看什么是Framework。(我想用“框架”一詞來翻譯framework,可是后來越來越發現不太理想和完備,所以就直接用Framework一詞)
Framework概念并不是很新了,伴隨著軟件開發的發展,在多層的軟件開發項目中,可重用、易擴展的,而且是經過良好測試的軟件組件,越來越為人們所青睞。這意味著人們可以將充裕的時間用來分析、構建業務邏輯的應用上,而非繁雜的代碼工程。于是人們將相同類型問題的解決途徑進行抽象,抽取成一個應用框架。這也就是我們所說的Framework。
Framework的體系提供了一套明確機制,從而讓開發人員很容易的擴展和控制整個framework開發上的結構。 通常,framework的結構中都有一個“命令和控制”組件("command and control" component)??Framework Factory and Manager。
圖片(2):Framework體系
通過基于請求響應(Request-Response)模式的應用framework,基本上有如下幾個表現邏輯結構組成。
(1)控制器(Controller)??控制整個framework中各個組件的協調工作。
(2)業務邏輯層(Business Logic)??這是framework所希望解決問題的關鍵。當然對framwork本身來說,這里僅僅只是概念和幾個提夠服務的基礎組件,真正的實現與客戶的業務邏輯接軌,還需要開發人員在framework上再次擴展。
(3)數據邏輯層(Data Logic)??絕大應用系統都需要涉及到數據交互,這一層次主要包括了數據邏輯和數據訪問接口。對于數據邏輯來說,如果你了解數據建模(Data Modeling)可能就很容易理解。
下面就進入我們的正題??Struts的結構
二、 Struts的概念和體系結構
Struts有一組相互協作的類(組件)、Serlvet以及jsp tag lib組成?;趕truts構架的web應用程序基本上符合JSP Model2的設計標準,可以說是MVC設計模式的一種變化類型。根據上面對framework的描述,我們很容易理解為什么說Struts是一個web framwork,而不僅僅是一些標記庫的組合。但 Struts 也包含了豐富的標記庫和獨立于該框架工作的實用程序類。
Struts有其自己的控制器(Controller),同時整合了其他的一些技術去實現模型層(Model)和視圖層(View)。在模型層,Struts可以很容易的與數據訪問技術相結合,包括EJB,JDBC和Object Relation Bridge。在視圖層,Struts能夠與JSP, Velocity Templates,XSL等等這些表示層組件想結合。
2.1 Struts的與Web App的關系
既然struts叫做web framework,那么其肯定主要基于web層的應用系統開發。按照J2EE Architecture的標準,struts應當和jsp/servlet一樣,存在于web container一層。如圖片(3)所顯示
圖片(3): Struts與WebApp的關系
2.2 Struts的體系結構
我們說struts framework是MVC 模式的體現,下面我們就從分別從模型、視圖、控制來看看struts的體系結構(Architecture)。圖片(4)顯示了struts framework的體系結構響應客戶請求時候,各個部分工作的原理。
圖片(4):Struts體系結構
2.2.1從視圖角度(View)
主要由JSP建立,struts自身包含了一組可擴展的自定義標簽庫(TagLib),可以簡化創建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 這幾個Taglib。有關它們的詳細資料請參考struts用戶手冊
2.2.2從模型角度(Model)
模型主要是表示一個系統的狀態(有時候,改變系統狀態的業務邏輯操作也也劃分到模型中)。在Struts中,系統的狀態主要有ActiomForm Bean體現,一般情況下,這些狀態是非持久性的。如果需要將這些狀態轉化為持久性數據存儲,Struts本身也提供了Utitle包,可以方便的與數據庫操作
2.2.3 從控制器角度(Controller)
在Struts framework中, Controller主要是ActionServlet,但是對于業務邏輯的操作則主要由Action、ActionMapping、ActionForward這幾個組件協調完成(也許這幾個組件,應該劃分到模型中的業務邏輯一塊)。其中,Action扮演了真正的業務邏輯的實現者,而ActionMapping和ActionForward則指定了不同業務邏輯或流程的運行方向。
2.3 Struts的基本組件包
整個struts大約有15包,近200個類所組成,而且數量還在不斷的擴展。在此我們不能一一介紹,只能列舉幾個主要的簡要的介紹一下。下表說明了目前struts api中基本的幾個組件包,包括action,actions,config,util,taglib,validator。圖片(5)則顯現了這幾個組件包之間的關系。其中action是整個struts framework的核心
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/
三、 Struts framework的工作原理和組件
對于Struts 如何控制、處理客戶請求,讓我們通過對struts的四個核心組件介紹來具體說明。這幾個組件就是:ActionServlet。Action Classes,Action Mapping(此處包括ActionForward),ActionFrom Bean。
3.1 Struts ActionServlet
ActionServlet繼承自javax.servlet.http.HttpServlet類,其在Struts framework中扮演的角色失控制器,參看上面的“Struts體系圖”??刂破鰽ctionServlet主要負責將HTTP的客戶請求信息組裝后,根據配置文件的指定描述,轉發到適當的處理器。(在Struts1.1中新增了org.apache.struts.action.Action.RequestProcessor類,將處理請求的功能從控制器功能中分離。
按照Servelt的標準,所有得Servlet必須在web配置文件(web.xml)聲明。同樣,ActoinServlet必須在Web Application配置文件(web.xml)中描述,有關配置信息,后面將會介紹。
當用戶向服務器端提交請求的時候,實際上信息是首先發送到控制器ActionServlet,一旦控制器獲得了請求,其就會將請求信息傳交給一些輔助類(help classes)處理。這些輔助類知道如何去處理與請求信息所對應的業務操作。在Struts中,這個輔助類就是org.apache.struts.action.Action。通常開發者需要自己繼承Aciton類,從而實現自己的Action實例。
3.2 Struts Action Classes
一個Action 類的角色,就像客戶請求動作和業務邏輯處理之間的一個適配器(Adaptor),其功能就是將請求與業務邏輯分開。這樣的分離,使得客戶請求和Action類之間可以有多個點對點的映射。而且Action類通常還提供了其它的輔助功能,比如:認證(authorization)、日志(logging)和數據驗證(validation)。
Action最為常用的是execute()方法。(注意,以前的perform方法在struts1.1中已經不再支持),還有一個execute()方法,請參考apidoc,在此不在說明。
當Controller收到客戶的請求的時候,在將請求轉移到一個Action實例時,如果這個實例不存在,控制器會首先創建,然后會調用這個Action實例的execute()方法。Struts Framework為應用系統中的每一個Action類只創建一個實例。因為所有的用戶都使用這一個實例,所以你必須確定你的Action 類運行在一個多線程的環境中。下圖顯示了一個execute()方法如何被訪問:
圖片(6): Action實例的execute()方法
注意,客戶自己繼承的Action子類,必須重寫execute()方法,因為Action類在默認情況下是返回null的。
3.3 Struts Action Mapping
上面講到了一個客戶請求是如何被控制器轉發和處理的,但是,控制器如何知道什么樣的信息轉發到什么樣的Action類呢?這就需要一些與動作和請求信息相對應的映射配置說明。在struts 中,這些配置映射信息是存儲在特定的XML文件(比如struts-config.xml)。
這些配置信息在系統啟動的時候被讀入內存,供struts framework在運行期間使用。在內存中,每一個<action>元素都與org.apache.struts.action.ActionMapping類的一個實例對應。下表就顯示了一個登陸的配置映射。
上面的配置表示:當可以通過/logonAction.do(此處假設配置的控制器映射為*.do)提交請求信息的時候,控制器將信息委托com.test.LogonAction處理。調用LogonAction實例的execute()方法。同時將Mapping實例和所對應的LogonForm Bean信息傳入。其中name=LogonForm,使用的form-bean元素所聲明的ActionForm Bean。有關form-bean的申明如下顯示。
元素<forward>則表示了當Action實例的execute()方法運行完畢或,控制器根據Mapping可將響應信息轉到適當的地方。如上面現實,如果客戶登陸成功,則調用welcome forward,將成功信息返回到/welcome.jsp頁面。在你的execute()方法的結尾可以使用下面的實例代碼而返回welcome forward。當然你的welcome forward必須在action元素屬性中定義,正如上面所聲明的那樣。
在此稍稍說一下有關global-forwards的概念。其在配置文件中描述了整個應用系統可以使用的ActionForward,而不是僅僅是一個特定的Action。
3.4 Struts ActionForm Bean
在上面講解ActionServlet,Action Classes和Action Mapping的時候,我們都提到了ActionForm Bean的概念。一個應用系統的消息轉移(或者說狀態轉移)的非持久性數據存儲,是由ActionForm Bean的負責保持的。
ActionForm的主要功能就是為Action的操作提供與客戶表單相映射的數據(如果在客戶指定的情況下,還包括對數據進行校驗)。Action負責對系統數據狀態的保持,而Action則負責根據業務邏輯的需要,對數據狀態進行修改,在改變系統狀態后,ActionForm則自動的回寫新的數據狀態并保持。
注意:在struts1.1中,ActionForm的校驗功能,逐漸被剝離出來(當然依然可以使用)。使用了validator framework對整個應用系統的表單數據驗證進行統一管理。相信信息請參考:http://home.earthlink.net/~dwinterfeldt
在ActionForm的使用中,Struts提倡使用到值對象(Value Object)。這樣將客戶或開發人員,對數據狀態與對象狀態能夠更加清晰的理解和使用。
對于每一個客戶請求,Struts framework在處理ActionForm的時候,一般需要經歷如下幾個步驟:
(1)檢查Action的映射,確定Action中已經配置了對ActionForm的映射
(2)根據name屬性,查找form bean的配置信息
(3)檢查Action的formbean的使用范圍,確定在此范圍下,是否已經有此form bean的實例。
(4)假如當前范圍下,已經存在了此form bean的實例,而是對當前請求來說,是同一種類型的話,那么就重用。
(5)否則,就重新構建一個form bean的實例
(6)form bean的reset()方法備調用
(7)調用對應的setter方法,對狀態屬性賦值
(8)如果validatede的屬性北設置為true,那么就調用form bean的validate()方法。
注意:直接從ActionFrom類繼承的reset()和validate()方法,并不能實現什么處理功能,所以有必要自己重新覆蓋。
如果validate()方法沒有返回任何錯誤,控制器將ActionForm作為參數,傳給Action實例的execute()方法并執行。
有必要提一下有關org.apache.struts.action.DynaActionForm。這是struts1.1新增的特性。其繼承自ActionForm,在struts早先版本中,我們必須人為的構造特定的ActionFrom子類,但是利用DynaActionForm,可以依據屬性集而動態的創建from bean。有關其詳細資料,請參考???
四、Struts的其他組件
Struts framework本身提供了很多可擴展的組件或sub framework,方便的開發人員在其構架上構建web層的應用系統。比如upload,collections ,logging等等。讓我們來看看兩個比較重要的組件:validationg framework和struts taglib。有關其他組件請參考Struts用戶手冊(http://jakarta.apache.org/struts/userGuide)。
在stuts1.0中有些很不錯的概念和組件,比如benaUtils,Collections等等,后來被Jakarta Commons項目組吸收而獨立處struts framework。但是struts依然需要依賴這些組件才能正常的工作。
4.1 Validation Framework for Struts
在struts1.1中,新增了validation framework。增加了對form數據提交的驗證。將原本需要在ActionFrom Bean的validate()進行的驗證通過配置文件的描述進行驗證。
有關其詳細信息,請參考http://home.earthlink.net/~dwinterfeldt 。個人建議對于小型應用系統可以采用這種配置方式,但是對于應用系統中有大量web層表單應用的系統,并且業務需求變動比較大的,使用validation framework 可能會加重開發難度、系統維護難度??梢越梃bvalidation framework的Javascript Validator Tag。
4.2 Struts TagLib
struts提供了一組可擴展的自定義標簽庫(TagLib),可以簡化創建用戶界面的過程。目前包括:Bean Tags,HTML Tags,Logic Tags,Nested Tags,Template Tags 這幾個Taglib。有關Struts Taglib的結構和使用,可以參考前面有關Cutomer Tag Lib的介紹,有關起詳細資料,請參考
4.3 BeanUtils
這個組件的全稱是Bean Introspection Utilites。是屬于Jakarta Commons項目組的。主要是幫助構建javabean的屬性操作的(getter,setter),已經提供一種動態定義和訪問bean的屬性。有關詳細信息,請參考。
http://jakarta.apache.org/commons/beanutils.html
如果各位對這方面有很興趣,可以參考一些有關java反射(Reflectio)方面的資料。
4.4 Collections
這個組件主要是提供了一些集合或列表對象,在原有的java collections framework的基礎上進行了擴展。詳細資料請參考:
http://jakarta.apache.org/commons/collections.html 以及
http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13
4.5 Digester
這個組件翻譯成中文的意思是“匯編”。其主要功能是根據xml配置文件,初始化系統的一些java類對象。Digester幫助你指定XML與java對象之間映射模型,而且允許客戶話定制映射規則(rules)。詳細資料請參考
http://jakarta.apache.org/commons/digester.html
4.6 其他相關組件
由于篇幅問題,還有一些組件就不一一介紹了,包括Database Connection Pool,Upload,Logging,Pool,Services。基在struts用戶手冊都有詳細介紹,請參考。
五、 Struts配置文件簡介(Deployment Description)
struts framework根據配置文件指定(更確切的說,是控制器),才使得ServletAction,ActionMapping,Action , ActionForm這幾個不同層次的組件相互交互,協調的工作。前面也提到了,這些配置文件是在系統啟動的時候,讀入導內存中,供控制器使用的。
Struts framework主要包括三部分的配置描述,一個是指定有關Struts Controller及其相關的的配置描述(Initialization Parameters),一個時對struts tag lib的描述,一個是struts組件(ActionMapping,Action,ActionForm)之間相互映射協調的關系
5.1有關Struts Controller及其相關的的配置描述
因為Struts Controller的主要類ActionServlet是繼承自HttpServlet,所以必須像配置一個Servlet那樣配置ActionServlet類及其訪問映射。詳細信息請參考:
http://jakarta.apache.org/struts/userGuide/building_controller.html#dd_config
5.2 有關struts tag lib的配置描述
如果你的web application打算使用Struts的taglib,那么你有必要在web.xml中對struts taglib進行配置描述。有關詳細的描述和說明請參考
http://jakarta.apache.org/struts/userGuide/building_controller.html#dd_config_taglib
5.3 有關Struts Action Mapping的配置描述
Struts本身有一個配置文件,通常情況為struts-config.xml。有關其DTD文檔的描述,請參考http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd
(或struts-config_1_0.dtd)
一般struts-config(version1.1)包含了如下幾個部分:
(1)form-bean
(2)global-forwards
(3)action-mappings
(4)data-sources
有關詳細信息請參閱
http://jakarta.apache.org/struts/userGuide/building_controller.html#config
有必要提一下的是,在struts1.1中,提出了對Multiple Application Support。在struts的早先版本中,只有一個struts配置文件,一般叫struts-config.xml。但是,對于越來越復雜的應用系統的發展,只有一個地方存放這個一個文件,對大型項目來說,使用和修改這個配置文件,使其成為了一個應用的瓶頸問題。在struts1.1中,你可以定義多了配置文件協同工作。
總結
希望通過以上的對Struts Framework的講解,讀者可以對Struts的整體結構有個比較清晰的認識,對其如何處理客戶請求,如何進行業務邏輯的處理和自動流轉能夠有個概念上的認識。
Resource
① Struts的官方網站:
http://jakarta.apache.org/struts/
② Struts用戶手冊(User Guide)
http://jakarta.apache.org/struts/userGuide
③ ARTICLE --- Framework save the day
http://www.javaworld.com/jw-09-2000/jw-0929-ejbframe.html
④ ARTICLE --- Building a Java servlet framework using reflection
http://www.javaworld.com/javaworld/jw-11-1999/jw-11-servlet.html
⑤ Validation Framework
http://home.earthlink.net/~dwinterfeldt/
http://cvs.apache.org/viewcvs/jakarta-commons/validator/
⑥ ARTICLE --- Struts1.1,Should I upgrade?
http://www.theserverside.com/resources/article.jsp?l=Struts1_1
posted on 2005-10-26 16:28
Sung 閱讀(506)
評論(0) 編輯 收藏 所屬分類:
Struts