JavaServer Pages 为在 Web 环境中表示数据提供了一个非常灵活而且强大的工具。在 JSP 中可以使用称为 Scriplet 的 Java 代码来给页面设计人员提供更多的灵活性。标记库为页面设计人员提供了一种方法来隐藏 Java 程序设计语言的复杂性。如果使用可扩展标记语言,数据就可以表示成一种结构化的形式,并通过样式表语言(XSL)的模板文件(XSLT)来呈现给不同的目标。JSP 标准标记库 (Standard Tag Library)提供了一个简单易用的界面,它可以让 JSP 页面设计人员使用 XSL 模板文件来管理 XML 文档和对它们进行转换。
JavaServer Pages 为在 Web 环境中表示数据提供了一个非常灵活而且强大的工具。在 JSP 中可以使用称为 Scriplet 的 Java 代码来给页面设计人员提供更多的灵活性。标记库为页面设计人员提供了一种方法来隐藏 Java 程序设计语言的复杂性。如果使用可扩展标记语言,数据就可以表示成一种结构化的形式,并通过样式表语言(XSL)的模板文件(XSLT)来呈现给不同的目标。JSP 标准标记库 (Standard Tag Library)提供了一个简单易用的界面,它可以让 JSP 页面设计人员使用 XSL 模板文件来管理 XML 文档和对它们进行转换。
引言
XML 在 Web 开发中变得越来越重要,它已经成为开发人员处理 XML 文档必备的工具了。由于 Web 设计人员对 JSP 标记库的 XML句法已经越来越熟悉了,将标记库引入 JSP 规范使得非 Java™ 程序设计人员的 Web 开发人员在建立 Web 页面时可以更方便地使用 Java库。标记库可以让 Java 程序设计人员将 JSP 开发人员需要用到的代码封装在可重用构件中。
JSP Standard Tag Library(JSTL)增加了诸如管理 XML 文档的标记和访问 SQL 数据库的标记这样的功能。JSTL 的引用实现是由 JSR-052 Expert Group开发,在 Java Community Process下运行,并由 Jakarta Taglibs托管的。
JSTL 分成以下四个功能区:核心 XML 处理 I18N 可能的格式化 数据库访问(SQL)。
本文把重点放在允许管理 XML 文档的 JSTL 标记上。要了解 JSP 标准标记库更完整的信息请参考 JSTL 1.0 specification。
要使用 JSTL,您需要一个支持 Java Servlet 2.3 和 JavaServer Pages 1.2 规范的 JSP 容器。WebSphereStudio Application Developer Version 5(以下简称为 Application Developer)所附带的 WebSphere®Test Environment 支持这些规范。Jakarta Tomcat 4 也支持 Java Servlet 2.3 和 JavaServerPages 1.2 规范。Application Developer 可以使 Web 开发人员能够通过 WebSphere ApplicationServer V5 测试和部署 Web 应用程序。要实现本文所介绍的方法,请使用 WebSphere Application Server V5 或 Tomcat 4的最新版本。
样本 JSTL 场景
我们将使用一个简单的场景来说明 JSTL:某个小型组织想要建立一个包含所有Web 页面的具有紧凑外观的 Web 站点。每个页面应该包括以下内容:一个显示当前页面横幅的头部。 一个包含该页面中的特定信息的页面主体。 能够动态显示的菜单导航条。所显示的菜单项取决于登录到这一 Web 页面的用户的权限。Web站点访问者可以不用登录,但这样只能访问该站点的非限制区域。只有具有适当权限的成员才能访问站点的其他区域。指向这些区域的链接只有在登录身份验证有效以后才会显示。 一个包含指向 Web 站点其他页面的链接的页脚,它与菜单组件相类似。
每个菜单链接包含一个按钮,指向某一URL,并具有供替换的文本。这样的菜单的 XML 描述符可能看起来像是这样的:
<mainmenu>
<link>
<url>index.jsp</url>
<image>home.gif</image>
<text>Please click here to go to the main page</text>
</link>
<link>
<url>help.jsp</url>
<image>help.gif</image>
<text>Please click here to see how we can help you</text>
</link>
<link>
<url>schedule.jsp</url>
<image>schedule.gif</image>
<text>Please click here to see the schedules</text>
</link>
<link>
<url>functions.jsp</url>
<image>functions.gif</image>
<text>Please click here to see the functions</text>
</link>
<link>
<url>login.jsp</url>
<image>login.gif</image>
<text>Please click here to login, if you are a member</text>
</link></mainmenu>
该菜单可以通过 servlet 或 JavaBeans或使用 JSTL 来动态地创建。该链接可以根据需要添加或删除。
将这种 XML 文档转换为 HTML 的 XSL 可能看起来像是这样的:
<xsl:template match="mainmenu">
<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0" WIDTH="180">
<TBODY>
<TR>
<TD HEIGHT="75"></TD>
</TR>
<xsl:apply-templates select="link"/>
</TBODY>
</TABLE></xsl:template><xsl:template match="link">
<tr>
<td>
<A xsl:use-attribute-sets="anchor">
<IMG xsl:use-attribute-sets="img"/>
</A>
</td>
</tr></xsl:template><xsl:attribute-set name="anchor">
<xsl:attribute name="href">
<xsl:value-of select="url"/>
</xsl:attribute></xsl:attribute-set><xsl:attribute-set name="img">
<xsl:attribute name="src">./images/<xsl:value-of select="image"/>
</xsl:attribute>
<xsl:attribute name="border">0</xsl:attribute>
<xsl:attribute name="width">170</xsl:attribute>
<xsl:attribute name="height">45</xsl:attribute>
<xsl:attribute name="alt"><xsl:value-of select="text"/>
</xsl:attribute></xsl:attribute-set>
站点页面的其他组件可以通过类似方式来构建,使用静态和动态内容相结合的方式。与菜单一样,它们可以通过 servlet 或 JavaBeans 或使用 JSTL来动态地创建。
我们的目标是组合所有这些组件来形成一个单一的页面。XML 和 XSL 的使用可以使它更具灵活性。我们将 XML段组合在一起以形成一个单一的 XML 文档,同时将 XSL 段组合在一起以形成一个单一的 XSL 文档。通过使用所得 XSL 文档的 XSLT 可以将所得的XML 文档转换成 HTML。下一部分将会介绍执行这些任务需要用到的不同的 JSTL 标记。
JSTL XML 操作
在 JSTL的中心是核心标记,其中某些标记使得管理 XML 文档更加方便。这些能够方便管理 XML 文档的核心标记是
import 、 out 和 set 。
<c:import>
XML 文档可能需要从不同的位置和源端收集。import 标记允许导入基于 URL 资源的内容。例如,以下的标记从上下文根导入名为
mainmenu.xml的文档并为导入的文档指派一个名为 menu 的变量。
<c:import url="/xsl/mainmenu.xsl" var="menu"/>
举个例子,如果上下文根是
http://localhost:8080,同样的标记可以等价地写为:
<c:import url="http://localhost:8080/xsl/mainmenu.xsl" var="menu"/>
另一种选择是,可以从本地机器的某一位置提取同样的文档。第一个句法更加灵活,因为它允许更改上下文根,这使得文档的位置可以动态指定。
<c:out>
out 标记用于将变量中的值输出给当前的 JspWriter 对象。一旦 XML文档已经收集,它就可以用作输出。例如,以下标记输出先前导入的文档的内容。
<c:out value="${menu}" escapeXml="false"/>
在上面的标记中,
escapeXml="false"指明字符 <、 >、 &、 '、 "应该转换成它们相应的字符实体代码。如果文档的内容需要发送给页面以供显示(例如上面的例子),那么应该设置
escapeXml="true"。
可变菜单所引用的对象也可以事先通过 servlet 或 JavaBeans 或使用 JSTL 在会话期间动态地创建好。
<c:set>
XML 文档也可能需要动态地创建,这有时是通过将多个文档组合成一个来实现的。set标记用于评估一个表达式,并将评估结果设置在 scoped 变量中。以下的例子导入多个文档并将它们组合成一个文档,所得结果存储在名为 xsl 的变量中。
<c:import url="/xsl/mainscreen.xsl" var="mainscreen"/><c:import url="/xsl/mainmenu.xsl" var="menu"/><c:import url="/xsl/mainbody.xsl" var="body"/><c:import url="/xsl/footer.xsl" var="footer"/><c:import url="/xsl/index.xsl" var="indexpage"/><c:set var="xsl"><?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/><c:out value="${mainscreen}" escapeXml="false"/><c:out value="${menu}" escapeXml="false"/><c:out value="${body}" escapeXml="false"/><c:out value="${indexpage}" escapeXml="false"/><c:out value="${footer}" escapeXml="false"/></xsl:stylesheet></c:set>
在以上的例子中,为了得到所期望的结果文档,一起使用了 import、set 和 out 标记来组合多个文档。以上变量所引用的对象也可以事先通过 servlet或 JavaBeans 或使用 JSTL 在会话期间动态地创建好。
<x:transform>
transform 标记使得 JSP 开发人员使用 XSL 模板文件将 XML 文档转换成其他格式变得更加方便。以下所示的是导入 XSL文档并用它来转换导入的 XML 文档的 JSTL 片段。转换结果写入该页面中。
<c:import url="/xml/document.xml" var="xml"/><c:import url="/xsl/document.xsl" var="xsl"/><x:transform xml="${xml}" xslt="${xsl}"/>
这里是一个带有 Java scriplets 的样本 JSP,它与上面的 JSTL 片段所做的事情是一样的。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><%@ page language="java" import="java.lang.*"
contentType="text/html; charset=WINDOWS-1252"
autoFlush="true" session="true"%><%@ page import="javax.xml.transform.*,
javax.xml.transform.stream.*,
java.io.*,
org.w3c.dom.*"%><META http-equiv="Content-Type"content="text/html; charset=WINDOWS-1252"><META name="GENERATOR" content="IBM WebSphere Studio"><META http-equiv="Content-Style-Type" content="text/css"><%// Get the servlet contextServletContext context = getServletContext();// Initialize the variables that we need for this process.String docBody = null;StreamSource xmlSource = null;StreamSource xslSource = null;// Get the true location of the xml documentdocBody = "/xml/document.xml";String xmlDoc = context.getRealPath(docBody);// Load the XML document from the file locationxmlSource = new StreamSource(new File(xmlDoc));// If we have a valid XML document then attempt to parse it with the// needed xsl template.if (xmlSource != null) {
// Get the true location of the xsl document.
docBody = "/xsl/document.xsl";
String xslDoc = context.getRealPath(docBody);
// Load the XSL document from the file location
xslSource = new StreamSource(new File(xslDoc));}// If we have the xml and xsl documents then do the transformationif (xmlSource != null && xslSource != null) {
// Prepare the output stream
StreamResult xsltOutput = new StreamResult(out);
// Set up the transformer factory for the XSLT transform.
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer(xslSource);
// Transform the XML document using the XSLT template.
transformer.transform(xmlSource, xsltOutput);}%>
很显然,这一个更加棘手,它要求有 Java 程序设计的知识,然而前面例子中的transform 标记隐藏了实现的复杂性,使得它对页面设计者来说是不可见的。
JSTL 与 Application Developer
WebSphereStudio Application Developer 提供了对 JSTL 的支持。通过 Web Project 向导,ApplicationDeveloper 提供了一种很简单的方法来实现这一支持,并使得 JSTL JAR 文件和标记库描述符(tlds)对 Web 应用程序可用。JAR文件被添加到 Web 应用程序的
WEB-INFlib子目录下。
Application Developer中的 JSTL 包所附带的一些 JAR 文件是:
dom.jar
jaxen-full.jar
jaxp-api.jar
jdbc2_0-stdext.jar
jstl.jar
sax.jar
saxpath.jar
standard.jar
xalan.jar
xercesImpl.jar.
本文使用的标记库描述符是:
c.tld
x.tld.
创建一个 JSTL 可用的 Web 项目和 JSP 页面首先,Web 项目必须创建为支持 JSTL。为了创建这样的项目,请在 Application Developer 的主菜单中选择 File => New => Web Project。 在“Define the Web Project”对话框(图 1)中,在 Project name 字段中键入项目的名称,在 New projectlocation 字段中指定目录路径。在 Web Project features 中选取 Include the JSP Standard Tag library, 然后选择 Next。
图 1. 定义 Web 项目
在“J2EE Settings Page”对话框(图 2)中,键入 Enterprise 应用项目名字和新项目路径以及 Web应用程序的上下文根。确保选取的 J2EE Level 是 1.3。单击 Finish。
图 2. J2EE 设置页面
定位到 Web Content 下您想要存储该 JSP 文件的文件夹。右键单击并选择 New => JSP File。 在“New JSP File”对话框(图 3)中,键入新 JSP 文件的 File Name,然后单击 Next。
图 3. 新的 JSP 文件
现在您需要确定要包含在 Web 项目中的标记库。我们要使用的是具有 JSTL 核心标记的
c.tld标记库以及有助于管理XML 文档的
x.tld标记库。单击 Add Tag Library...按钮(图 4)。
图 4. 添加标记库
在标记库列表(图 5)中选中 c.tld和 x.tld,然后单击 OK。
图 5. 选择标记库
系统会弹出显示选中的标记库的“New JSP File”对话框(图 6)。单击 Finish来生成 JSP 文件。(您也可以单击 Next来选择 JSP 文件的其他选项。)
图 6. 标记库选择
这样就创建了一个与下面类似的
index.jsp文件: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %><%@ pagelanguage="java"contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"autoFlush="true"%><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><META name="GENERATOR" content="IBM WebSphere Studio"><META http-equiv="Content-Style-Type" content="text/css"><LINK href="theme/Master.css" rel="stylesheet" type="text/css"><TITLE>index.jsp</TITLE></HEAD><BODY><P>Place index.jsp's content here.</P></BODY></HTML>
使用 JSTL 可用的 Web 项目来创建样本场景
我们将在这个简单的例子中使用上面提到的场景。XML 和 XSL 在此用于说明如何通过 JSTL 将文档片段放置在一起。
对于这个例子,在项目的 Web Content 文件夹中新创建了三个文件夹。它们是:
images
xml
xsl.
图像文件与 XML 和 XSL 片段分别地放在这些子文件夹中。上面创建的
index.jsp文件在此需要稍做修改以便使用JSTL 来将 XML 和 XSL 片段组合成一个单一的文档。所得的 XML 文档通过组合的 XSL 文档来转换。更新后的
index.jsp文件看起来像是这样的:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><HTML><HEAD><%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %><%@ taglib uri="http://java.sun.com/jstl/xml" prefix="x" %><%@ pagelanguage="java"contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"autoFlush="true"%><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><META name="GENERATOR" content="IBM WebSphere Studio"><META http-equiv="Content-Style-Type" content="text/css"><LINK href="theme/Master.css" rel="stylesheet" type="text/css"><TITLE>Welcome to our organization</TITLE></HEAD><BODY><c:import url="/xsl/footer.xslpart" var="footer"/><c:import url="/xsl/mainscreen.xslpart" var="mainscreen"/><c:import url="/xsl/mainmenu.xslpart" var="menu"/><c:import url="/xsl/mainbody.xslpart" var="body"/><c:import url="/xsl/index.xslpart" var="indexpage"/><c:set var="xsl"><?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="yes"/><c:out value="${mainscreen}" escapeXml="false"/><c:out value="${menu}" escapeXml="false"/><c:out value="${body}" escapeXml="false"/><c:out value="${indexpage}" escapeXml="false"/><c:out value="${footer}" escapeXml="false"/></xsl:stylesheet></c:set><c:import url="/xml/mainmenu.xmlpart" var="mainmenu"/><c:import url="/xml/mainbody.xmlpart" var="mainbody"/><c:import url="/xml/footer.xmlpart" var="footerdata"/><c:set var="xml"><?xml version="1.0"?><mainscreen><c:out value="${mainmenu}" escapeXml="false"/><c:out value="${mainbody}" escapeXml="false"/><c:out value="${footerdata}" escapeXml="false"/></mainscreen></c:set><x:transform xml="${xml}" xslt="${xsl}"/></BODY></HTML>
将 JSTL Web 应用程序部署到 WebSphere Test Environment 中
如果在 Application Developer 中没有创建 WebSphere Application Server 实例,您可以让Application Developer 自动地为您创建一个:在 Web 透视图中打开您刚创建的 Web 项目。 右键单击 index.jsp文件,然后选择 Run on Server。 Application Developer创建一个新的 WebSphere Application Server V5 实例,启动它,然后打开一个内部 Web 浏览器窗口来测试 JSTL应用程序。
如果 WebSphere Application Server 实例已经存在并且已经配置在Application Developer 中,您需要将 Web 应用程序添加到服务器配置中:如果 WebSphere Test Environment 已经在运行,则停止它。 在 Web 或服务器透视图中,右键单击Server Configuration 窗口中的 WebSphere Application Server 实例并选择包含上面创建的 Web应用程序的 Enterprise 项目。 在 Application Developer 中右键单击 index.jsp文件,然后选择 Run on Server。如果服务器并没有启动,则 Application Developer 会启动它;或者您可以启动 WebSphereApplication Server,打开一个外部 Web 浏览器,然后键入 URL:
http://localhost:9080/project/index.jsp
将 JSTL Web 应用程序部署到 Tomcat 4.0 中
另外,还可以在 Application Developer 外使用 Tomcat 4 来部署 Web 应用程序。要想这样做,您需要将 Web项目作为一个 Web 档案(WAR)文件导出,并将它添加到 Tomcat 4.0 Web apps 中。
如果您是使用 Tomcat 4.0来这样做,请确保 Apache Xerces 和 Apache Xalan 在 Tomcat 4 服务器实例类路径中。您可以将变量 WAS_XERCES 和 WAS_XALAN添加到 Tomcat 4 服务器实例类路径中,这样就可以使用 Application Developer 附带的 Xerces 和 Xalan 版本了。
在 WebSphere Application Server 中部署 JSTLWeb 应用程序
要想将 JSTL Web 应用程序安装到 WebSphere Application Server,您需要执行以下操作:启动 WebSphere Application Server。WebSphere Application Server V5 有一个缺省的配置称为server1。通过选择 Start => Programs => IBM WebSphere => Application Server v5.0 => Start the Server来启动该服务器。另一种选择是从命令提示符启动服务器。要想这样做,您应该首先检查服务器的状态,如果该服务器停止了就启动它(图 7): 在命令提示符中键入
serverstatus server1