从二维到三维
五、通过XSLT实现视图层
我们已经使用FreeMarker实现了视图层,但这并不唯一的选择,我们还可以有其他的实现方式,如我们可以使用XSLT来达到同样的效果。在开始这一节之前,我们必须将XSLT引擎Jaxen放到classpath中。在这个使用XSLT的例子中,我们只需要加一个新的XMLOPERATION节点,它将使用和前面的介绍相同的数据,所不同的是在这里将使用XSLT来代替FreeMarker处理XML。如果我们想让两种方法并存的话,可以加入另一个OPERATIONSET块。我们的WebLEAF配置文件如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE WADSET SYSTEM "http://www.uib.es/leaf/LEAFwad.dtd">
<WADSET>
<WAD
NAME="Test"
INIT_MODE="INITS_ON_START_UP"
XML_ALLOW_SHOW="TRUE"
XSLT_NO_CACHE="TRUE"
>
<OPERATIONSET>
<SUFFIX VALUE="fm"/>
<XMLOPERATION
NAME="showItems"
DESCRIPTION="Shows all the items and the selected one"
CLASSNAME="org.leaf.XMLOperation"
FM_TEMPLATE="item.ftl"
>
<SOURCES
GLOBAL_TAG="XML_APP"
>
<SOURCE XML_SOURCE="xml/Labels.xml"/>
<SOURCE XML_SOURCE="script://scr/Item.groovy/show?w_"/>
</SOURCES>
</XMLOPERATION>
</OPERATIONSET>
<OPERATIONSET>
<SUFFIX VALUE="xsl"/>
<XMLOPERATION
NAME="showItems"
DESCRIPTION="Shows all the items and the selected one"
CLASSNAME="org.leaf.XMLOperation"
XSLT_SOURCE="xsl/Item.xsl"
>
<SOURCES
GLOBAL_TAG="XML_APP"
>
<SOURCE XML_SOURCE="xml/Labels.xml"/>
<SOURCE XML_SOURCE="script://scr/Item.groovy/show?w_"/>
</SOURCES>
</XMLOPERATION>
</OPERATIONSET>
</WAD>
</WADSET>
为了处理这些新请求,我们需要再次编辑web.xml配置文件,在WebLEAF控制servlet中加入一个以".xls"的请求后缀。也就是在下面再加入一个<servlet-mapping/>标签,web.xml的内容如下:
最后,我们通过在Test\WEB-INF\xsl中建立一个item.xsl,这是XSLT的实现,它的内容如下:<?xml version="1.0"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app>
<!--
Autoconfiguration servlet
-->
<servlet>
<servlet-name>AutoConfigurer</servlet-name>
<servlet-class>org.leaf.util.AutoConfigurer</servlet-class>
<load-on-startup>1</load-on-startup>
<init-param>
<param-name>FILE_NAME.1</param-name>
<param-value>WEB-INF/classes/webapp.properties</param-value>
</init-param>
<init-param>
<param-name>NODES_NAME.1</param-name>
<param-value>db.location</param-value>
</init-param>
<init-param>
<param-name>PATTERN.1</param-name>
<param-value>(.*)/WEB-INF/(.*)</param-value>
</init-param>
<init-param>
<param-name>FORMAT.1</param-name>
<param-value>{0}WEB-INF/{1}</param-value>
</init-param>
![]()
<servlet>
<servlet-name>WebLEAFController</servlet-name>
<servlet-class>org.leaf.LEAFManager</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- End controller servlet -->
<servlet-mapping>
<servlet-name>WebLEAFController</servlet-name>
<url-pattern>*.fm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>WebLEAFController</servlet-name>
<url-pattern>*.xsl</url-pattern>
</servlet-mapping>
</web-app>
现在我们可以再次启动Servlet容器,并访问http://localhost:8080/test/showItems.xsl(注意现在的后缀是".xsl",而不是".fm")。我们看到的结果和前面的完全一样,只是实现的方法不同而已。<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"
indent="yes"
media-type="text/html"
encoding="iso-8859-1"
/>
<xsl:variable name="labels" select="/XML_APP/LABELS" />
<xsl:template match="/">
<html>
<head>
<META HTTP-EQUIV="Expires" CONTENT="now"/>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache"/>
<META HTTP-EQUIV="Cache-Control" CONTENT="private"/>
<title><xsl:call-template name="TITLE"/>(XSLT)</title>
</head>
<body>
<xsl:apply-templates/>
<a href="./">Back to index</a>
</body>
</html>
</xsl:template>
<xsl:template name="TITLE">
<xsl:value-of select="$labels/@Title"/>
<xsl:apply-templates mode="SUB_TITLE"/>
</xsl:template>
<xsl:template match="ITEM_QUERY[@Type='All']" mode="SUB_TITLE">
- <xsl:value-of select="$labels/ITEM/@Title"/>
</xsl:template>
<xsl:template match="ITEM_QUERY[@Type='All']">
<xsl:variable name="theItem"
select="/XML_APP/ITEM_QUERY[@Type='Selected']/ITEM"
/>
<fieldset>
<legend>
<xsl:value-of select="$labels/ITEM/@FieldSetLegend"/>
</legend>
<form id="itemForm" name="itemForm" action="">
<select id="w_p_ite_code"
name="w_p_ite_code"
onchange="itemForm.submit();"
>
<option value="">
<xsl:value-of select="$labels/ITEM/@SelectDefault"/>
</option>
<xsl:for-each select="ITEM">
<option value="{@Code}">
<xsl:if test="$theItem/@Code = @Code">
<xsl:attribute name="selected">
selected
</xsl:attribute>
</xsl:if>
<xsl:value-of select="@Name"/>
</option>
</xsl:for-each>
</select>
</form>
<xsl:if test="$theItem">
<b><xsl:value-of select="$labels/ITEM/@Name"/></b>:
<xsl:value-of select="$theItem/@Name"/>
<br />
<b><xsl:value-of select="$labels/ITEM/@Description"/></b>:
<xsl:value-of select="$theItem/@Description"/>
</xsl:if>
</fieldset>
</xsl:template>
</xsl:stylesheet>
0
相关文章
