《電子技術應用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > 基于Struts框架的J2EE WEB應用

基于Struts框架的J2EE WEB應用

2008-12-22
作者:孫剛,孟祥武

1.前言
??? 伴隨著軟件開發(fā)技術的發(fā)展,基于組件的開發(fā)方法越來越受開發(fā)人員的青睞,通過采用組件技術,復雜的系統(tǒng)由可重用、易擴展,具有結合性的小系統(tǒng)組成,開發(fā)人員有更充裕的時間用來分析、構建業(yè)務邏輯,而不是浪費在繁雜代碼的編寫上。
組件通常設計成框架(framework)的一個組成部分,框架的作用是將獨立的組件結合在一起形成應用程序" title="應用程序">應用程序進行發(fā)布。選擇一個好的框架,開發(fā)人員基本上只需要在限制的范圍內編寫相應業(yè)務組件,由框架管理這些組件之間的協作,從而得到結構良好、質量可靠的Web應用。
??? Struts框架是Apache組織的一個開放源碼" title="開放源碼">開放源碼項目,一個基于J2EE平臺的Web應用系統(tǒng)" title="應用系統(tǒng)">應用系統(tǒng)框架。Struts采用MVC模型規(guī)范,結合了Servlet、JSP、JavaBean的技術特點,并使這些技術合理分工,緊密配合,達到程序結構清晰,易于開發(fā)、維護的目標。
Struts框架具有MVC模型的所有特性和優(yōu)點,簡化了基于MVC的應用程序的開發(fā),并且可以通過擴展以實現特定的需求;Struts框架使用XML文件來配置默認的框架,有利于開發(fā)人員的理解流程控制。
2.Struts體系結構
??? 從MVC的角度觀察,Struts框架由模型、視圖、控制器組成。
2.1 模型
??? Struts中模型分為兩大部分:
.系統(tǒng)內部狀態(tài)。分為表單" title="表單">表單Beans:保存HTTP請求傳來的數據;業(yè)務邏輯beans: 處理業(yè)務邏輯;系統(tǒng)狀態(tài)beans:保存跨越多個HTTP請求的單個客戶的會話信息、系統(tǒng)狀態(tài)。
.改變狀態(tài)的操作。大型應用系統(tǒng)通常在方法內部封裝操作(事務邏輯),這些方法可以被擁有狀態(tài)信息的Bean進行調用。在中、小型應用系統(tǒng)中,操作可以被內嵌在Action類中,成為Struts框架中控制器的一部分,在邏輯比較簡單時通常采用這樣的方法。
2.2 視圖
??? 視圖通常使用JSP建立。Struts框架包含一個可擴展的自定義標記庫,可以簡化創(chuàng)建完全國際化的用戶界面的過程,同時,可以與模型中的ActionForm Bean進行交互。
2.3 控制器
??? 控制器處理所有發(fā)送到Struts 的HTTP請求。它截取和分發(fā)這些請求到相應的動作類(Action類的子類),負責用相應的請求參數填充 From bean并傳給動作類。在動作類通過訪問Java bean 或調用EJB實現核心商業(yè)邏輯后,根據動作類的返回值把控制權傳遞給相應的JSP文件,生成視圖。
2.4體系結構概述
??? 系統(tǒng)初始化時,ActionServlet對配置文件(默認為struts-config.xml)進行分析,然后根據其中定義的映射轉發(fā)相應的HTTP請求。
??? 當用戶發(fā)出HTTP請求,控制器接收到這個請求后,查找對應這個請求的動作映射,再檢查是否創(chuàng)建過相應的Action實例,如果沒有則生成一個Action實例,控制器會保存這個實例供以后使用。接著調用actionmapping的方法得到actionForm對象,把actionForm作為參數傳給Action實例的execute(perform方法在struts1.1中已經不再支持)方法。這個方法結束之后會返回給控制器一個actionforward對象??刂破鞲鶕祷貙ο髮⒖刂茩鄠鬟f給相應的視圖組件。
??? 當Action實例執(zhí)行execute()方法時,可能會出現錯誤。Struts通過一個共享機制使用ActionError對象來產生和顯示錯誤信息。Action實例在error對象中保存這些錯誤信息,接著調用自身的saveerrors方法把這個錯誤保存到request對象的屬性中,接著Action實例調用actionmapping對象的getInput方法從映射中獲取input參數(產生輸入的視圖的全稱),生成actionforward對象返回。在產生輸入的JSP中使用自定義標記,從當前作用域的資源文件中讀取錯誤消息關鍵字和錯誤消息并在頁面上顯示。
3.Struts框架中的組件
3.1 常用的Struts組件

