1.前言
??? 伴隨著軟件開發(fā)技術(shù)的發(fā)展,基于組件的開發(fā)方法越來越受開發(fā)人員的青睞,通過采用組件技術(shù),復(fù)雜的系統(tǒng)由可重用、易擴(kuò)展,具有結(jié)合性的小系統(tǒng)組成,開發(fā)人員有更充裕的時(shí)間用來分析、構(gòu)建業(yè)務(wù)邏輯,而不是浪費(fèi)在繁雜代碼的編寫上。
組件通常設(shè)計(jì)成框架(framework)的一個(gè)組成部分,框架的作用是將獨(dú)立的組件結(jié)合在一起形成應(yīng)用程序" title="應(yīng)用程序">應(yīng)用程序進(jìn)行發(fā)布。選擇一個(gè)好的框架,開發(fā)人員基本上只需要在限制的范圍內(nèi)編寫相應(yīng)業(yè)務(wù)組件,由框架管理這些組件之間的協(xié)作,從而得到結(jié)構(gòu)良好、質(zhì)量可靠的Web應(yīng)用。
??? Struts框架是Apache組織的一個(gè)開放源碼" title="開放源碼">開放源碼項(xiàng)目,一個(gè)基于J2EE平臺的Web應(yīng)用系統(tǒng)" title="應(yīng)用系統(tǒng)">應(yīng)用系統(tǒng)框架。Struts采用MVC模型規(guī)范,結(jié)合了Servlet、JSP、JavaBean的技術(shù)特點(diǎn),并使這些技術(shù)合理分工,緊密配合,達(dá)到程序結(jié)構(gòu)清晰,易于開發(fā)、維護(hù)的目標(biāo)。
Struts框架具有MVC模型的所有特性和優(yōu)點(diǎn),簡化了基于MVC的應(yīng)用程序的開發(fā),并且可以通過擴(kuò)展以實(shí)現(xiàn)特定的需求;Struts框架使用XML文件來配置默認(rèn)的框架,有利于開發(fā)人員的理解流程控制。
2.Struts體系結(jié)構(gòu)
??? 從MVC的角度觀察,Struts框架由模型、視圖、控制器組成。
2.1 模型
??? Struts中模型分為兩大部分:
.系統(tǒng)內(nèi)部狀態(tài)。分為表單" title="表單">表單Beans:保存HTTP請求傳來的數(shù)據(jù);業(yè)務(wù)邏輯beans: 處理業(yè)務(wù)邏輯;系統(tǒng)狀態(tài)beans:保存跨越多個(gè)HTTP請求的單個(gè)客戶的會話信息、系統(tǒng)狀態(tài)。
.改變狀態(tài)的操作。大型應(yīng)用系統(tǒng)通常在方法內(nèi)部封裝操作(事務(wù)邏輯),這些方法可以被擁有狀態(tài)信息的Bean進(jìn)行調(diào)用。在中、小型應(yīng)用系統(tǒng)中,操作可以被內(nèi)嵌在Action類中,成為Struts框架中控制器的一部分,在邏輯比較簡單時(shí)通常采用這樣的方法。
2.2 視圖
??? 視圖通常使用JSP建立。Struts框架包含一個(gè)可擴(kuò)展的自定義標(biāo)記庫,可以簡化創(chuàng)建完全國際化的用戶界面的過程,同時(shí),可以與模型中的ActionForm Bean進(jìn)行交互。
2.3 控制器
??? 控制器處理所有發(fā)送到Struts 的HTTP請求。它截取和分發(fā)這些請求到相應(yīng)的動作類(Action類的子類),負(fù)責(zé)用相應(yīng)的請求參數(shù)填充 From bean并傳給動作類。在動作類通過訪問Java bean 或調(diào)用EJB實(shí)現(xiàn)核心商業(yè)邏輯后,根據(jù)動作類的返回值把控制權(quán)傳遞給相應(yīng)的JSP文件,生成視圖。
2.4體系結(jié)構(gòu)概述
??? 系統(tǒng)初始化時(shí),ActionServlet對配置文件(默認(rèn)為struts-config.xml)進(jìn)行分析,然后根據(jù)其中定義的映射轉(zhuǎn)發(fā)相應(yīng)的HTTP請求。
??? 當(dāng)用戶發(fā)出HTTP請求,控制器接收到這個(gè)請求后,查找對應(yīng)這個(gè)請求的動作映射,再檢查是否創(chuàng)建過相應(yīng)的Action實(shí)例,如果沒有則生成一個(gè)Action實(shí)例,控制器會保存這個(gè)實(shí)例供以后使用。接著調(diào)用actionmapping的方法得到actionForm對象,把a(bǔ)ctionForm作為參數(shù)傳給Action實(shí)例的execute(perform方法在struts1.1中已經(jīng)不再支持)方法。這個(gè)方法結(jié)束之后會返回給控制器一個(gè)actionforward對象??刂破鞲鶕?jù)返回對象將控制權(quán)傳遞給相應(yīng)的視圖組件。
??? 當(dāng)Action實(shí)例執(zhí)行execute()方法時(shí),可能會出現(xiàn)錯(cuò)誤。Struts通過一個(gè)共享機(jī)制使用ActionError對象來產(chǎn)生和顯示錯(cuò)誤信息。Action實(shí)例在error對象中保存這些錯(cuò)誤信息,接著調(diào)用自身的saveerrors方法把這個(gè)錯(cuò)誤保存到request對象的屬性中,接著Action實(shí)例調(diào)用actionmapping對象的getInput方法從映射中獲取input參數(shù)(產(chǎn)生輸入的視圖的全稱),生成actionforward對象返回。在產(chǎn)生輸入的JSP中使用自定義標(biāo)記
3.Struts框架中的組件
3.1 常用的Struts組件
?
??? 組件?角色???
ActionServlet?Struts框架的控制器???
ActionClass?實(shí)現(xiàn)應(yīng)用程序的事務(wù)邏輯處理???
ActionForm?顯示模塊數(shù)據(jù)???
ActionMapping?協(xié)助控制器將請求映射到操作???
ActionForward?指示操作轉(zhuǎn)移對象???
ActionError?存儲錯(cuò)誤???
StrutsTaglib?簡化創(chuàng)建頁面的過程?
3.2 Struts配置文件
??? Struts配置文件是一個(gè)XML文件,名稱和位置的默認(rèn)值是\WEB-INF\sturts-config.xml。配置文件中可以對JDBC數(shù)據(jù)源、? ActionForm bean、全局轉(zhuǎn)發(fā)、ActionMapping、控制器配置以及定義消息資源文件等進(jìn)行配置。
3.3 ActionServlet
??? ActionServlet繼承自javax.servlet.http.HttpServlet類,是Struts 框架的控制器。ActionServlet主要負(fù)責(zé)將HTTP的客戶請求信息組裝后,根據(jù)配置文件的指定描述,轉(zhuǎn)發(fā)到適當(dāng)?shù)奶幚砥?。按照Servelt標(biāo)準(zhǔn), ActoinServlet必須在Web Application 的發(fā)布描述器(\WEB-INF\web.xml)中聲明,并設(shè)置成啟動時(shí)加載。
??? 控制器用以下方式在完成一個(gè)請求:
.?將請求的URI與適當(dāng)?shù)腁ctionMapping匹配
.將請求映射到相應(yīng)的Action類的Java類名稱,如果這是特定的Action類的第一個(gè)請求,Servlet將初始化這個(gè)實(shí)例并緩存。
.創(chuàng)建或?qū)ふ乙粋€(gè)ActionForm Bean實(shí)例,然后將請求的參數(shù)移植到Bean。
.調(diào)用Action實(shí)例的execute()方法,并將ActionForm bean、ActionMapping、request、response對象作為參數(shù)傳遞給它。
.將execute()方法返回的響應(yīng)轉(zhuǎn)發(fā)到ActionForward對象指定的資源。
3.4 Action Classes
??? Action類擴(kuò)展自Struts的org.apache.struts.action.Action,開發(fā)人員需要覆蓋其中的execute()方法。Action 類的功能就是實(shí)現(xiàn)應(yīng)用程序的事務(wù)邏輯,同時(shí)提供認(rèn)證、日志和數(shù)據(jù)驗(yàn)證等其它功能。Action類中最為常用的方法是處理HTTP請求的execute()方法。當(dāng)ActionServlet收到客戶的請求的時(shí)候,將請求轉(zhuǎn)移到一個(gè)Action實(shí)例,然后調(diào)用這個(gè)Action實(shí)例的execute()方法。Struts 框架為應(yīng)用系統(tǒng)中的每一個(gè)Action類只創(chuàng)建一個(gè)實(shí)例,因?yàn)樗械挠脩舳际褂眠@個(gè)實(shí)例,所以在設(shè)計(jì)Action類時(shí),需要注意以下兩點(diǎn):
.不能使用實(shí)例變量或靜態(tài)變量存儲特定請求的狀態(tài)信息。
.如果要訪問的資源在并行時(shí)需要進(jìn)行保護(hù),那么訪問就要進(jìn)行同步。
3.5 ActionForm
??? Actionform類擴(kuò)展自Struts中的org.apache.struts.action.ActionForm類,Struts框架假設(shè)用戶在應(yīng)用程序中為每個(gè)表單都創(chuàng)建一個(gè)ActionForm Bean。 ActionForm的主要功能就是為Action提供與客戶表單相對應(yīng)的數(shù)據(jù)(在指定的情況下,也可以對數(shù)據(jù)進(jìn)行有效性校驗(yàn),在struts1.1中,雖然可以使用,但校驗(yàn)功能逐漸被淡化)。ActionForm Bean還負(fù)責(zé)對系統(tǒng)數(shù)據(jù)狀態(tài)的保持,在Action根據(jù)業(yè)務(wù)邏輯需要改變系統(tǒng)狀態(tài)后,ActionForm會自動更新狀態(tài)并保持。Struts 框架在調(diào)用execute()方法前,用以下步驟處理ActionForm:
(1)?根據(jù)
(2)?根據(jù)
(3)?調(diào)用form bean的reset()方法。
(4)?調(diào)用對應(yīng)的set方法,對狀態(tài)屬性賦值。
(5)?如果
3.6 Struts Action Mapping
??? ActionMapping協(xié)助進(jìn)行框架內(nèi)部的流程控制??刂破魍ㄟ^ActionMaping將請求映射到Action類,并且將Action類與ActionForm bean相關(guān)聯(lián)。在struts 中,ActionMapping存儲在特定的XML文件(struts-config.xml)中。這些配置信息在系統(tǒng)啟動的時(shí)候被讀入內(nèi)存,供struts框架在運(yùn)行期間使用。ActionMapping對象通過使用
?
??? 元素屬性?說明???
name ?與Action關(guān)聯(lián)的Form bean的名稱???
type?Action類的全稱???
path?Action類的相對路徑???
input?產(chǎn)生輸入的表單名稱???
scope?ActionForm Bean的作用域???
validate?是否調(diào)用ActionForm bean的validate()方法?
3.7 ActionForward
??? ActionForward類的邏輯名稱由配置文件中的
3.8 ActionError
??? Struts框架處理錯(cuò)誤的類是:ActionError和ActionErrors。
??? ActionError類定義了一組重載的構(gòu)造器來創(chuàng)建錯(cuò)誤信息。構(gòu)造器的一種方法是使用一個(gè)字符串作為參數(shù),實(shí)例error映射到應(yīng)用程序資源文件中的一個(gè)錯(cuò)誤信息。另一種方法使用了java.text.MessageFormat類,可以用來在消息中替換字符串。
??? ActionErrors對象保存著ActionError類的集合以及它們的特定屬性值,開發(fā)人員可以使用自己定義的屬性值,或者使用ActionErrors.GLOBAL.ERROR。
3.9 Struts TagLib
Struts提供了一組可擴(kuò)展的自定義標(biāo)記庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前自定義標(biāo)記庫由四類標(biāo)記組成:
. Bean標(biāo)記:用來在JSP頁面中定義、訪問Bean及其屬性
.?HTML標(biāo)記:用來創(chuàng)建動態(tài)HTML頁面。
. Logic標(biāo)記:Logic標(biāo)記能夠有條件地產(chǎn)生輸出文本、在對象集合中循環(huán)地輸出文本,進(jìn)行一定程度上的應(yīng)用流程管理。
. 模板標(biāo)記:Struts使用模板標(biāo)記庫來實(shí)現(xiàn)動態(tài)模板,從而使WEB頁面布局的修改更加容易。
4.Struts框架開發(fā)工具" title="開發(fā)工具">開發(fā)工具及容器
4.1 開發(fā)工具
??? 自從Struts 發(fā)布以來,出現(xiàn)了許多可視化工具用于協(xié)助Struts開發(fā)。筆者建議采用以下幾中GUI 工具之一來協(xié)助開發(fā)。
. Borland 公司的Jbuilder 8。作為Java開發(fā)工具市場中處于領(lǐng)先地位的開發(fā)工具,其中包括了對Jakarta Struts1.0的支持。通過使用Easy Struts插件與Jbuilder8的結(jié)合,Jbuilder8提供了對Struts1.1的支持。使用Jbuilder8,可以在一個(gè)環(huán)境中完成Web開發(fā)的所有步驟,使Struts開發(fā)變成一件非常簡易的事情。
.?WebSphere Studio Application Developer是 IBM 最新為 J2EE 開發(fā)人員提供的集成開發(fā)環(huán)境。WebSphere Studio Workbench 構(gòu)建于開放源碼 Eclipse 平臺之上。Eclipse.org 是一個(gè)開發(fā)工具供應(yīng)商聯(lián)盟,這些供應(yīng)商正為來自不同供應(yīng)商的工具的無縫集成提供一種公共平臺而工作。
.?Camino是第一個(gè)真正針對Struts應(yīng)用程序的可視化工具。Camino3.0 對Struts1.1有強(qiáng)大的支持。它所包含的許多功能可以簡化Struts web應(yīng)用程序的開發(fā)。
4.2 容器
??? Struts需要通過Servlet容器實(shí)現(xiàn)Web應(yīng)用。Struts要求容器符合Servlet規(guī)范2.2(或更高版本)和JavaServer Pages 規(guī)范1.1(或更高版本)。在眾多容器中,筆者推薦同是Apache項(xiàng)目的Tomcat4.X容器,這個(gè)容器不需進(jìn)行額外配置就可運(yùn)行struts。在商業(yè)應(yīng)用中,筆者推薦BEA公司的WebLogic。WeblogicServer不僅提供對Struts支持,而且是一種廣泛使用的Java應(yīng)用服務(wù)器,用于組建多層次、安全、大型和分布式的Web應(yīng)用。
5.結(jié)束語
??? 目前,我國各種規(guī)模的企業(yè)擁有相當(dāng)多的信息技術(shù)設(shè)備,也培養(yǎng)和儲備了一些自己的信息化人才隊(duì)伍。對于大型企業(yè),建設(shè)如MIS、ERP等重大信息工程可以通過聯(lián)合大公司,采用合作開發(fā)的方式實(shí)現(xiàn)。對于中小型企業(yè),如何利用有限的資金,利用現(xiàn)有人員、跟隨先進(jìn)技術(shù)自主開發(fā)適合本企業(yè)規(guī)模的信息系統(tǒng),是目前各企業(yè)需要認(rèn)真對待的問題。
??? Struts開發(fā)仍然處于發(fā)展階段,發(fā)行版本 1.0 和1.1之間,有了很大改進(jìn)。隨著 Struts 小組的不斷努力,具備開源項(xiàng)目特有優(yōu)點(diǎn)的Struts 框架會使開發(fā)人員對 JSP 和 servlet 的特性、以及如何將它們組合起來用于 Web 應(yīng)用有更好的了解。筆者在本單位的信息化建設(shè)中,經(jīng)過一段時(shí)間的學(xué)習(xí),采用Struts 框架,以Web方式實(shí)現(xiàn)了業(yè)務(wù)部門提出的需求,希望Struts也能成為中小企業(yè)實(shí)現(xiàn)信息化的一個(gè)重要技術(shù)手段。
參考文獻(xiàn)
kevin Duffey,Vikram Goyal.Professional JSP Site Design.Wrox Press.2002.07
Ted Husted,Cedric Dumoulin.Struts in Action. Manning Publications Co.2002.11
Chuck Cavaness. Programming Jakarta Struts. O'Reilly. 2002.11
Struts 文檔、安裝說明,Struts主頁。
Malcolm Davis. Struts,MVC 的一種開放源碼實(shí)現(xiàn), IBM developerWorks
龔永生. 當(dāng)前流行的J2EE WEB應(yīng)用架構(gòu)分析. IBM developerWorks
?