摘要:Struts是實現MVC模式的具體應用框架之一,其核心為一個靈活的,基于Java、Servlets、JavaBeans、XML等標準技術的控制層。該文提出了一種基于XML的改進的Struts框架,以彌補其局限性。
關鍵詞:XML;Struts架構;XSLT;Web
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)33-9264-03
Research and Application in improved Struts Framework with XML
LU Yang1, YIN Kai2
(1.Changzhou Institute of Engineering Technology, Changzhou 213164, China; 2.Changzhou Institute of Technology, Changzhou 213002, China)
Abstract: Struts is one of application frameworks based on the MVC design paradigm. The core of the Struts framework is a flexible control layer based on standard technologies like Java, Servlets, JavaBeans, and XML. This paper put forward an improved Struts framework,based on XML, to make up it’s limitations.
Key words: XML; struts framework; XSLT; web
目前,基于Java的Web應用很多是由一組JSP頁面構成的,這種以JSP為中心的開發模型又稱之為JSP模式1。這種開發模式可以很好的滿足快速和小規模的應用開發的需要,但是不能滿足大型應用的要求,從工程化的角度考慮,它也有一些不足之處:
1) 應用的實現一般是基于過程的,一組JSP頁面實現一個業務流程,如果要進行改 動,必須在多個地方進行修改。這樣非常不利于應用擴展和更新。
2) 由于應用不是建立在模塊上的,業務邏輯和表示邏輯混合在JSP頁面中,頁面被嵌入大量的Script或Java代碼,非常不利于系統的重用和改動。
為了解決這些問題,在開發大型的Web應用時可以采用JSP模式2,一個基于MVC模式的框架。MVC是Model-View-Controller的縮寫,Model代表的是應用的業務邏輯(通過JavaBean、EJB組件實現),View是應用的表示層(由JSP頁面實現),Controller提供應用的處理程控(一般由一個Servlet實現)。這種設計模型可以把應用邏輯、處理過程和顯示邏輯分開由不同的組件實現。這此組件可以進行交互和重用,從而彌補了JSP模式1的不足。
1 Struts體系結構
Struts由一組相互協作的類(組件)、Servlet以及JSP卷標庫組成?;赟truts架構的Web應用程序基本上符合JSP模式2的設計標準,可以說是MVC設計模式的一種實現。
Struts有其自己的控制器(Controller),同時整合了其它的一些技術去實現模型層(Model)和視圖V(View)。在模型層,Struts可以很容易的與數據訪問技術相結合,包括EJB、JDBC等。在視圖層,Struts能夠與JSP、XSL等等這些表示層組件相結合。既然Struts叫做Web Framework,那么它肯定主要基于Web層進行應用系統開發。
圖1顯示了Struts的體系結構,在響應客戶請求時,各個部分的工作原理。
1.1 視圖(view)組件
Struts應用中的View部分是通過JSP技術實現的。Java開發者很容易在JSP當中通過使用Java小程序,直接嵌入條件業務邏輯和循環。通過把復雜的處理分離到Model和Controller組件中,從而使JSP本身更小,大大簡化并加速了開發、測試及維護的工作。Struts除了提供MVC構架以外還提供了一整套自定義的JSP標記,通過這些自定義標記可以非常好的和系統的Model部分交互,通過使用這些自定義標記創建的JSP窗體,可以實現和Model部分中的ActionForm的映像,完成對用戶數據的封裝。
1.2 模型( Model ) 組件
MVC系統中的Model部分從概念上可以分為兩類:系統的內部狀態和改變系統狀態的動作。Struts通常使用一組JavaBean表示系統的內部狀態,根據系統的復雜度也可以使用像Entity EJB和Session EJB等組件來實現系統狀態。Struts為Model部分提供了Action和ActionForm對象:所有的Action處理器對象都是從Struts的Action類派生的子類。Action處理器對象封裝了具體的處理邏輯,調用業務邏輯模塊,并且把響應提交到合適的view組件以產生響應。Struts提供的ActionForm組件對象,它可以通過定義屬性描述客戶端窗體數據。可以從它派生子類對象,利用它和Struts提供的自定義標記庫結合可以實現對客戶端的窗體數據的良好封裝和支持,Action處理器對象可以直接對它進行讀寫,而不再需要和request、response對象進行數據交互。通過ActionForm組件對象實現了對View和Model之間交互的支持。Struts在實現時把做什么(Action)和如何做(業務邏輯)分離,這樣,可以實現業務邏輯的重用 。
1.3 控制器(Controller)組件
控制器的作用是從客戶端接受請求,并且選擇執行相應的業務邏輯,然后把響應結果送回到客戶端。在Struts中,Controller功能由ActionServlet和ActionMapping對象構成:核心是一個Servlet類型的對象ActionServlet,它用來接受客戶端的請求。ActionServlet包括一組基于配置文件生成的ActionMapping對象,每個ActionMapping對象實現了一個請求到一個具體的Model部分中Action處理器對象之間的映像。Struts框架的處理流程清楚的體現了MVC系統的特點,Struts Controller ActionServlet處理客戶請求,利用配置的ActionMapping 對象把請求映像到Action處理器對象進行處理。Action處理對象訪問ActionForm中的數據,處理和響應客戶請求,它還調用后臺的Bean組件,這些組件封裝了具體的業務邏輯。
Action處理器對象根據處理結果通知Controller進行下一步的處理。由于Struts已經提供了一個非常好的MVC框架,利用Struts開發MVC系統時可以大大加快開發的速度。
具體在使用Struts框架時,對應各個部分的開發工作主要包括:
1) Model部分:采用JavaBean和EJB組件,設計和實現系統的業務邏輯。根據不同的請求從Action派生具體Action處理對象。完成“做什么”的任務來調用由Bean構成的業務組件。創建由ActionForm的派生類實現對客戶端窗體數據的封裝。
2) Controler部分:Struts提供了核心控制部分的實現。只要配置ActionMapping對象。
3) View部分:為了使用Model中的ActionForm對象,必須用Struts提供的自定義標記創建HTML窗體。利用Struts提供的自定義標記庫編寫用戶接口,把應用邏輯和顯示邏輯分離。Struts框架通過這些自定義標記建立了View和Model之間的聯系。Struts的自定義標記還提供了很多定制頁面的功能。
同時需要編輯兩個配置文件:web.xml和struts-config.xml。通過它們配置struts系統中的各個模塊之間的交互。
2 Struts框架的改進
雖然Struts框架具有先進性、可擴展性、標準性、開放性以及安全性和高效性。但是也存在著一定的局限性:
1) 程序員可以把應用邏輯放入JSP。這顯然與Struts的設計基礎MVC模式的思想相違背,Model與View混在一起使程序結構變得復雜和難于管理。
2) JSP不能很好地支持XML,也就不能保證生成的結果文檔(XML或HTML文檔)將會是100%“格式良好”(Well-Formed)。而在當前支持Internet的訪問設備不斷涌,JSP作為View不能適應多種類型的客戶端。
3) 程序員需要學習如何使用Struts的標志庫。這需要花費比較長的時間。
4) 對JSP頁面的任何修改都會導致JSP的重新編譯,這樣是非常耗費時間的。
2.1 XSLT技術
由于Struts是一個開放的架構,因此可以考慮對Struts進行改造,克服其局限性,希望能達到下列要求:
1) 避免使用JSP和標簽庫,強制使用格式良好的XML和HTML,使其適用各種類型的客戶端。
2) 減少業務邏輯與表現邏輯合并的可能性。
3) 降低對視圖不同部分分離的難度,比如布局和風格的分離。
基于上述考慮,可以考慮使用XSLT技術,用傳統的Struts技術和XSLT技術一起構造一個輕型框架。XSLT(eXtensible Stylesheet Language Transformation)是一種用來轉換XML文件結構的語言。它可以把XML數據轉換成純文本、PDF、HTML/XHTML、WML、VoiceXML等任意XML格式。
XML是一個完整的樹結構文件,可以實現數據和表達形式分離以及在不同的應用之間傳輸數據。XPath是XSLT的重要組成部分,是一種專門用來在XML文件中查找信息的語言,它提供了操縱XML文件中的字符串、數字以及布爾伯的基本工具。
XSL轉換通常涉及三個文檔:源文件、目標文件和含有模板規則的文件,即XSL樣式表,XSL處理器負責實現轉換過程。首先,XML源文檔被解析成DOM樹存放在內存中,接著對文檔進行分析,DOM樹中的每一個節點都會與一個模式相比較,當二者匹配時,就會按照模板中定義的規則進行轉換,否則繼續往下匹配。如此循環,直至整個文檔處理完畢。圖2是XSL的轉換原理圖。
XSLT/XPath的基本理念是分離數據的內容和它的表現形式,以便把同方便地以不同的形式或格式輸出,滿足不同顯示設備的需要。也就是說,一份數據在不改動輸入的XML文檔的情祝下,對于每一種不同的輸出格式,只需定義相應的XSL樣式表。對于Struts應用來說,這意味著:
1) 在單一的XML文檔中存儲(描述)所有的數據;
2) 對于不同的終端設備,可以定制不同的XSL樣式表。在XSL樣式表的幫助下,針對不同的訪問設備,把XML文件轉換成任意XML數據格式輸出,能夠很方便地支持IE、手機、PDA等多種Internet訪問設備。
2.2 Struts框架的改進方案
由于XSL具有分離數據內容和表現形式的特點以及XSLT具有強大的轉換功能,可以考慮把XSL和Struts結合在一起,形成改進方案。該方案是利用XSL來替換 Struts中生成View的JSP組件,但原封不動地保留了Controller和Model兩部分。
該方案中,增加了一個組件XSLServlet。它配合XSL樣式表實現了原來在Struts中由JSP和taglib實現的視圖部分。這個XSLServlet首先根據ActionForm和上下文環境生成一個XML文檔,然后根據相應的XSL樣式表進行轉換。由于可以把一個請求提交給任何一個己經在Struts配置文件中注冊的URL,所以這個過程的實現不需要對Struts的Controller做任何的修改。
改進后的Struts處理流程的最初部分和Struts的類似。請求被發送到Struts的控制器ActionServlet,然后又被分派給各自的業務邏輯處理單元(Action類的子類)??刂破鲃摻ˋctionForm對象,請求的參數都保存到這個ActionForm對象中。Action類的了類處理完畢后返回ActionForward類,由ActionServlet轉發到正確的客戶端。在View部分,傳遞的目標不再是JSP,而是一個XSLServlet。這個Servlet利用存放客戶數據和結果的ActionForm和上下文組織構造一個XML文件,并利用XSL樣式表轉換該文件后送到客戶端。由于該框架采用了XSLT技術,因此構造XML文檔、選擇XSL轉換方式等問題也需要從系統需求出發作出相應的選擇。
目前,處理XML文檔的方式主要有SAX、DOM、JDOM(Java Document ObjectModel) 幾種,而JDOM是最適合Struts的一種方式。其它的API是通用的,而JDOM是基于Java的API。它是用Java開發并為Java提供服務的,沿用了Java代碼的規范和類庫,以簡單易懂的方式向Java開發人員描述了XML文檔和文檔的內容。因此考慮采用JDOM構造XML文檔。
利用JAXP(Java API for XML Processing)封裝XML的整個轉換過程。JAXP是一個用來解析XML的Java API,支持DOM、SAX、XSLT等標準對XML文檔進行處理。JAXP是獨立于任何特定的XML處理器實現的,可以為不同的解析器提供了標準的接口。因此,JAXP相當于應用程序和某個具體XML解析器或XSLT處理器之間的一個抽象層,使得應用程序可以不依賴于特殊的XML處理執行來解析和轉換XML文檔,所以開發者可以使用多種XML處理器而無需改變應用程序代碼,從而具有良好的通用性。
XSLServlet是本改進方案中的關鍵組件,有幾個輔助類,最主要的是ISDocumentBuilder 和ISTransformer。構造和轉換XMl文檔由XSLServlet和它的輔助類完成。XSLServlet通過以下方式工作:
1) 根據User-Agent域判斷客戶端設備的類型;
2) 在ISDocumentBuilder的幫助下,構造一個XML文檔;
3) 把該文檔傳遞給ISTransformer,根據不同的終端設備類型選擇相應的樣式表轉換XML文件。
ISDocumentBuilder通過HttpServletRequest、HttpSession和ServletContext獲得創建XML輸出文件所需要的信息,同時要保證創建的文件符合接口XML。
實際的XSL轉換過程是由ISTransformer類完成的。ISTransformer類利用JAXP抽象了底層用到的XSLT處理器,封裝整個轉換過程。當然,要順利執行轉換,必須提供一個適當的XSL樣式表,并且由具體Action類選擇并加入到HttpServletRequest中。根據客戶端設備類型和XSL樣式表,XML文件將被轉換成所需要的顯示格式。
2.3 改進后的Web應用系統框架設計
將系統設計為四層Web體系結構:客戶層、Web層、業務層和資源層,如圖3所示。其中Web層和業務層在應用服務器上實現,資源層放在數據庫服務器上??刂破骺刂葡到y的整個流程,讀取配置文件,將請求映像到相應的業務組件并執行業務邏輯。視圖部分封裝在XML文檔中,并為不同的訪問設備提供不同的樣式表以支持多種訪問設備。模型部分包括系統中所有的業務邏輯和數據映像,采用JavaBean和EJB組件技術實現,模型部分通過標準的JDBC訪問數據庫。
參考文獻:
[1] 周海燕.基于Struts框架的Web開發的研究與應用[J].微計算機信息,2007,24(4-3):186-188.
[2] 孫衛琴.精通 Struts[M].北京:電子工業出版社,2004.
[3] 陳奇.XS LT、XPath和DOM的應用研究[J].計算機工程,2003,29(3):14-16.