陳峰
MVC是一種目前廣泛流行的軟件設計模式,它的全稱是Model-View-Controller,即把一個應用的輸入、處理、輸出流程按照Model(模型層)、View(視圖層)、Controller(控制層)的方式進行分離。MVC model 2是一種聯(lián)合JSP與servlets來實現(xiàn)動態(tài)內容服務的方法。Struts是一個基于MVC model 2的很好框架。而StrutsCX是MVC model 2x的極好實現(xiàn)。它基于Struts框架,完全摒棄JSP,采用純XML和XSLT技術,并支持多種語言。通過它,開發(fā)人員可以方便地用標準的XML和XSL技術生成HTML、XML、PDF等多種輸出格式。筆者提出一種全新的基于StrutsCX框架的信息發(fā)布技術路線,并在此基礎上實現(xiàn)一個信息發(fā)布平臺,具有信息添加、刪除、修改等功能。
Struts繼承MVC的各項特性,并根據J2EE的特點,做了相應的變化與擴展。Struts用它自定義的標簽庫和JSP頁面處理視圖層(View),用Action Form Bean表示和保存數(shù)據,用自己提供的ActionServlet實現(xiàn)控制層(Controller)。如圖1所示,Struts首先將Request上的參數(shù)組裝成Action Form bean,然后將Action Form bean傳給某個具體的Action類進行處理,將處理后的結果保存在一個bean中,通過自定義標簽庫將結果bean中的信息顯示成HTML輸出。其中struts-config.xml為Struts的配置文件,用于建立Controller和Model之間的關系。
Struts聯(lián)合JSP和servlets的優(yōu)點。比較Struts和傳統(tǒng)的JSP技術,可得出Struts有以下幾個優(yōu)勢。
1)Struts不存在從JSP到Service層的直接調用,簡化了JSP頁面,清晰了程序員和頁面制作人員的分工。
2)Struts具有組件化的優(yōu)點,整個邏輯流在一個分等級的文本文件中,易于實現(xiàn)對大規(guī)模系統(tǒng)的開發(fā)和維護。

圖1 Struts流程圖
3)Struts配置文件struts-config.xml提供了操作、表單和屏幕的集中映射,讓開發(fā)人員更易于理解整個應用程序,特別是在應用程序很大的情況下。
但Struts也有其不足,如復雜性和層都有所增加,美工人員需要學習全新的Tag Lib。而且View層仍采用JSP,開發(fā)人員還是可以在其中寫邏輯代碼。由于JSP對XML的支持不佳,用戶想要獲得各種格式的文檔并非易事。
將Struts中的View層用XML/XSLT技術替換掉,這就是Model 2x模式。它極大程度地發(fā)揮了XSLT的優(yōu)勢。作為一種W3C的正式標準,XSLT提供了一種把XML數(shù)據轉換成純文本、PDF、HTML/XHTML、WML、VoiceXML等任意XML格式的靈活、強大的工具[1]。XSLT是高度可定制和可擴展的,并且已經獲得廣泛的支持(已經存在包括Xalan在內的20多種XSLT處理器)。StrutsCX即基于MVC model 2x的一個極好實現(xiàn)。
1)StrutsCX工作原理。StrutsCX把Struts和XSLT的優(yōu)勢結合到一起,很好地實現(xiàn)Model 2x模式。其具體流程如圖2所示。比較圖1和圖2可得,StrutsCX在Struts的基礎上修改View層的內容。它的核心是Struts CX Servlet類。StrutsCXServlet功能包括生成XML文檔,讀取struts-config.xml得到相應的XSL文件,并通過XSLT輸出最終結果。
StrutsCX的配置也由XML文件實現(xiàn)。其中strutsconfig.xml是標準的Struts配置文件,功能和Struts中的相同,只是把其中指定View層的參數(shù)由原來的JSP文件名改為Struts CX Servlet。Strutscx-config.xml是StrutsCX專有的配置文件,它讓StrutsCX獲知到哪里去尋找StrutsCX資源屬性文件,例如語言、環(huán)境、XSL文件等配置。

圖2 StrutsCX的工作流程
2)StrutsCX的技術優(yōu)勢。在實際應用中同基于Struts框架的信息發(fā)布平臺相比較,筆者得出StrutsCX的以下幾點優(yōu)勢:①StrutsCX完全不采用JSP,而通過StrutsCX把XML格式的文件經過XSLT轉換最后輸出,從而使整個Web應用避免使用JSP和標記庫,省略大量的聲明,開發(fā)人員不用再學習Struts提供的不太標準的自定義標簽庫;②不采用JSP的同時也避免開發(fā)人員將邏輯代碼寫在JSP中,真正明晰地劃分業(yè)務邏輯層和表現(xiàn)層的界限;③StrutsCX充分發(fā)揮XSLT的優(yōu)勢,利用XSLT可以方便地獲得各種輸出格式,如HTML、PDF和其他各種XML格式,而不再像JSP那樣以HTML為中心。StrutsCX采用i18n實現(xiàn)國際化,它允許以不同的語言和編碼方式保存、輸出內容。
采用StrutsCX結構編程,通過searchnews.jar調用xmlutil和infopublish軟件包中的方法從數(shù)據庫中讀取數(shù)據表Content中的數(shù)據,并通過StrutsCX采用XSLT轉換成為HTML格式顯示出結果。
TestAction.java:用戶Action類,處理Request請求,調用相應的EJB方法,將輸出結果表示為XML文檔形式。
test.xsl:XSL樣式文件。
searchnews.jar:session bean,用來讀取數(shù)據庫中Content數(shù)據表中的數(shù)據。
db.xml:定義系統(tǒng)使用的數(shù)據表結構。數(shù)據表Content相應的XML配置文件放在jboss目錄下。
xmlutil.jar:session bean,用來連接數(shù)據庫,并將取出的數(shù)據封裝為XML文檔對象。
InfoPublish.jar:Java Bean,定義基本數(shù)據類型。
在struts-config.xml中設置forward的path參數(shù)為“/StrutsCXServlet/”,在strutscx-config.xml中設置輸出格式為HTML,則相應的XSL樣式文件test.xsl的路徑為“/WEB-INF/xsl/html/test.xsl”。
StrutsCX提供的調試變量主要有debugxml和encoding。設置encoding變量為gb2312。 設置debugxml變量為true,則輸出XML格式的文檔(如圖3所示)。值得注意的是,此時除了用戶信息文件(圖中XML DATA部分),還會一起輸出由StrutsCX自己生產的XML文檔,包括RESSOURCEN PROPERTIES、ERROR PARAMETERS、REQUEST PARAMETERS和SESSION PARAMETERS。由于篇幅限制,這里沒有在圖中顯示。
debugxml的缺省值為false,此時輸出用戶指定格式的文檔,本例中設為HTML格式。最后輸出如圖4所示。

圖3 xml格式的輸出

圖4 HTML格式的輸出
本文給出基于StrutsCX框架的網絡信息發(fā)布的方法。實際應用表明,采用該方法的信息發(fā)布平臺分層結構清晰,輸出格式靈活,并且便于管理和二次開發(fā)。完善的信息發(fā)布平臺功能還包括對信息的查詢、修改、增加等,由于篇幅限制,這里未能具體討論。同StrutsCX類似的另一種框架為Struts+Cocoon,關于2種方法的優(yōu)缺點比較還有待深入研究。
[1]Woehrlin B. Generate Web Output in Multiple Formats and Languages with StrutsCX[EB/OL].http://www.devx.com/Java/Article/11381
[2]StrutsCX-Struts with XSLT[EB/OL].http://it.cappuccinonet.com