商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

XSLT一种用于XML文件的转换语言,作为web应用的一种表现层技术非常流行。如果你的应用本身需要处理XML文件,或者你的数据模型很容易转换成XML文件,XSLT就是一个不错的选择。下面介绍如何生成XML文档用作模型数据,以及如何在Spring应用中使用XSLT转换它们。

My First Words
这个Spring应用的例子在控制器中创建一组单词,并把它们加到数据模型的映射表中。这个映射表和我们XSLT视图的名字一起被返回。关于Spring中Controller的详细信息,参考第 12.3 节 “控制器” 。 XSLT视图会把这组单词生成一个简单XML文档用于转换。

Bean的定义
对于一个简单的Spring应用,配置是标准的。DispatcherServlet配置文件包含一个ViewResolver,URL映射和一个控制器bean..

<bean id="homeController"class="xslt.HomeController"/>
..它实现了我们单词的产生“逻辑”。

标准MVC控制器代码
控制器逻辑被封装在AbstractController的子类中,包含象下面这样的处理器方法。

protected ModelAndView handleRequestInternal( HttpServletRequest req, HttpServletResponse resp) throws Exception { Map map = new HashMap(); List wordList = new ArrayList(); wordList.add("hello"); wordList.add("world"); map.put("wordList", wordList); return new ModelAndView("home", map); }

 到目前为止,我们没有做任何XSLT特定的东西。模型数据的创建方式和其他Spring的 MVC应用相同。现在根据不同的应用配置,这组单词被作为请求属性交给JSP/JSTL处理,或者作为VelocityContext里的对象,交给Velocity处理。为了使XSLT能处理它们,它们必须得转换成某种XML文档。有一些软件包可以自动DOM化一个对象图,但在Spring中,你可以用任何方式把你的模型转换成DOM树。这样可以避免使XML转换决定你模型数据结构,这在使用工具管理DOM化过程的时候是很危险的。 

把模型数据转换成XML文档
为了从我们的单词列表或其他模型数据中创建DOM文档,我们继承org.springframework.web.servlet.view.xslt.AbstractXsltView。同时,我们必须实现抽象方法createDomNode()。传给它的第一个参数就是我们的数据模型的Map。下面是我们这个应用中HomePage类的源程序清单 - 它使用JDOM来创建XML文档,然后在转换成所需要的W3C节点,这仅仅是因为我发现JDOM(和Dom4J)的API比W3C的API简单。

package xslt; // imports omitted for brevity public class HomePage extends AbstractXsltView { protected Node createDomNode( Map model, String rootName, HttpServletRequest req, HttpServletResponse res ) throws Exception { org.jdom.Document doc = new org.jdom.Document(); Element root = new Element(rootName); doc.setRootElement(root); List words = (List) model.get("wordList"); for (Iterator it = words.iterator(); it.hasNext();) { String nextWord = (String) it.next(); Element e = new Element("word"); e.setText(nextWord); root.addContent(e); } // convert JDOM doc to a W3C Node and return return new DOMOutputter().output( doc ); } }

 添加样式表参数
你的视图子类可以定义一些name/value组成的参数,这些参数将被加到转换对象中。参数的名字必须符合你在XSLT模版中使用<xsl:param name="myParam">defaultValue</xsl:param>格式定义的参数名。为了指定这些参数,可以从AbstractXsltView中重载方法getParameters(),并返回包含name/value组合的Map。

格式化日期和货币
不象JSTL和Velocity,XSLT对和本地化相关的货币和日期格式化支持较弱。Spring为此提供了一个帮助类,让你在createDomNode()中使用,从而获得这些支持。详细请参考org.springframework.web.servlet.view.xslt.FormatHelper的javadoc。

定义视图属性
下面是单视图应用的属性文件views.properties(如果你使用基于XML的视图解析器,比如上面例子中的Velocity,它等价于XML定义),如我们的“My First Words”..

home.class=xslt.HomePage home.stylesheetLocation=/WEB-INF/xsl/home.xslt home.root=words

这儿,你可以看到视图是如何绑定在由属性“.class”定义的HomePage类上的,HomePage类处理数据模型的DOM化操作。属性“stylesheetLocation”指定了将XML文档转换成HTML文档时所需要的XSLT文件,而最后一个属性“.root”指定了XML文档根节点的名字。它被上面的HomePage类作为第二个参数传递给createDomNode方法。

文档转换
最后,我们定义了XSLT的代码来转换上面的XML文档。在views.properties文件中指定了这个XSLT文件home.xslt存放在war文件里的WEB-INF/xsl下。

<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text/html" omit-xml-declaration="yes"/> <xsl:template match="/"> <html> <head><title>Hello!</title></head> <body> <h1>My First Words</h1> <xsl:for-each select="wordList/word"> <xsl:value-of select="."/><br /> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>

总结
下面的WAR文件结构简单列了一些上面所提到的文件和它们在WAR文件中的位置。

ProjectRoot | +- WebContent | +- WEB-INF | +- classes | | | +- xslt | | | | | +- HomePageController.class | | +- HomePage.class | | | +- views.properties | +- lib | | | +- spring.jar | +- xsl | | | +- home.xslt | +- frontcontroller-servlet.xml

当然,你还需要保证XML解析器和XSLT引擎在classpath中可以被找到。JDK 1.4会缺省提供它们,并且大多数J2EE容器也会提供它们,但是这也是一些已知的可能引起错误的原因。

1 2 3 4 5 6
【内容导航】
第1页: 和JSP & JSTL一起使用Spring 第2页: Tiles的使用
第3页: Velocity 第4页: XSLT视图
第5页: 文档视图 (PDF/Excel) 第6页: 架构
©版权所有。未经许可,不得转载。
[责任编辑:JavaWorker]
[an error occurred while processing this directive]