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