摘要
过去几年xml技术作为internet上交换信息的格式受到了极大的欢迎。今天xml常常被描述成一种孤立的技术,但它最初诞生的时候却是一种(介于html和sgml之间的)internet技术。本文讨论xml如何被用作数据库和最终用户间的“通讯协议”。
当前最流行的关系数据库管理系统用sql查询语言来与数据打交道。虽然面向xml(xml-oriented)的数据库已经面市,却不常见。而xml如此流行,关系数据库开发者也在为产品增加xml兼容性的过程中学习进步。本文考察其中一种途径:让数据库返回xml。示范代码中用到了一个oracle数据库,它被假定是xml兼容的,能处理xml数据。
本文分为两部分。第一部分预备和oracle数据库打交道的java代码:提交一个sql查询,获取一个xml输出;第二部分专注于一个web程序:将从数据库获取的xml数据输出为html文本。
要求
本文中用到下列软件:
bea weblogic platform 8.1 with sp4 ――作应用程序服务器。
oracle 10g database server ――作数据库服务器。你可以用不同版本的服务器来试验代码;据我们所知,本方案不需要特定的版本。
oracle xml-sql utility (xsu) ――xsu是一组充当pl/sql包装(wrapper)的java类,它允许查询返回xml包装起来的结果集或对象。
oracle xml parser, version 2 ――oracle的基于java校验xml有效性的解析器(parser),支持xsl。一般来讲xsu和xml解析器是oracle developer suite的一部分。
本文中的代码在微软windows xp系统上运行,但只需要很小的改动也应该能在任何操作系统上正确工作。
我们假定读者是有经验的java开发者,熟悉bea weblogic server,并且有jdbc编程经验。
准备连接池(connection pool)和数据源
如果你熟悉jdbc连接池和数据源的配置,请跳过这一节。
首先需要配置连接池和数据源。代码稍后会用jndi来获取数据源,这需要一点配置。我们要配置一个jdbc连接池来保持和数据库的连接。登入weblogic的控制台并选择service configurations -> jdbc -> connection pools节点。
现在选择“configure a new jdbc connection pool...”以创建一个新的连接池,在接下来的画面里选择数据库类型和驱动(图1)。

可以看到多种不同数据库可供选择。我们需要的数据库类型(database type)是oracle,并且将使用bea的oracle driver(type 4)。然后点“continue”按钮定义连接属性(图2)。

在这个画面中,为jdbc连接池选择一个名字,并设置其它诸如数据库名和主机名、连接端口和口令等数据库参数。
这里并不创建一个新数据库和一组表,我们将使用oracle的示例scott/tiger模式(schema)和emp表。几乎每个oracle安装中都有这个示例,因此不需要你再去配置。如果没有emp表或者这个表是空的,可以用oracle目录下的/sqlplus/demo/demobld.sql脚本重建这个表并装入数据,还可以用/sqlplus/demo/demodrop.sql删除原有的值。
配置好这些参数之后点“continue”(图3)。

一般情况不必对这一页做任何改动,这是一个连接测试页(可以点“skip this step”跳过)。weblogic server显示了驱动类名、(jdbc驱动使用的)url和身份验证(用户名和密码)以供核对。复核完这些参数后准备测试,点“test driver configuration”按钮,如果一切正确,将看到“connection successful”的信息。最后点“create and deploy”按钮完成jdbc连接池配置。
完成了jdbc连接池的工作,现在我们需要创建相应的数据源。回到weblogic server控制台的主页,按照这个顺序选择:service configurations -> jdbc -> data source。在接下来的画面中点击“configure a new jdbc data source”链接,将看到数据源配置成功页(图4)。

