动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.利用JavaApplet编程实现动画特技.
.iBATIS step by step 2.
.使用Forte for Java开发EJB(下).
.J2ME环境下开发HELLOWORLD程序全.
.applet的参数化--对数组进行初始.
.[JAVA100例]071、使用JDOM操作XML.
.JDBC 连接各种数据库方法.
.如何更好的使用JTextPane.
.轻松掌握 Java 泛型 (第 4 部分).
.深入浅出Java clone技术.
.ClearQuest管理和执行ClearCase中.
.手机操作系统及移动开发.
.Java理论与实践:哈希.
.Java Reflection (JAVA反射)详解.
.探索JDK1.5高级编码特征.
.高级应用 java多线程设计模式详解.
.java程序获取绝对路径的代码!.
.Java对战.NET,战争与和平的游戏.
.深入探讨EJB中新的消息驱动组件(.
.深入浅出Java多线程程序设计.doc.

使用JavaServer Pages技术生成动态XML

发表日期:2008-1-5 |



  作者:lhcyf

使用 JavaServer Pages 技术生成动态 XML   

  JavaServer Pages (jsp) 技术通常用于构建包含动态内容的 Html 页面。但是您也可以使用这一技术生成其他格式(包括 XML)的动态内容。本文将用实例说明如何将 JSP 页面构建为 XML 文档模板,此模板是在请求时使用嵌在该页面中的 Java 代码"填充"的。
  Web 应用程序开发人员传统上使用 JSP 技术动态构建 HTML,方法是将 Java 代码包括在 HTML 源代码中。但您知道可以使用同样的方法生成 HTML 之外的动态内容吗?您可以实现这一点,而且方法比较简单。可以使用 XML 文档构建 JSP 页面,该 XML 文档将用作输出模板,然后替换必须基于基层业务逻辑动态生成的部分。为了生成文档的动态部分,您既可以使用直接编写在 JSP 页面中的 Java 代码,也可以使用从该页面外部调用的 Java 代码。
  生成文档的哪些部分由您控制。例如,您可以使用 Java 代码生成两个 XML 标记之间的数据,生成 XML 文档树的各个部分(标记和数据),甚至可以生成整个文档。
  Java 代码被从页面中除去,并被加工成一个 servlet(称为页面 servlet),然后 Java 应用程序服务器将其作为 JSP 页面请求的一部分运行。得到的结果是纯 XML。

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> <OFFGROUNDTIME>0632A< <Gate Time> <Time>1043A< Status> TIME< <Status>ON Scheduled> <Scheduled>1040A< Date> <Date>30Mar< City> <City>LGA< <ArrivingInfo> DepartingInfo> < OffGroundTime>>D5</Gate> <Baggage>B</Baggage> <OnGroundTime>1043A</OnGroundTime> </ArrivingInfo> </FlightSegment></Flights>
使用 .jsp 扩展名重命名该文件
  首先,我们需要使用 .jsp 扩展名重命名该文件,以便 Web 服务器知道如何处理它。Web 服务器按一定的规则作用于某些 URL 模式或文件扩展名,如 .html 或 .gif。当将一个 Web 应用程序服务器添加到一个 Web 服务器中时,该应用程序服务器就会在 Web 服务器列表中添加规则,以便处理特定于该应用程序服务器的 URL 和文件扩展名。当 Web 服务器看到一个带有 .jsp 扩展名的文件时,它就会将此请求传递给 Web 应用程序服务器进行处理。

添加页面指令
  下一步,我们需要把将要生成的内容的格式通知 JSP 页面编译器。缺省情况下,页面编译器将假定内容的格式是 HTML。要覆盖这一设置,必须添加 JSP 页面指令来设置内容类型。对于 JSP 1.0,内容类型页面指令类似以下的形式:
<%@ page contentType="text/xml;charset=ISO-8859-1" %>
  重要的是要注重 JSP 页面编译器只会除去组成标记及其内容的字符。假如将 JSP 标记放在一个新行上,页面编译器将除去除换行符之外的任何字符(因为换行符不是标记的一部分)。例如,假定我们按以下方式将内容类型标记添加到新 JSP 页面中:
<%@ page contentType="text/xml;charset=ISO-8859-1" %><?xml version="1.0" encoding="ISO-8859-1"?><Flights> <AirCarrier>AA</AirCarrier> <FlightNumber>700</FlightNumber> <FlightSegment> ...
  在这种情况下,页面编译器将除去第一行中的页面指令,并在 <?xml...?> 版本标记之前留下一个空行。在 XML 文档中,XML 版本标记必须位于第一行,所以这个示例将在 XML 分析程序中导致错误。要修正这个错误,请将此页面指令添加到第二行,或者将内容标记连接在 XML 版本标记之后。实际上将页面指令放在文档中的什么位置并不重要,因为页面编译器会将此指令添加到所生成的页面 servlet 的 service() 方法的开头,而不管它在页面中处在什么位置。尽管这样,为了具有较好的可读性,您可能希望将它添加为第二行,如下所示:
<?xml version="1.0" encoding="ISO-8859-1"?><%@ page contentType="text/xml;charset=ISO-8859-1" %><Flights> <AirCarrier>AA</AirCarrier> <FlightNumber>700</FlightNumber> <FlightSegment> ...
添加 Java 代码
  现在剩下要做的事情就是添加 Java 代码来定制 XML 的某些内容。我们将 Java 代码添加到文件中的 scriptlet 标记 (<%...%>) 之间。页面编译器将把这两个标记之间的任何内容解释为纯 Java 代码,并不加修改地将它添加到所生成的页面 servlet 的 service() 方法中。
  scriptlet 标记内的所有代码都被按它们在 JSP 页面出现的次序添加到 service() 方法中。添加的代码的作用域是整个页面,从而是整个 service() 方法。因此,假如您在文件开头的一对 scriptlet 标记之间定义一个变量,则以后您可以在文件中使用一对完全不同的 scriptlet 标记引用这个变量。可以通过在变量定义两侧添加您自己的一对花括号 ({...}) 来强加一个作用域。这两个花括号甚至可以在一对 scriptlet 标记之间开始,而在另一对 scriptlet 标记之间结束。
  在下面的示例中,我用一些使用 Calendar 类的 Java 代码来替换原始 XML 文件中的几个静态日期。这段代码在为几个 XML 标记创建适当时间条目的同时,使用当前日期,并添加时和分。Java 代码用粗体表示。添加行号是为了便于以后引用。
1. <?xml version="1.0" encoding="ISO-8859-1"?>
2. <%@ page contentType="text/xml;charset=ISO-8859-1" %>
3. <% java.util.Calendar cal = java.util.Calendar.getInstance(); %>
4. <Flights>
5. <AirCarrier>AA</AirCarrier>
6. <FlightNumber>700</FlightNumber>
7. <FlightSegment>
8. <DepartingInfo>
9. <City>DFW</City>
10. <Date>30Mar</Date>
11. <Scheduled>
12. <% out.print(cal.getTime().toString()); %>
13. </Scheduled>
14. <Status>ON TIME</Status>
15. <% cal.add(java.util.Calendar.MINUTE, 10);
16. out.print("<Time>" + cal.getTime().toString() +
17. "</Time>"); %>
18. <Gate>C16</Gate>
19. <OffGateTime>0644A</OffGateTime>
20. <OffGroundTime>0632A</OffGroundTime>
21. </DepartingInfo>
22. <ArrivingInfo>
23. <City>LGA</City>
24. <Date>30Mar</Date>
25. <Scheduled>
26. <% cal.add(java.util.Calendar.HOUR_OF_DAY, 4);
27. out.print(cal.getTime().toString());
28. cal.add(java.util.Calendar.MINUTE, 2); %>
29. </Scheduled>
30. <Status>ON TIME</Status>
31. <Time><%= cal.getTime().toString() %></Time>
32. <Gate>D5</Gate>
33. <Baggage>B</Baggage>
34. <OnGroundTime>1043A</OnGroundTime>
35. </ArrivingInfo>
36. </FlightSegment>
37.</Flights>

下面是在这个代码段中所进行的操作:
  第 2 行:添加页面指令来指明这个页面 servlet 生成的响应将包含 XML。
  第 3 行:定义类型为 Calendar 的变量 cal 来包含当前日期和时间。
  第 12 行:使用全局 out 对象,我们可以直接显示到正在作为响应发送的页面的当前位置。我们将当前的时间戳显示到页面上。请注重,当生成响应时,JSP scriptlet 标记将被时间戳结果取代。
  第 15-17 行:在当前时间上加上 10 分钟,并将这个结果显示到页面上作为出发时间。
  第 26-28 行:在当前时间上加上 4 个小时以得出航班的预定到达时间,然后使用 out 对象将这个结果显示到页面上。然后再加上 2 分钟来创建实际到达时间。
  第 31 行:带有 scriptlet 标记的等号 (<%=...%>) 将导致将标记内所包含的任何结果显示到页面上。示例中的这一行等价于使用标准 scriptlet 标记的以下一行:
  <% out.print(cal.getTime().toString()); %>
  请注重,cal 对象对整个页面都是全局的,尽管使用它的一对 scriptlet 标记并不是定义它的同一对 scriptlet 标记。如前所述,除非添加花括号 ({...}) 来强制使用作用域,否则变量声明从声明之处对于整个页面都是全局的。
  同样,本例中的 Java 代码主要用来生成 XML 标记之间的数据。我们还可以使用 Java 代码生成一个 XML 文档中的整个标记树。代码除了显示数据之外,还必须简单地显示出标记。这正是第 15-17 行所完成的任务。
添加 JavaBeans 组件
  JSP 语法支持将 JavaBeans 组件添加到页面中,并像访问任何其他 Java 对象一样访问它们。专用的 <jsp:useBean> 标记用来声明和实例化 bean。页面编译器将使用 <jsp:useBean> 标记的属性来构建页面 servlet 中的 Java 代码,这对于实例化 bean 以及将请求中的数据置入 bean 是必需的。
  因为 JavaBeans 组件通常必须执行一项任务,所以很轻易看出如何使用它们来执行或干预复杂的业务逻辑,同时也从 JSP 页面中移去复杂的 Java 代码。一个示例是 Integration Object JavaBean 组件。这个 bean 是使用 IBM WebSphere Host Publisher 构建的,它封装了与旧有数据源(如 3270 应用程序或数据库)的交互,并只是返回它们的数据。设想使用一个 Integration Object,为了在我们示例中提供到达和出发信息,它与基于主机的航空调度应用程序对接。作为 Integration Object 的一个用户,您只须请求它的航线数据,而不会察觉到在后台发生的与主机应用程序之间的复杂通信和交互。
  下面是为了使用这样一个 bean 而重新编写的示例。

1. <?xml version="1.0" encoding="ISO-8859-1"?>
2. <%@ page contentType="text/xml;charset=ISO-8859-1" %>
3. <jsp:useBean id="flightInfo" class="IntegrationObject.FlightInfo"/>
4. <% flightInfo.doHPTransaction(request, response); %>
5. <Flights>
6. <AirCarrier>AA</AirCarrier>
7. <FlightNumber>700</FlightNumber>
8. <FlightSegment>
9. <DepartingInfo>
10. <City>DFW</City>
11. <Date>30Mar</Date>
12. <Scheduled>
13. <% out.print(flightInfo.getScheduledDeparture()); %>
14. </Scheduled>
15. <Status>ON TIME</Status>
16. <% out.print("<Time>" + flightInfo.getActualDeparture() +
17. "</Time>"); %>
18. <Gate>C16</Gate>
19. <OffGateTime>0644A</OffGateTime>
20. <OffGroundTime>0632A</OffGroundTime>
21. </DepartingInfo>
22. <ArrivingInfo>
23. <City>LGA</City>
24. <Date>30Mar</Date>
25. <Scheduled><%= flightInfo.getScheduledArrival() %>
26. </Scheduled>
27. <Status>ON TIME</Status>
28. <Time><%= flightInfo.getActualArrival() %></Time>
29. <Gate>D5</Gate>
30. <Baggage>B</Baggage>
31. <OnGroundTime>1043A</OnGroundTime>
32. </ArrivingInfo>
33. </FlightSegment>
34.</Flights>
让我们进一步分析一下本例中进行的操作。
  第 3 行包含 <jsp:useBean> 标记,它将 bean IntegrationObject.FlightInfo 定义并实例化为 flightInfo。下一行包含一个 scriptlet,它调用 flightInfo 的 doHPTransaction() 方法,使它连接到主机航班信息应用程序并检索相关的航班信息。第 13、16、25 和 28 行只是将结果插入到 XML 文档中。
  您可以按完全相同的方式使用其他类型的 bean,也许以调用 doHPTransaction() 之外的某个其他调用方法完成这一操作。您甚至可以在同一个文档中添加多个 bean,并为来自多个数据源的数据创建一个复合的 XML 视图。

小结

  JavaServer Pages 技术成为一个开放标准已经几年了,并已广泛用于生成动态 HTML 文档。少数人已经熟悉到将实际的 Java 代码嵌在 HTML 文档中所具有的同等灵活性也适用于生成 XML。请考虑这种可能性。通过只动态构建那些变化的数据,您就能够改进企业对企业的通信。您可以构建来自一个数据源的数据的各种表示,不仅仅是 HTML 和 XML,还有用于无线协议的 WML 和 HDML,或者简单使用类似 WebSphere Transcoding Publisher 这样的产品将动态 XML 转换为适合设备的表示。
  XML 无疑已成为数据交换的通用格式。使用 JavaServer Pages 技术为以 XML 格式在 Web 上快速而轻易地发送数据提供了强有力的工具。
上一篇:使用Java Swing 创建一个XML编辑器(二) 人气:558
下一篇:使用Javap获得不止于文档的东西 人气:704
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 OpenPNE中文 v2.12.5 for win 中
2008-12-2 谷秋精品课程软件课程版 v2.3
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-2 toolxp.cnalexa世界排名查询 php
2008-12-2 腾讯留言板 v1.3
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成