使用XSLT和Struts框架開發Web應用

使用XSLT和Struts框架開發Web應用


內文:
1、StrutsCS簡介
2、工具準備
3、配置執行StrutsCS Demo
4、StrutsCS開發實體展示
5、中文問題
6、編譯執行
7、總結
參考資料
關於作者

肖菁(jing.xiao@chinacreator.com)
軟體工程師
2004年2月

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的處理流程對比


圖1︰ Struts的處理流程圖


圖2︰StrutsCS的處理流程圖

上面兩個圖是StrutsCS網站示範的StrutsCS和Struts的處理流程圖。從這裡兩個圖中,我們可以很清晰的看到StrutsCS和Struts的關係、主要作用範圍︰很明顯的,他們兩者在MVC中的Model、Controller這兩部分是完全一致的,StrutsCS祇是在View的部分進行了改進,也就是說StrutsCS的主要作用範圍就是在內容顯示這部分對Struts進行了擴充,使我們可以使用XML、XSL、XSLT、Xpath等新技術實作系統的高生產率、可擴充性。

1.3 StrutsCS的主要特點

  • 可以在任何Servlet儲存器中執行的輕量級Web開發框架
  • 對國際化語言的支援。包括IS0-8859-1、中文等
  • 使用100%的XML、XSLT、Xpath等置換Struts中的JSP和純文字訊息儲存
  • 內容輸出100%支援XML、XHTML、XSL-FO、WML或者其它你想要的輸出格式
  • 簡單的錯誤驗證機制
  • 預設使用JDOM。
  • 內建對FOP的支援,支援PDF、SVG、ASCII等的產生
  • 含有了Struts驗證
  • 支援多種轉換
  • 支援客戶端的XSLT

關於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 Demo

3.1 將StrutsCS Demo配置到Tomcat上

  1. 首先安裝Tomcat到c:/Tomcat5下(後面將使用%tomcat_home%參照這個目錄)
  2. 將下載的StrutsCS Demo解壓縮,然後將所有的文件拷貝到%tomcat_home%\\webapps\\ROOT下面。

註 這個作業將使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目錄下,對它的修改主要是以下幾步︰

  1. 增加對中國內地的支援

    找到Strutscs-config.xml文件中的lang元素,大家可以看到,它預設有三項en de ko,每項中間用空格隔開,分別表示支援英國、德國和韓國,現在我們要讓它支援在中國內地執行,需要給他增加一項zh(這是getLocale(request).getLanguage()在中國內地執行得到的值,也是ISO 639中中文語言對應的兩位程式碼),修改後lang元素看起來應該是這個樣子︰<lang>en de ko zh</lang>

  2. 增加對應的資源文件設定

    為了執行時能夠保證正確的存取到資源文件(類似於Struts中的AppicationProperties,也就是儲存應用中出現的靜態文字內容的文件),我們需要增加新的設定。請大家找到Strutscs-config.xml文件中的resources-properties元素,它看起來是這樣的︰

    
    
    <resources-properties>
        <!-- you can switch the loading of these files ON|OFF.
    		If ON, the will get loaded to the ServletContext and serialized
    		- depending on the given Locale - into the XML-Output-Document
    		-->
        <on>ON</on>
        <!-- provide a file for each <lang> -->
        <en>/WEB-INF/xml/variables_en.xml</en>
        <de>/WEB-INF/xml/variables_de.xml</de>
        <ko>/WEB-INF/xml/variables_ko.xml</ko>
      </resources-properties>
    

    它裡面有一段註釋"provide a file for each <lang>",在他之後我們可以看到resources-properties元素預設有三個子元素,他們是en de ko,他們的內容都是一個文件名稱,每個文件名稱就是對應的地區執行時使用的資源文件,很明顯,我們應該增加一個zh的子元素。他對應的文件就是/WEB-INF/xml/variables_zh.xml,修改後resources-properties元素的內容如下︰

    
    
    <resources-properties>
        <!-- you can switch the loading of these files ON|OFF.
    		If ON, the will get loaded to the ServletContext and serialized
    		- depending on the given Locale - into the XML-Output-Document
    		-->
        <on>ON</on>
        <!-- provide a file for each <lang> -->
        <en>/WEB-INF/xml/variables_en.xml</en>
        <de>/WEB-INF/xml/variables_de.xml</de>
        <ko>/WEB-INF/xml/variables_ko.xml</ko>
        <zh>/WEB-INF/xml/variables_zh.xml</zh>
      </resources-properties>
    

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
2. 資料庫-----------------------------------MySQL
3. build工具-------------------------------Ant
4. StrutsCS專案的內容路徑--------/

4.2 範例說明

