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

使用XSLT和Struts框架開發Web應用
內容:
1、StrutsCS簡介
2、工具準備
3、配置運行StrutsCS Demo
4、StrutsCS開發實例演示
5、中文問題
6、編譯執行
7、總結
參考資料
關於作者
在 XML 專區還有:
教學
工具與產品
所有的文章

肖菁([email protected])
軟件工程師
2004年2月

StrutsCS是一個開源項目,它是基於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的處理流程對比

image001.gif
圖1: Struts的處理流程圖

image002.gif
圖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是空字符串,如果你配置了上下文環境,請修改爲自己對應的上下文路徑。

他應該出現如下圖所示的內容:

image003.jpg

如果看到這個頁面,那麼說明你的StrutsCS Demo應用已經成功運行了,如果出現錯誤,請按照作者提供的步驟檢查一下。

4、StrutsCS開發實例演示

4.1 開發環境說明

1. Servlet容器-----------------------------Tomcat 5
2. 數據庫-----------------------------------MySQL
3. build工具-------------------------------Ant
4. StrutsCS項目的上下文路徑--------/

4.2 例子說明

爲了完整的演示如何使用StrutsCS項目來開發一個完整的Web應用,我們將使用一個簡單的例子,這個例子將完成一個圖書信息錄入、修改、刪除、列表顯示的全過程。圖書信息包括如下屬性:編號、書名、出版社、ISDN號、作者,其中的編號由Mysql自動生成。大家下載作者提供的mytrutscs.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>方法。詳細的代碼請大家參考下載的mystructscs.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容器的"/"目錄在硬盤上對應的真實目錄、服務器名等。詳細的信息請大家參考下載的mystructscs.war中的//WEB-INF//src//com//cappuccinonet//strutscx//sample01//presentation//action//BaseAction.java文件。

下面的代碼解釋和註釋都只針對各Action中的主要實現的主體部分,詳細的代碼實現請大家參考下載的mystructscs.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的子元素,他們之間的關係請大家查看下載的mystructscs.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實現,所以很簡單。主要演示瞭如何訪問資源文件中提供的信息,詳細的文件內容請大家參考下載的mystructscs.war中對應的//WEB-INF//xsl// books_create.xsl文件的內容。關於如何訪問文字資源請大家參考在xsl中如何訪問資源。

4.4.5.2 books_update.xsl

這個xsl要顯示用戶修改圖書信息的界面,裏面主要演示瞭如何訪問FormBean的內容,當然也演示瞭如何訪問資源文件中提供的內容。詳細的文件內容請大家參考下載的mystructscs.war中對應的//WEB-INF//xsl// books_update.xsl文件的內容。關於如何訪問FormBean的內容請大家參考在xsl中如何訪問FormBean。關於如何訪問文字資源請大家參考在xsl中如何訪問資源。

4.4.5.3 books_all.xsl

這個xsl主要顯示所有圖書信息的列表,裏面顯示瞭如何從傳入的ArrayList中循環的顯示ArrayList中的每一項。當然也演示瞭如何訪問資源文件中提供的內容。詳細的文件內容請大家參考下載的mystructscs.war中對應的//WEB-INF//xsl// books_all.xsl文件的內容。關於如何訪問ArrayList的內容請大家參考在xsl中如何訪問ArrayList。關於如何訪問文字資源請大家參考在xsl中如何訪問資源。

5、中文問題

StrutsCS中讀取中文資源時,存在中文問題,作者經過研究發現是因爲StrutsCS讀取資源內容時,直接將資源文件內容轉化爲Jdom的Document對象,而沒有使用他的sax構建器,作者修改了他的StrutsCXStandardDocumentBuilder。Java的相關代碼後解決了這個問題。

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

  1. 1. 如果你基於作者提供的mystructscs.war開發StrutsCS應用,那麼應該不會再有中文問題
  2. 2. 如果你從StrutsCS網站下載他的Demo後,基於該Demo開發中文應用,請用作者提供的strutscs.jar覆蓋//WEB-INF//lib// strutscx-0.9.5.jar來解決中文問題
  3. 3. 如果你從StrutsCS網站下載他的源文件,經過配置後開發,那麼請使用作者提供的mystructscs.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

實例代碼下載: mystructscs.war

關於作者

肖菁,目前是湖南省長沙鐵道學院科創計算機系統集成有限公司軟件中心軟件工程師,IBM developerworks/BEA dev2dev/SUN中國技術社區在線講座撰稿人,主要研究J2EE編程技術、Web Service技術以及他們在websphere、weblogic、apache平臺上的實現,擁有IBM 的 Developing With Websphere Studio證書。歡迎大家通過作者的個人主頁訪問作者更多的技術文章。您可以通過[email protected]或0731-6665772聯繫作者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章