要定义jdbc数据源名称和能找到数据源的地方――jndi路径。务必记住jndi路径,稍后将用它来建立一个与我们代码的连接。接下来选择“continue”,然后选择正确的连接池和数据源关联。选中刚刚创建的连接池,再点“continue”,下一页允许你选择部署数据源的服务器和簇。从列表里选中需要的一个,接着点“create”。数据源已经创建好,我们准备写代码了。
准备独立(stand-alone)java程序的环境
让我们?o即将编写的小客户程序准备一个环境。为了能执行sql查询和获取xml数据作为输出,将用到oracle xml-sql utility (xsu),需要配置环境变量classpath指向oracle xml-sql utility的库(library)和oracle xml解析器。一般情况下xsu可以在oracle的目录/rdbms/jlib/xsu12.jar找到,xml 解析器在/lib/xmlparserv2.jar。还有我们在使用jndi,需要在classpath中包括weblogic.jar文件,一般在weblogic server的安装目录下:/bea/weblogic81/server/lib/weblogic.jar。
典型的classpath 看起来会像下面这样:
classpath=c:/program files/java/jdk1.5.0_01/lib;.;
c:/devsuitehome/rdbms/jlib/xsu12.jar;
c:/devsuitehome/lib/xmlparserv2.jar;
c:/bea/weblogic81/server/lib/weblogic.jar;
考察独立java程序的代码
在展示代码前,注意到oracle中有两种处理xml的方法是有意义的。二者的区别很大,你应该采用适合你手头任务的办法。第一种办法是用oracle的xsu,允许从任何sql查询返回xml;第二种办法是用oracle的xmltype列类型(column type)。
xmltype列允许将xml当做数据库中的一种本地数据类型。因此,这些列可以像其它类型的列一样参与查询consequently。oracle提供了xmltype()函数来创建一个xmltype数据对象,同时还提供了其它处理这个数据类型的函数,比如xmlelement()和xmlagg()。从weblogic server的在线文档(the oracle driver)或技术网站(oracle technology network)可以读到关于这种办法的说明和示例。本文将专注于使用xsu的方法。
下面是在oracle数据库上执行sql查询并产生xml输出所需要的全部代码(oraxml.java)。
1. import javax.naming.*;
2. import javax.sql.*;
3. import java.sql.*;
4. import oracle.xml.sql.query.*;
5. public class oraxml
6. {
7. public static void main(string args[]) throws sqlexception, namingexception
8. {
9. string tabname = "emp";
10. int maxrows = 3;
11. context ctx = new initialcontext ();
12. datasource ds = (datasource) ctx.lookup ("myora");
13. connection conn = ds.getconnection ();
14. oraclexmlquery qu = new oraclexmlquery ( conn, "select empno, ename from " + tabname);
15. qu.setmaxrows (maxrows);
16. qu.setrowsettag ("employers");
17. qu.setrowtag ("person");
18. string xmlstring = qu.getxmlstring();
19. system.out.println (xmlstring);
20. conn.close ();
21. }
22. }
这段代码很简单。11-12行获取一个jndi名称为myora的数据源;13和20行分别建立和关闭连接;最有意思的是14-18行执行了一个所谓的“xml查询”;从技术上讲,这是一个经xsu转换为xml的sql查询;14行初始化查询;15-17行设置xml文档的结构,15行设定返回的最大行数不超过maxrows,16和17行设定文档的根元素(root element)和项目分隔符(item delimiters);18行生成一个xml文档并将其放在xmlstring变量中。就像你看到的这样,代码很简单易懂。(英文编者注:注意,这不是成品代码。最后应该在一个finally语句的括号中关闭连接。)
别忘记这段代码中用到了jndi。作为一个独立的java程序,必须安排一个命名提供者(naming provider)?o它使用。我们将用weblogic server作为提供者,配置方法首先要建一个jndi.properties文件,然后确保可以从环境变量访问这个文件。如果classpath包含当前目录(.),就应该将jndi.properties文件放在当前目录中。这是一个jndi.properties 文件的内容:
java.naming.factory.initial=weblogic.jndi.wlinitialcontextfactoryjava.naming.provider.url=t3://localhost:7001
典型的编译命令和运行结果像下面所展示的这样(注意输出被限制为不大于maxrows):
c:/white/work/java/xmlweb_src>javac oraxml.javac:/white/work/java/xmlweb_src>java oraxml<?xml version = '1.0'?><employers> <person num="1"> <empno>7369</empno> <ename>smith</ename> </person> <person num="2"> <empno>7499</empno> <ename>allen</ename> </person> <person n
闽公网安备 35060202000074号