陳峰
MVC是一種目前廣泛流行的軟件設(shè)計(jì)模式,它的全稱是Model-View-Controller,即把一個(gè)應(yīng)用的輸入、處理、輸出流程按照Model(模型層)、View(視圖層)、Controller(控制層)的方式進(jìn)行分離。MVC model 2是一種聯(lián)合JSP與servlets來(lái)實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容服務(wù)的方法。Struts是一個(gè)基于MVC model 2的很好框架。而StrutsCX是MVC model 2x的極好實(shí)現(xiàn)。它基于Struts框架,完全摒棄JSP,采用純XML和XSLT技術(shù),并支持多種語(yǔ)言。通過它,開發(fā)人員可以方便地用標(biāo)準(zhǔn)的XML和XSL技術(shù)生成HTML、XML、PDF等多種輸出格式。筆者提出一種全新的基于StrutsCX框架的信息發(fā)布技術(shù)路線,并在此基礎(chǔ)上實(shí)現(xiàn)一個(gè)信息發(fā)布平臺(tái),具有信息添加、刪除、修改等功能。
Struts繼承MVC的各項(xiàng)特性,并根據(jù)J2EE的特點(diǎn),做了相應(yīng)的變化與擴(kuò)展。Struts用它自定義的標(biāo)簽庫(kù)和JSP頁(yè)面處理視圖層(View),用Action Form Bean表示和保存數(shù)據(jù),用自己提供的ActionServlet實(shí)現(xiàn)控制層(Controller)。如圖1所示,Struts首先將Request上的參數(shù)組裝成Action Form bean,然后將Action Form bean傳給某個(gè)具體的Action類進(jìn)行處理,將處理后的結(jié)果保存在一個(gè)bean中,通過自定義標(biāo)簽庫(kù)將結(jié)果bean中的信息顯示成HTML輸出。其中struts-config.xml為Struts的配置文件,用于建立Controller和Model之間的關(guān)系。
Struts聯(lián)合JSP和servlets的優(yōu)點(diǎn)。比較Struts和傳統(tǒng)的JSP技術(shù),可得出Struts有以下幾個(gè)優(yōu)勢(shì)。
1)Struts不存在從JSP到Service層的直接調(diào)用,簡(jiǎn)化了JSP頁(yè)面,清晰了程序員和頁(yè)面制作人員的分工。
2)Struts具有組件化的優(yōu)點(diǎn),整個(gè)邏輯流在一個(gè)分等級(jí)的文本文件中,易于實(shí)現(xiàn)對(duì)大規(guī)模系統(tǒng)的開發(fā)和維護(hù)。
圖1 Struts流程圖
3)Struts配置文件struts-config.xml提供了操作、表單和屏幕的集中映射,讓開發(fā)人員更易于理解整個(gè)應(yīng)用程序,特別是在應(yīng)用程序很大的情況下。
但Struts也有其不足,如復(fù)雜性和層都有所增加,美工人員需要學(xué)習(xí)全新的Tag Lib。而且View層仍采用JSP,開發(fā)人員還是可以在其中寫邏輯代碼。由于JSP對(duì)XML的支持不佳,用戶想要獲得各種格式的文檔并非易事。
將Struts中的View層用XML/XSLT技術(shù)替換掉,這就是Model 2x模式。它極大程度地發(fā)揮了XSLT的優(yōu)勢(shì)。作為一種W3C的正式標(biāo)準(zhǔn),XSLT提供了一種把XML數(shù)據(jù)轉(zhuǎn)換成純文本、PDF、HTML/XHTML、WML、VoiceXML等任意XML格式的靈活、強(qiáng)大的工具[1]。XSLT是高度可定制和可擴(kuò)展的,并且已經(jīng)獲得廣泛的支持(已經(jīng)存在包括Xalan在內(nèi)的20多種XSLT處理器)。StrutsCX即基于MVC model 2x的一個(gè)極好實(shí)現(xiàn)。
1)StrutsCX工作原理。StrutsCX把Struts和XSLT的優(yōu)勢(shì)結(jié)合到一起,很好地實(shí)現(xiàn)Model 2x模式。其具體流程如圖2所示。比較圖1和圖2可得,StrutsCX在Struts的基礎(chǔ)上修改View層的內(nèi)容。它的核心是Struts CX Servlet類。StrutsCXServlet功能包括生成XML文檔,讀取struts-config.xml得到相應(yīng)的XSL文件,并通過XSLT輸出最終結(jié)果。
StrutsCX的配置也由XML文件實(shí)現(xiàn)。其中strutsconfig.xml是標(biāo)準(zhǔn)的Struts配置文件,功能和Struts中的相同,只是把其中指定View層的參數(shù)由原來(lái)的JSP文件名改為Struts CX Servlet。Strutscx-config.xml是StrutsCX專有的配置文件,它讓StrutsCX獲知到哪里去尋找StrutsCX資源屬性文件,例如語(yǔ)言、環(huán)境、XSL文件等配置。
圖2 StrutsCX的工作流程
2)StrutsCX的技術(shù)優(yōu)勢(shì)。在實(shí)際應(yīng)用中同基于Struts框架的信息發(fā)布平臺(tái)相比較,筆者得出StrutsCX的以下幾點(diǎn)優(yōu)勢(shì):①StrutsCX完全不采用JSP,而通過StrutsCX把XML格式的文件經(jīng)過XSLT轉(zhuǎn)換最后輸出,從而使整個(gè)Web應(yīng)用避免使用JSP和標(biāo)記庫(kù),省略大量的聲明,開發(fā)人員不用再學(xué)習(xí)Struts提供的不太標(biāo)準(zhǔn)的自定義標(biāo)簽庫(kù);②不采用JSP的同時(shí)也避免開發(fā)人員將邏輯代碼寫在JSP中,真正明晰地劃分業(yè)務(wù)邏輯層和表現(xiàn)層的界限;③StrutsCX充分發(fā)揮XSLT的優(yōu)勢(shì),利用XSLT可以方便地獲得各種輸出格式,如HTML、PDF和其他各種XML格式,而不再像JSP那樣以HTML為中心。StrutsCX采用i18n實(shí)現(xiàn)國(guó)際化,它允許以不同的語(yǔ)言和編碼方式保存、輸出內(nèi)容。
采用StrutsCX結(jié)構(gòu)編程,通過searchnews.jar調(diào)用xmlutil和infopublish軟件包中的方法從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)表Content中的數(shù)據(jù),并通過StrutsCX采用XSLT轉(zhuǎn)換成為HTML格式顯示出結(jié)果。
TestAction.java:用戶Action類,處理Request請(qǐng)求,調(diào)用相應(yīng)的EJB方法,將輸出結(jié)果表示為XML文檔形式。
test.xsl:XSL樣式文件。
searchnews.jar:session bean,用來(lái)讀取數(shù)據(jù)庫(kù)中Content數(shù)據(jù)表中的數(shù)據(jù)。
db.xml:定義系統(tǒng)使用的數(shù)據(jù)表結(jié)構(gòu)。數(shù)據(jù)表Content相應(yīng)的XML配置文件放在jboss目錄下。
xmlutil.jar:session bean,用來(lái)連接數(shù)據(jù)庫(kù),并將取出的數(shù)據(jù)封裝為XML文檔對(duì)象。
InfoPublish.jar:Java Bean,定義基本數(shù)據(jù)類型。
在struts-config.xml中設(shè)置forward的path參數(shù)為“/StrutsCXServlet/”,在strutscx-config.xml中設(shè)置輸出格式為HTML,則相應(yīng)的XSL樣式文件test.xsl的路徑為“/WEB-INF/xsl/html/test.xsl”。
StrutsCX提供的調(diào)試變量主要有debugxml和encoding。設(shè)置encoding變量為gb2312。 設(shè)置debugxml變量為true,則輸出XML格式的文檔(如圖3所示)。值得注意的是,此時(shí)除了用戶信息文件(圖中XML DATA部分),還會(huì)一起輸出由StrutsCX自己生產(chǎn)的XML文檔,包括RESSOURCEN PROPERTIES、ERROR PARAMETERS、REQUEST PARAMETERS和SESSION PARAMETERS。由于篇幅限制,這里沒有在圖中顯示。
debugxml的缺省值為false,此時(shí)輸出用戶指定格式的文檔,本例中設(shè)為HTML格式。最后輸出如圖4所示。
圖3 xml格式的輸出
圖4 HTML格式的輸出
本文給出基于StrutsCX框架的網(wǎng)絡(luò)信息發(fā)布的方法。實(shí)際應(yīng)用表明,采用該方法的信息發(fā)布平臺(tái)分層結(jié)構(gòu)清晰,輸出格式靈活,并且便于管理和二次開發(fā)。完善的信息發(fā)布平臺(tái)功能還包括對(duì)信息的查詢、修改、增加等,由于篇幅限制,這里未能具體討論。同StrutsCX類似的另一種框架為Struts+Cocoon,關(guān)于2種方法的優(yōu)缺點(diǎn)比較還有待深入研究。
[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