当前位置:首页 > 网络编程 > WEB编程 > JSP > 使用JavaServerPages标准标记库来管理XML数据

使用JavaServerPages标准标记库来管理XML数据

点击次数:29 次 发布日期:2008-11-26 16:38:43 作者:源代码网
源代码网推荐
  

  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 页面
  1. 首先,Web 项目必须创建为支持 JSTL。为了创建这样的项目,请在 Application Developer 的主菜单中选择 File => New => Web Project。
  2. 在“Define the Web Project”对话框(图 1)中,在 Project name 字段中键入项目的名称,在 New projectlocation 字段中指定目录路径。在 Web Project features 中选取 Include the JSP Standard Tag library, 然后选择 Next。

      图 1. 定义 Web 项目

      
  3. 在“J2EE Settings Page”对话框(图 2)中,键入 Enterprise 应用项目名字和新项目路径以及 Web应用程序的上下文根。确保选取的 J2EE Level 是 1.3。单击 Finish。

      图 2. J2EE 设置页面

      

      
  4. 定位到 Web Content 下您想要存储该 JSP 文件的文件夹。右键单击并选择 New => JSP File。
  5. 在“New JSP File”对话框(图 3)中,键入新 JSP 文件的 File Name,然后单击 Next。

      图 3. 新的 JSP 文件

      
  6. 现在您需要确定要包含在 Web 项目中的标记库。我们要使用的是具有 JSTL 核心标记的

      c.tld标记库以及有助于管理XML 文档的

      x.tld标记库。单击 Add Tag Library...按钮(图 4)。

      图 4. 添加标记库

      
  7. 在标记库列表(图 5)中选中 c.tld和 x.tld,然后单击 OK。

      图 5. 选择标记库

      

      
  8. 系统会弹出显示选中的标记库的“New JSP File”对话框(图 6)。单击 Finish来生成 JSP 文件。(您也可以单击 Next来选择 JSP 文件的其他选项。)

      图 6. 标记库选择

      
  9. 这样就创建了一个与下面类似的

      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 自动地为您创建一个:
  1. 在 Web 透视图中打开您刚创建的 Web 项目。
  2. 右键单击 index.jsp文件,然后选择 Run on Server。
  3. Application Developer创建一个新的 WebSphere Application Server V5 实例,启动它,然后打开一个内部 Web 浏览器窗口来测试 JSTL应用程序。


  如果 WebSphere Application Server 实例已经存在并且已经配置在Application Developer 中,您需要将 Web 应用程序添加到服务器配置中:
  1. 如果 WebSphere Test Environment 已经在运行,则停止它。
  2. 在 Web 或服务器透视图中,右键单击Server Configuration 窗口中的 WebSphere Application Server 实例并选择包含上面创建的 Web应用程序的 Enterprise 项目。
  3. 在 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,您需要执行以下操作:
  1. 启动 WebSphere Application Server。WebSphere Application Server V5 有一个缺省的配置称为server1。通过选择 Start => Programs => IBM WebSphere => Application Server v5.0 => Start the Server来启动该服务器。另一种选择是从命令提示符启动服务器。要想这样做,您应该首先检查服务器的状态,如果该服务器停止了就启动它(图 7):
    • 在命令提示符中键入

        serverstatus server1

      源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华