微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > Servlet/JSP >

用 JavaServer Pages 技术生成动态 XML

时间:2017-01-10 04:01  浏览:努力统计中...
Web 应用程序开发人员传统上使用 JSP 技术动态构建 HTML,方法是将 Java 代码包括在 HTML 源代码中。但您知道可以使用同样的方法生成 HTML 之外的动态内容吗?您可以实现这一点,而且方

Web 应用程序开发人员传统上使用 JSP 技术动态构建 HTML,方法是将 Java 代码包括在 HTML 源代码中。但您知道可以使用同样的方法生成 HTML 之外的动态内容吗?您可以实现这一点,而且方法比较简单。可以使用 XML 文档构建 JSP 页面,该 XML 文档将用作输出模板,然后替换必须基于基层业务逻辑动态生成的部分。为了生成文档的动态部分,您既可以使用直接编写在 JSP 页面中的 Java 代码,也可以使用从该页面外部调用的 Java 代码。

生成文档的哪些部分由您控制。例如,您可以使用 Java 代码生成两个 XML 标记之间的数据,生成 XML 文档树的各个部分(标记和数据),甚至可以生成整个文档。

Java 代码被从页面中除去,并被加工成一个 servlet(称为页面 servlet),然后 Java 应用程序服务器将其作为 JSP 页面请求的一部分运行。得到的结果是纯 XML。

JSP 技术概述

让我们先对 JSP 页面的工作方式作一些简单的讨论。我们将力求简单,只将注意力集中于一些基本的方面。有关详细信息,请参阅 参考资料中到其他 JSP 技术信息的链接。

从传统意义上讲,JSP 页面与 HTML 页面很相似,只是多了一些标记。这些标记使设计人员能够将 Java 代码(不是 JavaScript)嵌入到页面中。Web 应用程序服务器(如 IBM WebSphere Application Server)将截取对 JSP 页面的请求。页面的扩展名 .jsp (不是 .html )向应用程序服务器暗示了这些标记的存在。Web 应用程序服务器随后对 JSP 页面进行预处理,提取其中的 JSP 标记和任何内嵌的 Java 代码,而只保留 HTML。提取出来的 JSP 标记和内嵌 Java 代码用来构建 Java servlet(JSP 页面 servlet),Java servlet 运行该代码并将结果插入到原页面中 JSP 标记所在的位置。得到的结果是纯 HTML。在请求浏览器看到任何结果之前,Java 代码被剥离并在服务器上运行。

我们可以将同样的原理应用于 XML 页面。在包含 XML 的 JSP 页面的请求者(可能是一个浏览器,也可能是某个企业对企业的应用程序)看到 XML 之前,Java 代码被剥离 JSP 页面并用来生成其他内容,生成的内容被插入到 JSP 标记原来所在的页面位置。这种特性使您能够精确地控制将新内容插入到什么位置,甚至可以精确到单个字符。

过一会儿我们将考虑如何使用以上的特性。首先,让我们考虑为什么您可能会想到用 JSP 创建动态 XML。为什么不只是编写 Java 应用程序或 servlet 来生成整个文档?为什么要费心去使用 JSP 呢?最重要的原因是无须为每个请求重新生成静态内容是有意义的(假定 XML 文档只有部分内容是动态的)。通过使用 JSP 页面,页面内的静态 XML 就可以充当一个模板,该模板是用动态内容填充的。Java 代码的任务仅仅是生成可能随时间变化的内容 -- 这是一种更有效的方法。

非常现实的一个问题是,JSP 页面使您能够将不同开发人员负责的任务分开。特别是,它们允许您更好地将数据与视图分离开,从而允许您在不影响逻辑的情况下添加新表示。设想这样一个 Java servlet,它执行业务逻辑,并根据请求的性质将生成的结果重定向到适当的 JSP 页面。例如,当 servlet 检测到 WAP 电话浏览器发出请求时,它就可以将数据重定向到一个包含 WML 的 JSP 页面。对于标准浏览器请求,它可以将数据重定向到包括 HTML 的 JSP 页面。

结构

让我们剖析一个示例,该示例将一个静态 XML 文档转换为一个 JSP 页面,该文档的部分内容被重写为要动态生成。本例基于 IBM WebSphere Transcoding Publisher 附带的一个称为 FlightInfo 的 XML 样例。此 XML 文档表示一个特定航线的信息。Transcoding Publisher 将它作为一个说明如何使用该产品以适合设备的格式再现 XML 数据的样例。但是在 Transcoding Publisher 或其他任何应用程序有机会处理该文档之前,我们希望动态构建它的某些内容。

下面是原始的 XML 文档(已将 DTD 省略):
<?xml version="1.0" encoding="ISO-8859-1"?>
<Flights>
  <AirCarrier>AA</AirCarrier>
  <FlightNumber>700</FlightNumber>
  <FlightSegment>
     <DepartingInfo>
      <City>DFW</City>
      <Date>30Mar</Date>
      <Scheduled>0630A</Scheduled>
      <Status>ON TIME</Status>
      <Time>0632A</Time>
      <Gate>C16</Gate>
      <OffGateTime>0644A</OffGateTime>

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------
栏目列表
推荐内容