?
??? 組件?角色???
ActionServlet?Struts框架的控制器???
ActionClass?實現應用程序的事務邏輯處理???
ActionForm?顯示模塊數據???
ActionMapping?協助控制器將請求映射到操作???
ActionForward?指示操作轉移對象???
ActionError?存儲錯誤???
StrutsTaglib?簡化創(chuàng)建頁面的過程?
3.2 Struts配置文件
??? Struts配置文件是一個XML文件,名稱和位置的默認值是\WEB-INF\sturts-config.xml。配置文件中可以對JDBC數據源、? ActionForm bean、全局轉發(fā)、ActionMapping、控制器配置以及定義消息資源文件等進行配置。
3.3 ActionServlet
??? ActionServlet繼承自javax.servlet.http.HttpServlet類,是Struts 框架的控制器。ActionServlet主要負責將HTTP的客戶請求信息組裝后,根據配置文件的指定描述,轉發(fā)到適當的處理器。按照Servelt標準, ActoinServlet必須在Web Application 的發(fā)布描述器(\WEB-INF\web.xml)中聲明,并設置成啟動時加載。
??? 控制器用以下方式在完成一個請求:
.?將請求的URI與適當的ActionMapping匹配
.將請求映射到相應的Action類的Java類名稱,如果這是特定的Action類的第一個請求,Servlet將初始化這個實例并緩存。
.創(chuàng)建或尋找一個ActionForm Bean實例,然后將請求的參數移植到Bean。
.調用Action實例的execute()方法,并將ActionForm bean、ActionMapping、request、response對象作為參數傳遞給它。
.將execute()方法返回的響應轉發(fā)到ActionForward對象指定的資源。
3.4 Action Classes
??? Action類擴展自Struts的org.apache.struts.action.Action,開發(fā)人員需要覆蓋其中的execute()方法。Action 類的功能就是實現應用程序的事務邏輯,同時提供認證、日志和數據驗證等其它功能。Action類中最為常用的方法是處理HTTP請求的execute()方法。當ActionServlet收到客戶的請求的時候,將請求轉移到一個Action實例,然后調用這個Action實例的execute()方法。Struts 框架為應用系統(tǒng)中的每一個Action類只創(chuàng)建一個實例,因為所有的用戶都使用這個實例,所以在設計Action類時,需要注意以下兩點:
.不能使用實例變量或靜態(tài)變量存儲特定請求的狀態(tài)信息。
.如果要訪問的資源在并行時需要進行保護,那么訪問就要進行同步。
3.5 ActionForm
??? Actionform類擴展自Struts中的org.apache.struts.action.ActionForm類,Struts框架假設用戶在應用程序中為每個表單都創(chuàng)建一個ActionForm Bean。 ActionForm的主要功能就是為Action提供與客戶表單相對應的數據(在指定的情況下,也可以對數據進行有效性校驗,在struts1.1中,雖然可以使用,但校驗功能逐漸被淡化)。ActionForm Bean還負責對系統(tǒng)數據狀態(tài)的保持,在Action根據業(yè)務邏輯需要改變系統(tǒng)狀態(tài)后,ActionForm會自動更新狀態(tài)并保持。Struts 框架在調用execute()方法前,用以下步驟處理ActionForm:
(1)?根據元素的name屬性,查找form bean的配置信息。
(2)?根據元素的scope屬性,如果在此作用域下,已經存在此form bean實例,那么重用該form bean。否則,就構建一個form bean的實例。
(3)?調用form bean的reset()方法。
(4)?調用對應的set方法,對狀態(tài)屬性賦值。
(5)?如果元素的validate屬性設置為true,那么就調用form bean的validate()方法。如果validate()方法沒有返回任何錯誤,控制器將ActionForm作為參數,傳給Action實例的execute()方法并執(zhí)行。
3.6 Struts Action Mapping
??? ActionMapping協助進行框架內部的流程控制??刂破魍ㄟ^ActionMaping將請求映射到Action類,并且將Action類與ActionForm bean相關聯。在struts 中,ActionMapping存儲在特定的XML文件(struts-config.xml)中。這些配置信息在系統(tǒng)啟動的時候被讀入內存,供struts框架在運行期間使用。ActionMapping對象通過使用元素進行定義,常用元素屬性說明如下:
?
??? 元素屬性?說明???
name ?與Action關聯的Form bean的名稱???
type?Action類的全稱???
path?Action類的相對路徑???
input?產生輸入的表單名稱???
scope?ActionForm Bean的作用域???
validate?是否調用ActionForm bean的validate()方法?
3.7 ActionForward
??? ActionForward類的邏輯名稱由配置文件中的元素定義。ActionForward類描述了一個目標(通常是一個JSP),這個目標是控制器Servlet將Action類的處理結果轉發(fā)的目的地。
3.8 ActionError
??? Struts框架處理錯誤的類是:ActionError和ActionErrors。
??? ActionError類定義了一組重載的構造器來創(chuàng)建錯誤信息。構造器的一種方法是使用一個字符串作為參數,實例error映射到應用程序資源文件中的一個錯誤信息。另一種方法使用了java.text.MessageFormat類,可以用來在消息中替換字符串。
??? ActionErrors對象保存著ActionError類的集合以及它們的特定屬性值,開發(fā)人員可以使用自己定義的屬性值,或者使用ActionErrors.GLOBAL.ERROR。
3.9 Struts TagLib
Struts提供了一組可擴展的自定義標記庫(TagLib),可以簡化創(chuàng)建用戶界面的過程。目前自定義標記庫由四類標記組成:
. Bean標記:用來在JSP頁面中定義、訪問Bean及其屬性
.?HTML標記:用來創(chuàng)建動態(tài)HTML頁面。
. Logic標記:Logic標記能夠有條件地產生輸出文本、在對象集合中循環(huán)地輸出文本,進行一定程度上的應用流程管理。
. 模板標記:Struts使用模板標記庫來實現動態(tài)模板,從而使WEB頁面布局的修改更加容易。
4.Struts框架開發(fā)工具" title="開發(fā)工具">開發(fā)工具及容器
4.1 開發(fā)工具

