日期:2014-03-13  浏览次数:20978 次

XML 和 JSP 是当今最流行的话题。 这篇文章引导你如何运用这两种技术去创建动态Web站点。用XML文件去储存数据,用JSP文件去显示它。同时还可以了解DOM, XPath, XSL等其它 Java-XML技术。。

作者 Alex Chaffee

我先假设读者与其他大多数Java 程序员一样,对JSP(JavaServer Pages )和XML(Extensible Markup Language)有一定的了解,但是不清楚如何运用它们。在这篇文章中,您将学习如何用XML设计一个系统。许多网站都有大量的格式各异的数据,它们的表现方式或多或少的都没有遵照一定的标准。而我在此推荐用这样一种方法来设计网站,即用XML文件保存数据,用JSP文件显示这些数据。

想必大家都曾经知道了HTML的局限性了把。随着站点的发展,需求一种方法来共享和交换数据。不管是内容出售,订单处理,还是报表生成,都需求对数据进行定义。XML正好可以发挥作用,其他的使用只能阅读和翻译信息,而XML可以赋予数据以意义。也许你会觉得奇怪,为什么要用XML来储存数据,而不用数据库呢?答案是在很多使用方面,数据库显的太“猛”了一点。为了要使用数据库,你必需要安装和支持一个独立的服务器处理,安装DBMS,建立DBA,并且还要去学习SQL言语,学会如何写查询语句并把结果前往。但是如果你使用XML文件,你不必去为预备额外的数据库Server而花费,且好处是可以很简单的编辑处理数据,就象是用一个文本编辑器一样,而不是复杂的数据库管理工具。XML文件也十分容易备份,共享和下载,以及通过FTP上传新数据至网站。

XML的另一个稍稍笼统的优点是采用了层次结构而不是关系结构来定义数据,可以依据需求直接了当的设计使用的数据结构,也不必使用实体关系设计器去进行模式的规范化操作。如果您有一个成员包含另一个成员,您可以通过层次结构直接表示出来,而不用使用连接表。从这种意义上说XML有利于信息的表达和结构化组织,可以精确定义数据,从而使数据搜索更无效。

对于许多使用来说,文件系统是没有足够的能力满足需求。当有大量的数据需求更新时,它的弱点就暴露了。并发写操作的冲突等是大问题。数据库有良好的事务处理机能,丰富的索引与复杂查询功用,完全可以为数据库提供一个包装器,以便将创建查询并将它们转化成XML流。这样XML就变成了一个强大的且编程敌对的数据库前端部件(Oracles XSQL servlet是一个实现的例子)。

用XML来定义数据 :在线相册的例子

每团体都喜欢照片。互联网是个工具可以展现本人,朋友,充物及各种活动。这个例子以定义一个简单照片对象为主(源代码可以从参考材料处获得)。展现了定义一个照片对象所需求的属性有:标题,日期,简短说明以及图像的位置。

定义一幅图像需求的属性:

图像文件(GIF or JPEG)的位置

图像的高度(像素)

图像的宽度(像素)

在这里把文件系统当作数据库来存储信息有一个简约的优点,即图像文件和数据描叙文件可以保存在同一位置下。

最后用一个元从来定义小照片图像(thumbnail images)集来扩充相片记录的定义,以便在任何地方使用。

XML来定义照片的例子如下:

<picture>
<title>Alex On The Beach</title>
<date>1999-08-08</date>
<caption>Trying in vain to get a tan</caption>
<image>
<src>alex-beach.jpg</src>
<width>340</width>
<height>200</height>
</image>
<thumbnails>
<image>
<src>alex-beach-sm.jpg</src>
<width>72</width>
<height>72</height>
</image>
<image>
<src>alex-beach-med.jpg</src>
<width>150</width>
<height>99</height>
</image>
</thumbnails>
</picture>

使用XML,可以把所有的关于一幅照片的信息放入一个简单的文件,而不放在分散的表里。这个文件称为pix文件。这样文件系统就如下面的样子所示。

summer99/alex-beach.pix
summer99/alex-beach.jpg
summer99/alex-beach-sm.jpg
summer99/alex-beach-med.jpg
summer99/alex-snorkeling.pix
etc.
有好几种办法可以把XML数据与JSP页面结合起来。下面列出了几种办法:

DOM: 用类实现DOM接口来分析与检视XML文件
XMLEntryList: 把XML加载进 java.util.List 的name-value对
XPath: 用 XPath 处理器 (就象Resin一样) 通过路径名来定位XML中的元素
XSL: 用 XPath 处理器来转化XML为HTML
Cocoon: 使用开放代码的Cocoon框架
Roll your own bean: 可以写一个包装类加载数据进入一个的定制JavaBean
这些方法能很好地等同运用在客户端或使用程序服务器端接受XML流时。

Java Server Pages


JSP有很多实现版本, 不同的JSP版本实现了不同的且互不兼容的规格.作者在这里选用的是Tomcat, 基于如下的几点理由:

它支持最新的JSP 和 Servlet 规格
Sun和Apache认可它
你可以单独运转它而不用单独配置一个Web服务器
它的源码开放
(关于Tomcat的更多信息, 请看参考材料.)

你可以随便选用你喜欢的JSP引擎,但需求你本人配置它。一定要确认所选用的引擎支持JSP1.0规格。从0.91到1.0的版本有很多地方不一样。只需JSWDK (Java Server Web Development Kit) 能正常任务就可以了。

JSP 结构

当结构一个基于JSP驱动的WEB站点时,建议将公用函数,导入模块,常量和变量定义放在一个独立的名为init.jsp的文件里。然后用<%@include file="init.jsp"%>的方式把它添进每个JSP文件中。<%@include%>指示的作用类似于C言语的#include定义符,将被包含文件(例如init.jsp)作为包含文件(例如picture.jsp)的内容一同进行编译。留意,作为比较, <jsp:include>标志指示编译器将它作为一个独立的JSP文件编译,并在被编译好的JSP中嵌入对它的调用。

查找文件

当启动JSP时,在初始化任务结束之后的第一件事是查找所需求的XML文件。怎样知道需求哪些文件呢?答案是以CGI程序方式来传递所需求的参数。用户可以通过URL picture.jsp?file=summer99/alex-beach.pix的方式或用HTML的form对象来传递文件参数。

当JSP收到参数之后,你还得知道 filesystem的根目录位于什么地方。在UNIX系统之下,文件位置是以/home/alex/public_html/pictures/summer99/alex-beach.pix方式来指定的。JSP在执行时是没有绝对路径的概念的,所以必须在java.io包内提供绝对路径。

依据所采用JSP 或 Servlet的版本,Servlet APT函数提供了转换URL路径为绝对路径的方法。ServletContext.getRealPath(String)是实现的窍门。每个JSP版本都有个 ServletContext对象(称为application)。因此代码可以象下面的样子:

String picture