使用XSLT和Struts框架開發Web應用
使用XSLT和Struts框架開發Web應用 |
|
肖菁(jing.xiao@chinacreator.com) StrutsCS是一個開放原始碼(Open Source)專案,它是以Struts為基礎的一個Web應用開發框架。StrutsCS專案使我們可以使用XML、XSLT、Xpath等技術和Struts框架開發Web應用,而不是採用Struts中使用的JSP技術。而且StrutsCS中可以經過簡單的配置開發工作後將輸出格式變為WML、PDF等,所以擴充性更好。本文中作者將給大家詳細的介紹和展示如何使用StrutsCS專案來開發Web應用。 為了將Web應用中的商業邏輯和表現形式分離,尤其是降低在JSP文件中的java程式碼,人們想了很多方法,包括在JSP中大量使用標籤庫、應用Struts框架等,今天給大家介紹一個新方法─使用StrutsCS專案─它大量採用XML、Xpath、XSL等技術和Struts框架,而不再使用JSP,同時將Struts中的FormBean、Session等需要顯示的內容對應成XML內容,在XSL(展示層)中透過XSLT、Xpath技術存取,從而保證了XSL(展示層)中不再需要任何Java程式碼。 1、StrutsCS簡介1.1 什麼是StrutsCS 簡單地說,StrutsCS就是使用XSLT而不是JSP作為展示層的Struts.他克服了Struts框架的侷限性,使我們利用XSL、XML、Xpath、XSLT等技術開發web應用,輸出Web內容,而且可以輕鬆的擴充到輸出WML、PDF、Ascii文件等。 1.2 StrutsCS和Struts的處理流程對比
上面兩個圖是StrutsCS網站示範的StrutsCS和Struts的處理流程圖。從這裡兩個圖中,我們可以很清晰的看到StrutsCS和Struts的關係、主要作用範圍︰很明顯的,他們兩者在MVC中的Model、Controller這兩部分是完全一致的,StrutsCS祇是在View的部分進行了改進,也就是說StrutsCS的主要作用範圍就是在內容顯示這部分對Struts進行了擴充,使我們可以使用XML、XSL、XSLT、Xpath等新技術實作系統的高生產率、可擴充性。 1.3 StrutsCS的主要特點
關於StrutsCS專案的詳細介紹、FAQ等訊息請大家到StrutsCS的網站http://it.cappuccinonet.com/strutscx/index.php去檢視。 2、工具準備2.1 StrutsCS下載 StrutsCS專案的編譯版本、原始程式碼、Demo都可以從http://sourceforge.net/project/showfiles.php?group_id=67148&package_id=65546&release_id=201686下載。 2.2 伺服器下載 作者使用了Apache的Tomcat 5伺服器作為Servlet儲存器來執行StrutsCS,請大家到http://jakarta.apache.org/site/binindex.cgi下載Tomcat5。 按照StrutsCS專案的安裝指南,Tomcat4也可以配置成功,不過作者配置後發現Tomcat4並不能完全支援StrutsCS,大家有興趣可以自己測試一下。 3、配置執行StrutsCS Demo3.1 將StrutsCS Demo配置到Tomcat上
註 這個作業將使StrutsCS專案成為Tomcat的預設web應用,如果你自己會使用Tomcat伺服器,而且不想覆寫預設Web應用,那麼請自己配置StrutsCS專案的內容路徑(context-path)。 3.2 使StrutsCS的範例執行起來 StrutsCS中的純文字資源訊息儲存、讀取支援國際化,StrutsCS應用執行的時候根據getLocale(request).getLanguage()的結果動態繫結資源文件,他是根據ISO 639的標準,中文對應的是zh,大家可以到http://ftp.ics.uci.edu/pub/ietf/http/related/iso639.txt尋找ISO 639的標準。它的Demo內建的支援包括對英國、韓國、德國等的支援,為了讓他支援中國內地執行,需要進行相應的修改。主要涉及的修改內容包括配置文件Strutscs-config.xml和相關的訊息儲存文件,詳細的操作步驟請參考後面的幾個章節。 3.2.1 Strutscs-config.xml文件的修改 Strutscs-config.xml文件位於WEB-INF目錄下,對它的修改主要是以下幾步︰
3.2.2 增加對應的資源文件 現在相應的配置做好了,我們應該增加對應的資源文件了,這裡作者祇是將/WEB-INF/xml/variables_en.xml拷貝了一份,改名為/WEB-INF/xml/variables_zh.xml。 3.2.3 其它文件 大家可以看到/WEB-INF/xml/還有幾個xml文件,其中的info_<lang>.xml(如info_en.xml)是範例中對應的xml資料庫的內容,intro_<lang>.xml(如intro_en.xml)是範例中StrutsCS介紹內容對應的資源文件,為了保證範例執行,也請將他們各拷貝一份(最好是info_en.xml、intro_en.xml),然後將<lang>修改為zh,也就是說/WEB-INF/xml/目錄下應該增加info_zh.xml、intro_zh.xml這兩個文件。 3.2.4 修改index.html文件 這可能是StrutsCS專案組的疏忽,它裡面將下一個頁面導向了/strutscx-demo/info.do,如果你配置的這個Web應用的內容路徑不是/strutscx-demo,請修改為自己對應的內容路徑,比如作者修改為/mystructscs/info.do,或者直接修改為info.do 3.3 測試一下 現在你可以啟動Tomcat5,然後然後開啟瀏覽器,輸入位址http://localhost:8080/<context-path>。其中的<context-path>實體配置的該Web應用的內容路徑,我們這裡使用預設的內容環境,所以context-path是空字串,如果你配置了內容環境,請修改為自己對應的內容路徑。 他應該出現如下圖所示的內容︰ 如果看到這個頁面,那麼說明你的StrutsCS Demo應用已經成功執行了,如果出現錯誤,請按照作者提供的步驟檢查一下 4、StrutsCS開發實體展示4.1 開發環境說明 1. Servlet儲存器-----------------------------Tomcat 5 4.2 範例說明 為了完整的展示如何使用StrutsCS專案來開發一個完整的Web應用,我們將使用一個簡單的範例,這個範例將完成一個圖書訊息新增、修改、刪除、列表的完整類別檔過程。圖書訊息包括如下屬性︰編號、書名、出版社、ISDN號、作者,其中的編號由Mysql自動產生。大家下載作者提供的mystrutscs.war後,在解壓縮後的目錄/WEB-INF/db/下可以找到建立資料表所需的DDL文件(mysql.ddl)。作者使用的資料庫聯接訊息如下︰
這些訊息都儲存在org.vivianj.sample.dao. BooksDAO類別檔中,請大家根據自己的實際情況進行修改。 4.3 相關配置內容 4.3.1 Struts-config.xml 這裡都是一些Action的定義,包括了forward,大家可以看到裡面最後的forward都是指向StrutsCXServlet,這是因為StrutsCS裡面內容顯示都是由Action類別指定要顯示的xsl文件和相關的formbean內容,然後由StrutsCXServlet這個Servlet顯示出來(這也就是為什麼在StrutsCS中可以方便的修改輸出格式的原因,因為我們只需要在這裡將輸出格式由XSL、XSL等修改為自己需要的格式)。
4.3.2 Strutscs-config.xml 在Strutscs-config.xml中設定需要顯示的xsl文件,這主要是為了管理方便,因為在Action設定要顯示的xsl文件的名稱時使用的books.create這樣的定義,而不是直接使用文件名稱,這樣當你的文件名稱發生變化時,你只需要修改配置文件,而不是修改程式原始程式碼。當然你完全可以在Action中直接設定這些文件名稱。下面定義的這些元素都是Strutscs-config.xml文件中strutscx-definitions元素的子元素。你可以在作者提供的mystrutscs.war中的Strutscs-config.xml文件中找到對應的內容︰
這些設定完成後,我們就開始開發Action和FormBean的程式碼了。 4.4 程式碼開發部分 4.4.1 FormBean程式碼 FormBean主要是對需要傳遞的Form資料進行作業,所以都是些get<PropertyName>、set<PropertyName>方法。詳細的程式碼請大家參考下載的mystrutscs.war中的\\WEB-INF\\src\\org\\vivianj\\sample\\form\\ BookForm.java。 註 該FormBean中,有setAction、getAction方法,他實際和我們的商業沒有關係,祇是作者使用一個Action(/bookPersistence)來完成圖書資料的新增、修改、刪除、查詢等工作,所以需要帶入一個目前Action的屬性值。 4.4.2 Action程式碼 StrutsCS中所有的存取都是透過對應為*.do來實作的,根據他們是否和FormBean打交道,這些被對應的Action程式碼分為兩種不同的情況︰ 第一種情況︰不和FormBean打交道
第二種情況︰需要和FormBean打交道
下面的程式碼解釋和註釋都只針對各Action中的主要實作的主體部分,詳細的程式碼實作請大家參考下載的mystrutscs.war中對應的。Java文件。 4.4.2.1 BookAddAction.java 這個類別實作了Action的execute方法,因為這裡祇是要顯示一個界面,不需要和formbean打交道,所以我們只需要設定一個xsl文件的名字就可以了,主要程式碼和註釋如下︰
4.4.2.2 BookEditAction.java 需要顯示圖書訊息修改界面時,我們一般是根據提供的圖書編號,取出該圖書對應的訊息,然後顯示在form中,由使用者進行修改。所以BookEditAction類別實作了Action的execute方法,這個方法裡面首先是將輸入的圖書編號轉化為一個對應的FormBean(他祇有圖書編號訊息),然後根據這個FormBean得到一個完整的FormBean(他帶有完整的圖書訊息,包括編號、書名等),將這個完整的FormBean放到request的屬性中,供要顯示的xsl文件呼叫,最後設定需要顯示的xsl文件名稱。主要程式碼和註釋如下︰
4.4.2.3 BookDeleteAction.java 他用於設定顯示圖書刪除界面,和顯示圖書修改界面的處理流程是一樣的,祇是設定的要顯示的xsl文件由'books.update'改為'books.delete'請大家參考下載文件中對應的文件內容,這裡不再解釋。 4.4.2.4 BookListAction.java 這個Action類別用於將要顯示的所有圖書的訊息用ArrayList物件放入request中,Strutscs將這個ArrayList對應成XML資料,我們將使用xslt、xpath存取他,而不是像jsp中使用java程式碼存取它,同時將下一個要使用的xsl文件放入request中,主體部分的程式碼和解釋如下︰
好了,程式碼部分的編製現在已經完成,下面將給大家解釋如何在xsl中讀取這些傳入的formBean和ArrayList的內容。 4.4.3 增加資源訊息 在StrutsCS中,所有的文字資源都儲存在xml文件中,也就是WEB-INF\\xml\\variables_xx.xml中,其中的xx就是各國對應的代號,在中國,這個代號是zh,所以我們應該將我們自己的文字資源儲存到WEB-INF\\xml\\variables_zh.xml中。 作者在WEB-INF\\xml\\variables_zh。Xml中增加了如下內容,它是我們的圖書管理應用中可能用到的文字資源(主要是為了方便維護和實作國際化)︰
其中books是resourcesproperties/page/info的子元素,他們之間的關係請大家檢視下載的mystrutscs.war中對應的文件的內容。 4.4.4 如何存取資源、FormBeam、ArrayList、Session中的內容 4.4.4.1 在xsl中如何存取資源 我們在xsl中將透過xslt和xpath存取這些資源訊息,存取方法有兩個︰ 1.絕對位址存取 所謂絕對位址存取就是透過輸入該元素在資源Element中的絕對位址來存取該元素的內容,他都是以"/"開頭的。 比如我們要存取我們加入的title的內容,他的絕對位址就是"/root/resourcesproperties/page/info/books/title"。 註 這個位址中的/root是xsl中存取靜態資源、動態內容的一個基準點,其它可存取的所有內容多是他的子元素,如資源、formbean等,後面的章節中也會用到。 2. 相對位址存取 相對位址存取需要透過xsl:for-each先設定一個位址基準,然後xsl:for-each中的存取都將是相對這個位址基來存取的。他都不是以"/"開頭的。 比如作者提供的bookadd.xsl中︰
那麼這中間的/root/resourcesproperties/page/info/books就是存取的基準,而bookinfo/isdn就是一種相對存取,他實際存取的是/root/resourcesproperties/page/info/books/bookinfo/isdn元素的內容。 4.4.4.2 在xsl中如何存取FormBean 我們在xsl中將透過xslt和xpath存取FormBean的訊息,大家可以在books_update.xsl文件中看到這樣的內容︰
xsl:variable 表示我們建立一個xsl的變數,name是這個變數的名稱,/root/actionform/BookForm/bookId就表示這個是從一個formBean中取值的,其中的各段字串代表的含義如下︰
註以上字串請注意大小寫。 4.4.4.3 在xsl中如何存取Session 我們在xsl中將透過xslt和xpath存取Session的訊息,大家可以在books_update.xsl文件中看到這樣的內容︰
xsl:variable 表示我們建立一個xsl的變數,name是這個變數的名稱,//session/domain就表示這個是從一個session中取值的,其中的各段字串代表的含義如下︰
4.4.4.4 在xsl中如何循環存取ArrayList 為了循環存取ArrayList中的每一項目,我們需要使用for-each,在books_all。Xsl文件中,大家可以看到這樣的程式碼︰
其中的<xsl:for-each select="/root/data/BookVO">就表示循環的取得傳入的ArrayList物件的每一項目,/root/data/BookVO中各字串的含義如下︰
4.4.5 XSL(展示層) 4.4.5.1 Books_create.xsl 在這個xsl中,主要是顯示一個使用者輸入圖書訊息的表單,表單的內容用html實作,所以很簡單。主要展示了如何存取資源文件中提供的訊息,詳細的文件內容請大家參考下載的mystrutscs.war中對應的\\WEB-INF\\xsl\\ books_create.xsl文件的內容。關於如何存取文字資源請大家參考在xsl中如何存取資源。 4.4.5.2 books_update.xsl 這個xsl要顯示使用者修改圖書訊息的界面,裡面主要展示了如何存取FormBean的內容,當然也展示了如何存取資源文件中提供的內容。詳細的文件內容請大家參考下載的mystrutscs.war中對應的\\WEB-INF\\xsl\\ books_update.xsl文件的內容。關於如何存取FormBean的內容請大家參考在xsl中如何存取FormBean。關於如何存取文字資源請大家參考在xsl中如何存取資源。 4.4.5.3 books_all.xsl 這個xsl主要顯示所有圖書訊息的清單,裡面顯示了如何從傳入的ArrayList中循環的顯示ArrayList中的每一項目。當然也展示了如何存取資源文件中提供的內容。詳細的文件內容請大家參考下載的mystrutscs.war中對應的\\WEB-INF\\xsl\\ books_all.xsl文件的內容。關於如何存取ArrayList的內容請大家參考在xsl中如何存取ArrayList。關於如何存取文字資源請大家參考在xsl中如何存取資源。 5、中文問題StrutsCS中讀取中文資源時,存在中文問題,作者經過研究發現是因為StrutsCS讀取資源內容時,直接將資源文件內容轉化為Jdom的Document物件,而沒有使用他的sax建置器,作者修改了他的StrutsCXStandardDocumentBuilder。Java的相關程式碼後解決了這個問題。 下面的三種情況請使用不同的方法解決中文問題︰
6、編譯執行6.1.1 編譯 作者的所有類別檔都放在下載的mystrutscs.war中WEB-INF\\src目錄下,如果你自己開發了程式碼,也可以放在該目錄下。 作者提供的mystrutscs.war中WEB-INF目錄下提供了同時setenv。Bat和build.xml,你只需要修改setenv.bat中的java_home和ant_home參數,build.xml中需要修改的內容是 6.1.2 執行 現在,請重新啟動Tomcat,然後在瀏覽器輸入http://localhost:8080/books_new.do,你應該可以看到輸入新圖書訊息的界面。你可以透過http://localhost:8080/booklist.do看到所有儲存圖書訊息的清單。 註 如果你自己設定了該Web應用的內容路徑,請加上對應的內容路徑。 7、總結StrutsCS專案是一個開放原始碼專案,他以Struts框架為基礎,但是對Struts的展示層部分進行了擴充,使我們可以使用XSL、XML、Xpath、XSLT等技術作為展示層、而且以Struts框架為基礎開發Web應用。重要的是StrutsCS的擴充功能將Session、FormBean、ArrayList等物件對應為XML資料,然後透過Xpath、XSLT來存取,這樣展示層中不再需要java程式碼的參與,第一次實作了展示層中HTML和java程式碼的分離。 作者在本文中詳細的介紹了如何配置StrutsCS的執行環境、配置StrutsCS提供的Demo案例使他執行,講解和展示了如何建立StrutsCS應用、配置StrutsCS、透過XSL存取FormBean/Session/資源/ArrayList等內容,希望能夠幫助大家迅速的掌握StrutsCS中的先進特性,幫助更好的利用Mystruts協助我們的應用開發。 StrutsCS中對多種輸出格式的支援,作者正在研究中,如果偶有心得,一定會和大家共享,也希望大家透過電子信件和作者交流各位的應用、研究心得和體會。 參考資料
實體程式碼下載︰ mystrutscs.war
|