??? 自從Struts 發(fā)布以來,出現了許多可視化工具用于協助Struts開發(fā)。筆者建議采用以下幾中GUI 工具之一來協助開發(fā)。
. Borland 公司的Jbuilder 8。作為Java開發(fā)工具市場中處于領先地位的開發(fā)工具,其中包括了對Jakarta Struts1.0的支持。通過使用Easy Struts插件與Jbuilder8的結合,Jbuilder8提供了對Struts1.1的支持。使用Jbuilder8,可以在一個環(huán)境中完成Web開發(fā)的所有步驟,使Struts開發(fā)變成一件非常簡易的事情。
.?WebSphere Studio Application Developer是 IBM 最新為 J2EE 開發(fā)人員提供的集成開發(fā)環(huán)境。WebSphere Studio Workbench 構建于開放源碼 Eclipse 平臺之上。Eclipse.org 是一個開發(fā)工具供應商聯盟,這些供應商正為來自不同供應商的工具的無縫集成提供一種公共平臺而工作。
.?Camino是第一個真正針對Struts應用程序的可視化工具。Camino3.0 對Struts1.1有強大的支持。它所包含的許多功能可以簡化Struts web應用程序的開發(fā)。
4.2 容器
??? Struts需要通過Servlet容器實現Web應用。Struts要求容器符合Servlet規(guī)范2.2(或更高版本)和JavaServer Pages 規(guī)范1.1(或更高版本)。在眾多容器中,筆者推薦同是Apache項目的Tomcat4.X容器,這個容器不需進行額外配置就可運行struts。在商業(yè)應用中,筆者推薦BEA公司的WebLogic。WeblogicServer不僅提供對Struts支持,而且是一種廣泛使用的Java應用服務器,用于組建多層次、安全、大型和分布式的Web應用。
5.結束語
??? 目前,我國各種規(guī)模的企業(yè)擁有相當多的信息技術設備,也培養(yǎng)和儲備了一些自己的信息化人才隊伍。對于大型企業(yè),建設如MIS、ERP等重大信息工程可以通過聯合大公司,采用合作開發(fā)的方式實現。對于中小型企業(yè),如何利用有限的資金,利用現有人員、跟隨先進技術自主開發(fā)適合本企業(yè)規(guī)模的信息系統(tǒng),是目前各企業(yè)需要認真對待的問題。
??? Struts開發(fā)仍然處于發(fā)展階段,發(fā)行版本 1.0 和1.1之間,有了很大改進。隨著 Struts 小組的不斷努力,具備開源項目特有優(yōu)點的Struts 框架會使開發(fā)人員對 JSP 和 servlet 的特性、以及如何將它們組合起來用于 Web 應用有更好的了解。筆者在本單位的信息化建設中,經過一段時間的學習,采用Struts 框架,以Web方式實現了業(yè)務部門提出的需求,希望Struts也能成為中小企業(yè)實現信息化的一個重要技術手段。
參考文獻
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 的一種開放源碼實現, IBM developerWorks
龔永生. 當前流行的J2EE WEB應用架構分析. IBM developerWorks

?

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。