為了完整的展示如何使用StrutsCS專案來開發一個完整的Web應用,我們將使用一個簡單的範例,這個範例將完成一個圖書訊息新增、修改、刪除、列表的完整類別檔過程。圖書訊息包括如下屬性︰編號、書名、出版社、ISDN號、作者,其中的編號由Mysql自動產生。大家下載作者提供的mystrutscs.war後,在解壓縮後的目錄/WEB-INF/db/下可以找到建立資料表所需的DDL文件(mysql.ddl)。作者使用的資料庫聯接訊息如下︰



//資料庫驅動
private String dbDriver = "org.gjt.mm.mysql.Driver";
//資料庫連線字串
private String dbUrl = "jdbc:mysql://127.0.0.1:3306/strutscs";
//存取資料庫使用者
private String user = "root";
//存取資料庫密碼
private String pwd = "ioffice";

這些訊息都儲存在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等修改為自己需要的格式)。



<!-- /books_new 這個Action是為了顯示一個新增加圖書訊息的輸入界面 -->
<action
      path="/books_new"
      type="org.vivianj.sample.action.BookCreateAction"
      unknown="false"
      validate="true"
    >
      <forward
        name="success"
        path="/StrutsCXServlet"
        redirect="false"
      />
    </action>
<!-- / updateBook 這個Action是為了顯示一個修改圖書訊息的界面,他需要formbean支援,formbean的名字是bookForm -->
    <action
      path="/updateBook"
      type="org.vivianj.sample.action.BookUpdateAction"
      name="bookForm"
      scope="request"
      unknown="false"
      validate="true"
    >
      <forward
        name="success"
        path="/StrutsCXServlet"
        redirect="false"
      />
</action>
<!-- / deleteBook這個Action是為了在使用者刪除一筆圖書記錄前給使用者顯示該圖書訊息詳細內容,他需要formbean支援,formbean的名字是bookForm -->
    <action
      path="/deleteBook"
      type="org.vivianj.sample.action.BookDeleteAction"
      name="bookForm"
      scope="request"
      unknown="false"
      validate="true"
    >
      <forward
        name="success"
        path="/StrutsCXServlet"
        redirect="false"
      />
    </action>
<!-- / bookPersistence這個Action是為了在使用者處理使用者的操作請求如增加、修改、刪除等,
		  他需要formbean支援,formbean的名字是bookForm -->
    <action
      path="/bookPersistence"
      type="org.vivianj.sample.action.BookPersistenceAction"
      name="bookForm"
      scope="request"
      unknown="false"
      validate="true"
    >
      <forward
        name="success"
        path="/booklist.do"
        redirect="false"
      />
    </action>
<!-- / booklist這個Action是為了在顯示目前所有已經存在的圖書訊息,他不需要formbean支援,
          如果你需要實作查詢功能,那麼這裡仍然需要formbean支援-->
 <action
      path="/booklist"
      type="org.vivianj.sample.action.BookListAction"
      unknown="false"
      validate="true"
    >
      <forward
        name="success"
        path="/StrutsCXServlet"
        redirect="false"
      />
    </action>

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文件中找到對應的內容︰




<!-定義顯示新增加圖書訊息界面需要用到的xsl文件和他的屬性字串-->
<definition name="books.create">
      <put>/WEB-INF/xsl/books_create.xsl</put>
</definition>
<!-定義顯示所有圖書訊息界面需要用到的xsl文件和他的屬性字串-->
    <definition name="books.all">
      <put>/WEB-INF/xsl/books_all.xsl</put>
</definition>
<!-定義顯示圖書訊息修改界面需要用到的xsl文件和他的屬性字串-->
    <definition name="books.update">
      <put>/WEB-INF/xsl/books_update.xsl</put>
</definition>
<!-定義顯示刪除圖書訊息界面需要用到的xsl文件和他的屬性字串-->
    <definition name="books.delete">
      <put>/WEB-INF/xsl/books_delete.xsl</put>
</definition>

這些設定完成後,我們就開始開發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打交道

這種情況下,在Action程式碼中只需要設定下一個要顯示的XSL文件的名字就可以了。下面的BookAddAction.java屬於這一種

第二種情況︰需要和FormBean打交道

這種情況下,在Action程式碼中需要和FormBean進行訊息交互。下面的BookEditAction.java、BookMultiInfo.java屬於這一種。

下面的所有類別都繼承了BaseAction,他提供了executeAtStart方法,這個方法主要是將一些共有的資料尤其是透過瀏覽器獲得的東西放到request中去,如︰本web應用的名稱,本Servlet儲存器的"/"目錄在硬碟上對應的真實目錄、伺服器名等。詳細的訊息請大家參考下載的mystrutscs.war中的\\WEB-INF\\src\\com\\cappuccinonet\\strutscx\\sample01\\presentation\\action\\BaseAction.java文件。

