使用XSLT和Struts框架开发Web应用

使用XSLT和Struts框架开发Web应用
内容:
1、StrutsCS简介
2、工具准备
3、配置运行StrutsCS Demo
4、StrutsCS开发实例演示
5、中文问题
6、编译执行
7、总结
参考资料
关于作者
在 XML 专区还有:
教学
工具与产品
所有的文章

肖菁(jing.xiao@chinacreator.com)
软件工程师
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的处理流程对比


图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自动生成。大家下载作者提供的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证书。欢迎大家通过作者的个人主页访问作者更多的技术文章。您可以通过jing.xiao@chinacreator.com或0731-6665772联系作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值