下面的程式碼解釋和註釋都只針對各Action中的主要實作的主體部分,詳細的程式碼實作請大家參考下載的mystrutscs.war中對應的。Java文件。

4.4.2.1 BookAddAction.java

這個類別實作了Action的execute方法,因為這裡祇是要顯示一個界面,不需要和formbean打交道,所以我們只需要設定一個xsl文件的名字就可以了,主要程式碼和註釋如下︰


//將一些固定的訊息寫入request
	executeAtStart(mapping, form, request, response);

	// 指向strutscx-definitions中對應的定義,這裡是books.create
	//最後顯示的時候會根據strutscx-definitions中的定義轉化為對應的xsl文件,如我們定義的/WEB-INF/xsl/books_create.xsl

	String xslFile = "books.create";

	//	將文件名稱作為屬性設定到request中
	request.setAttribute(StrutsCXConstants.XSL_KEY, xslFile);

	//導向到struts.config.xml中指定的forward
	String forward = Constants.FORWARD_SUCCESS;

	return (mapping.findForward(forward));

4.4.2.2 BookEditAction.java

需要顯示圖書訊息修改界面時,我們一般是根據提供的圖書編號,取出該圖書對應的訊息,然後顯示在form中,由使用者進行修改。所以BookEditAction類別實作了Action的execute方法,這個方法裡面首先是將輸入的圖書編號轉化為一個對應的FormBean(他祇有圖書編號訊息),然後根據這個FormBean得到一個完整的FormBean(他帶有完整的圖書訊息,包括編號、書名等),將這個完整的FormBean放到request的屬性中,供要顯示的xsl文件呼叫,最後設定需要顯示的xsl文件名稱。主要程式碼和註釋如下︰


//將一些固定的訊息寫入request
		executeAtStart(mapping, form, request, response);

		//將傳入的form資料轉化為FormBean
		BookForm bookForm = (BookForm) form;

		//根據轉化後的FormBean訊息(這裡主要是圖書的ID號)
		//在資料庫中尋找到和該FormBean對應的訊息,構成新的FormBean物件
		bookForm = new BooksDAO().findByPrimaryKey(Integer.parseInt(bookForm.getBookId()));
		
		/**將FormBean作為屬性設定到request中
		*設定中的'bookForm'必須和Struts.config.xml中定義的form名稱保持一致
		* 如我們關於/updateBook是這樣定義的:
 <action
				path="/updateBook"
				type="org.vivianj.sample.action.BookUpdateAction"
			    name="bookForm"
		        scope="request"
			    unknown="false"
			    validate="true"
		      >
		* 所以我們這裡必須使用'bookForm'(也就是定義中name對應的屬性值)作為request的屬性名稱
		*/
		request.setAttribute("bookForm",bookForm);
		
		//指向strutscx-definitions中對應的xsl文件屬性字串,這裡是books.update
		//最後顯示的時候會根據strutscx-definitions中的定義轉化為對應的xsl文件,如我們定義的/WEB-INF/xsl/books_update.xsl
		String xslFile = "books.update";

		//將文件名稱作為屬性設定到request中
		request.setAttribute(StrutsCXConstants.XSL_KEY, xslFile);
		//導向到struts.config.xml中指定的forward
		String forward = Constants.FORWARD_SUCCESS;

		return (mapping.findForward(forward));

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中,主體部分的程式碼和解釋如下︰



//將一些固定的訊息寫入request
		executeAtStart(mapping, form, request, response);

		//指向strutscx-definitions中對應的xsl文件屬性字串,這裡是books.all
		//最後顯示的時候會根據strutscx-definitions中的定義轉化為對應的xsl文件,如我們定義的/WEB-INF/xsl/books_all.xsl
		
		String xslFile = "books.all";

		//將文件名稱作為屬性設定到request中
		request.setAttribute(StrutsCXConstants.XSL_KEY, xslFile);

		//建立一個含有所有圖書訊息的ArrayList
		//在顯示頁面中將根據這個ArrayList的內容讀取相關資料
		ArrayList bookList = new BooksDAO().getBooksByName("");

		//將該ArrayList物件放入request中
		request.setAttribute(StrutsCXConstants.XML_KEY, bookList);

		//導向到struts.config.xml中指定的forward
		String forward = Constants.FORWARD_SUCCESS;

		return (mapping.findForward(forward));

好了,程式碼部分的編製現在已經完成,下面將給大家解釋如何在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>
	   <title>圖書管理系統--以StrutsCS專案為基礎</title>
	   <bookinfo>
		<id>編號</id>
		<name>書名</name>
		<publisher>出版社</publisher>
		<isdn>ISDN號</isdn>
		<writer>作者</writer>
	   </bookinfo>
	   <add_button_label>增加</add_button_label>
	   <edit_button_label>修改</edit_button_label>
	   <del_button_label>刪除</del_button_label>
</books>

其中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中︰


<xsl:for-each select="/root/resourcesproperties/page/info/books">
	<xsl:value-of select="bookinfo/isdn"/>
</xsl:for-each>

那麼這中間的/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 name="bookId" select="/root/actionform/BookForm/bookId" />

xsl:variable 表示我們建立一個xsl的變數,name是這個變數的名稱,/root/actionform/BookForm/bookId就表示這個是從一個formBean中取值的,其中的各段字串代表的含義如下︰

root 請參考在xsl中如何存取資源中關於/root的描述
actionform 表示我們是從formbean中取得資料
BookForm 其中的BookForm表示傳入的formBean對應的Bean類別的名稱,使用時請修改為對應的內容。
如我們傳入的bookForm是BookForm類別的一個實體,那麼這裡就是BookForm,如果它是BookFormBean類別的實體,這裡就應該是BookFormBean。
BookId 表示我們取得formBean中對應的bookId的屬性,使用時請修改為對應的內容。

註以上字串請注意大小寫。

4.4.4.3 在xsl中如何存取Session

我們在xsl中將透過xslt和xpath存取Session的訊息,大家可以在books_update.xsl文件中看到這樣的內容︰


<xsl:variable name="project" select="//session/domain" />

xsl:variable 表示我們建立一個xsl的變數,name是這個變數的名稱,//session/domain就表示這個是從一個session中取值的,其中的各段字串代表的含義如下︰

session 表示從session中取得值
domain 表示我們取得session中domain屬性的值,使用時請修改為對應的內容

4.4.4.4 在xsl中如何循環存取ArrayList

為了循環存取ArrayList中的每一項目,我們需要使用for-each,在books_all。Xsl文件中,大家可以看到這樣的程式碼︰


<xsl:for-each select="/root/data/BookVO">
<xsl:value-of select="bookId"/>
	</xsl:for-each>

其中的<xsl:for-each select="/root/data/BookVO">就表示循環的取得傳入的ArrayList物件的每一項目,/root/data/BookVO中各字串的含義如下︰

root 請參考在xsl中如何存取資源中關於/root的描述
data 表示這是從傳入的資料中取值
BookVO 這是ArrayList中的物件的類別名稱,使用時請修改為對應的內容

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的相關程式碼後解決了這個問題。

下面的三種情況請使用不同的方法解決中文問題︰

  1. 1. 如果你以作者提供的mystrutscs.war為基礎開發StrutsCS應用,那麼應該不會再有中文問題
  2. 2. 如果你從StrutsCS網站下載他的Demo後,以該Demo開發中文應用為基礎,請用作者提供的strutscs.jar覆寫\\WEB-INF\\lib\\ strutscx-0.9.5.jar來解決中文問題
  3. 3. 如果你從StrutsCS網站下載他的原始檔案,經過配置後開發,那麼請使用作者提供的mystrutscs.war中\\WEB-INF\\src\\com\\cappuccinonet\\strutscx\\xslt\\StrutsCXStandardDocumentBuilder。Java覆寫StrutsCS原始檔案中對應的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中需要修改的內容是元素,這裡主要是提供一個支援servlet的jar文件(如︰weblogic.jar等)。然後在dos界面下執行ant就可以編譯了。

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中對多種輸出格式的支援,作者正在研究中,如果偶有心得,一定會和大家共享,也希望大家透過電子信件和作者交流各位的應用、研究心得和體會。

參考資料

  1. Struts專案線上文件 http://jakarta.apache.org/struts/index.html
  2. StrutsCS專案線上文件 http://it.cappuccinonet.com/strutscx/overview.php?target=overview
  3. Tomcat5線上幫助文件 http://jakarta.apache.org/tomcat/tomcat-5.0-doc/index.html
  4. Ant 線上幫助文件 http://ant.apache.org/manual/index.html

實體程式碼下載︰ mystrutscs.war

關於作者

肖菁,目前是湖南省長沙鐵道學院科創電腦系統整合有限公司軟體中心軟體工程師,IBM developerworks/BEA dev2dev/SUN中國技術社區線上講座撰稿人,主要研究J2EE程式化技術、Web Service技術以及他們在websphere、weblogic、apache平臺上的實作,擁有IBM 的 Developing With Websphere Studio證書。歡迎大家透過作者的個人首頁存取作者更多的技術文章。您可以透過jing.xiao@chinacreator.com或0731-6665772連絡作者。

posted on 2004-09-15 21:53  笨笨  阅读(908)  评论(0编辑  收藏  举报

导航