当前页面位置: » 丰搜网 » 文档中心 » 详细内容
xml——连接sql和web程序的桥梁
xml——连接sql和web程序的桥梁作者:alexander prokhorenko,olexiy prokhorenko译者:aaron chu(acdemo@gmail.com)08/22/2005版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
英文原文地址:
http://dev2dev.bea.com/pub/a/2005/06/
xml_bridge.
html中文地址:
http://www.matrix.org.cn/resource/article/43/43673_
xml_sql_
web.
html关键词:
xml sql
web摘要过去几年
xml技术作为inte
.net上交换信息的格式受到了极大的欢迎。今天
xml常常被描述成一种孤立的技术,但它最初诞生的时候却是一种(介于
html和sgml之间的)inte
.net技术。本文讨论
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)。
图1. jdbc连接池:选择
数据库可以看到多种不同
数据库可供选择。我们需要的
数据库类型(database type)是
oracle,并且将使用bea的
oracle driver(type 4)。然后点“continue”按钮定义连接属性(图2)。
图2. jdbc连接池:连接属性
在这个画面中,为jdbc连接池选择一个名字,并设置其它诸如
数据库名和主机名、连接端口和口令等
数据库参数。
这里并不创建一个新
数据库和一组表,我们将使用
oracle的示例scott/tiger
模式(schema)和emp表。几乎每个
oracle安装中都有这个示例,因此不需要你再去配置。如果没有emp表或者这个表是空的,可以用
oracle目录下的\sqlplus\demo\demobld.sql脚本重建这个表并装入数据,还可以用\sqlplus\demo\demodrop.sql删除原有的值。
配置好这些参数之后点“continue”(图3)。
图3. jdbc连接池:连接
测试一般情况不必对这一页做任何改动,这是一个连接
测试页(可以点“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)。
图4. 数据源配置成功页
要定义jdbc数据源名称和能找到数据源的地方——jndi路径。务必记住jndi路径,稍后将用它来建立一个与我们代码的连接。接下来选择“continue”,然后选择正确的连接池和数据源关联。选中刚刚创建的连接池,再点“continue”,下一页允许你选择部署数据源的
服务器和簇。从列表里选中需要的一个,接着点“create”。数据源已经创建好,我们准备写代码了。
准备独立(stand-alone)java程序的环境让我们給即将编写的小客户程序准备一个环境。为了能执行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输出所需要的全部代码(ora
xml.
java)。
1. import javax.naming.*;
2. import javax.sql.*;
3. import java.sql.*;
5. 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)給它使用。我们将用
weblogic server作为提供者,配置方法首先要建一个jndi.properties文件,然后确保可以从环境变量访问这个文件。如果classpath包含当前目录(.),就应该将jndi.properties文件放在当前目录中。这是一个jndi.properties 文件的内容:
java.naming.factory.initial=weblogic.jndi.wlinitialcontextfactory
java.naming.provider.url=t3://localhost:7001
典型的编译命令和运行结果像下面所展示的这样(注意输出被限制为不大于maxrows):
c:\white\work\java\xmlweb_src>javac oraxml.java
c:\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 num="3">
<empno>7521</empno>
<ename>ward</ename>
</person>
</employers>
现在来稍微了解一点
oracle xml-sql utility的细节。可以看出,要执行sql查询并以
xml格式输出的话,这是一个相当顺手的工具。当然,xsu绝非只有区区这么一点功能。它可以动态生成dtd(document type definition,文档类型定义),也可以执行简单的转换。xsu还可以生成
xml文档的字符串或dom表示形式;将
xml插入数据表或
视图;更新或者删除数据对象中的记录;对一个给出的
xml文档生成一组复杂的嵌套
xml文档,并在平面表上创建对象
视图,然后在这些
视图上执行查询,从而将这些文档存储到一些关系表中。 从
oracle9i开始,xsu还支持对一个sql查询生成
xml模式(schema)。还有,在生成过程中支持
xml属性。要完全搞懂如何用xsu的功能来满足你的需要请参考xsu的文档。
用xml搭桥的好处作者想强调本教程中描述的
xml转换方法的优点并解释为什么我们觉得它有用处。读者或许会这样问自己:“为什么要在这里要使用
xml?为什么将它称为‘桥’?”最好的办法是通过一个小例子来解释将
xml作为“桥”的优点。假设你现在有一个信息门户网站,设计这个门户的目的是为了将新闻从sql
数据库传达到最终用户;这些用户可能是任何人,包括使用
wap浏览器的移动电话用户,或者装备了现代浏览器的常规网上冲浪者。此外,你作为信息的所有者,可以将这些新闻转售出去,而且新闻标题要不一样,例如“news from the acme, corp.”和“latest news from big company”或者别随便的什么。而要新闻本身却是没有改变,所以,技术上只是改变了“外观(look and feel)”,那为什么要为可能收到新闻的每一类最终用户都写一次代码呢?
现在你发现自己需要某种既能接受sql又能生成不同数据格式的透明桥梁——这座桥是
xml。你编写的
servlet向
数据库提出一个请求,接收
xml输出然后将一个xsl模板应用在之上,为最终用户生成一个页面。这样需要改动的仅是一个xsl设计,没有别的东西。没有额外的代码,不会浪费时间。想和其他人共享你的新闻?主意不错,但何必允许别人访问你的sql
数据库?又何必费神解释
数据库的结构呢?——只要简单地由基本的sql查询生成并共享
xml就行了。
准备web程序的环境到这里已经成功的编写了独立程序的代码,能够执行sql查询并生成
xml文档,我们完成了一半的工作。下一步要掌握
weblogic server中将
xml转换成不同格式的选项,再构建一个
web程序。现在有许多不同的处理
xml流的技术,我们只关注其中一种——使用xslt
jsp标签(tag)的方法。
weblogic server提供这个小型
jsp标签库就是为了在
jsp中方便地访问xstl转换器。可以用它将
xml文档转换为
html、wml,以及其它格式。首先看看怎么为我们的
web程序准备一个能够利用这些工具好处的环境。
每有一个
web程序就配置一次classpath不是个好办法,所以必须将要用到的
oracle数据库jar文件放到
web程序的\
web-inf\lib目录。同时还要从
oracle的主目录把\rdbms\jlib\xsu12.jar和\lib\
xmlparserv2.jar两个jar文件拷进去。
weblogic type 4 jdbc驱动没有和
weblogic server一起被安装在主目录,但该驱动已经被自动加入到
服务器的classpath中。
使用
weblogic xml标签的过程十分简单,并且在developing
xml applications with
weblogic server站点有很好的说明文档。当然,为了读者更容易使用它,本文的二位作者会引导大家完成整个过程。
从
weblogic server的安装目录将
xmlx.zip文件拷到\bea\
weblogic81\server\ext\。我们需要上述压缩文件中的
xmlx-tags.jar文件,在命令行下将这个文件放到
web程序的\
web-inf\lib目录中:
c:\white\work\java\xmlweb\xmlweb_war\web-inf\lib>pkzipc -extract
c:\bea\weblogic81\server\ext\xmlx.zip xmlx-tags.jar
pkzip(r) version 4.00 fast! compression utility for windows
copyright 1989-2000 pkware inc. all rights reserved. shareware version
pkzip reg. u.s. pat. and tm. off. patent no. 5,051,745
masking file attributes: read-only, hidden, system, archive
extracting files from .zip: c:\bea\weblogic81\server\ext\xmlx.zip
inflating: xmlx-tags.jar
最后在
web-inf目录中还需要一个
web.
xml文件,用<taglib>标签引用
xmlx-tags.jar文件,像这样:
<web-app>
<taglib>
<taglib-uri>xmlx.tld</taglib-uri>
<taglib-location>/web-inf/lib/xmlx-tags.jar</taglib-location>
</taglib>
</web-app>
你可以查看本文附带的示例war程序了解完整的例子(译注:
xmlweb.war)。
编写web程序本节的目标是将我们学到的关于在独立程序里产生
xml的知识应用到
web程序的构建中,另外还要将
xml转换为
html。首先大致看看这个
web程序需要哪些文件。将用到的文件包括:\
web-inf\
web.
xml (前面已经提到)、
html.xls(xsl转换器用来产生
html文件的样式表)以及index.
jsp (这个
web程序的主页)。
首先考察样式表。
html.xls文件用来将转换
xml文档以输出
html文档。
<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform">
<xsl:template match="/">
<table width="60%" border="1" cellspacing="0" cellpadding="1">
<tr>
<td align="center"><b>employer no.</b></td>
<td align="center"><b>employer name</b></td>
</tr>
<xsl:apply-templates select="employers"/>
</table>
</xsl:template>
<xsl:template match="person">
<tr>
<td align="center"><xsl:value-of select="empno"/></td>
<td align="center"><xsl:value-of select="ename"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
正如在上面看到的,这个样式表匹配根元素,创建一个表格,每当与person元素的模板匹配就插入一行。利用这个文件我们可以从新的
xml文档生成
html文档。
我们这个
web程序的主要文件是index.
jsp,一个平常的
jsp文件。现在看看用到的
jsp标签,其中的xslt
jsp标签语法基于
xml。
jsp标签由一个开始标记、一个可选的主干和匹配的关闭标签组成。以<xslt>标签为例,拥有可选的(特定的)参数。比如
xml,标明想转换的
xml文件的位置(相对于
web程序的文档根目录);比如stylesheet,标明用于转换
xml文档的样式表达的位置——同样是一个相对于
web程序文档根目录的位置。要了解标签和可选项的更多信息,可以参考在线文档(using the
jsp tag to transfer
xml data)中的“xslt
jsp tag syntax”一节。现在来看
jsp文件:
1. <%@ taglib uri="xmlx.tld" prefix="x"%>
2. <html>
3. <head>
4. <title>:: an xml bridge ::</title>
5. </head>
6. <body>
7. <%@page import="java.sql.*"%>
8. <%@page import="oracle.xml.sql.query.*"%>
9. <%@page import="oracle.jdbc.*"%>
10. <%
11. string tablename = "emp";
12. int maxrows = 3;
13. context ctx = new initialcontext ();
14. datasource ds = (datasource) ctx.lookup ("myora");
15. connection conn = ds.getconnection ();
16. oraclexmlquery qu = new oraclexmlquery
(conn, "select empno, ename from " + tablename);
17. qu.setmaxrows (maxrows);
18. qu.setrowsettag ("employers");
19. qu.setrowtag ("person");
20. string xmlstring = qu.getxmlstring ();
21. conn.close ();
22. %>
23. <x:xslt stylesheet="html.xsl">
24. <x:xml>
25. <%=xmlstring%>
26. </x:xml>
27. </x:xslt>
28. </body>
29. </html>
第1行将稍后23行要用到的
xmlx标签库包含进来。7至22行是从常规
java代码到
jsp代码的转换(没有进行异常处理)。这里的语法有些小变化,此外没有别的。23到27行是实际显示的
xml代码。23行配置
xml输出并设定样式表为
html.xsl。24到26行将取自
数据库,等待转换的
xml包含进来。正如你看到的,代码很浅显。
熟悉了代码,就要准备编译我们的
web程序并部署到
weblogic server上。一个这么简单的war程序只要手工编译就可以了。下面是创建
xmlweb.war程序以备发布的步骤:
c:\white\work\java\xmlweb\xmlweb_war>jar -cvf xmlweb.war .
added manifest
adding: html.xsl(in = 579) (out= 279)(deflated 51%)
adding: index.jsp(in = 935) (out= 486)(deflated 48%)
adding: web-inf/(in = 0) (out= 0)(stored 0%)
adding: web-inf/lib/(in = 0) (out= 0)(stored 0%)
adding: web-inf/lib/xmlparserv2.jar(in = 689990) (out= 645476)(deflated 6%)
adding: web-inf/lib/xmlx-tags.jar(in = 11106) (out= 9952)(deflated 10%)
adding: web-inf/lib/xsu12.jar(in = 456545) (out= 138160)(deflated 69%)
adding: web-inf/web.xml(in = 327) (out= 226)(deflated 30%)
现在,找到编译好的
web程序war文件并部署到
weblogic server。这可以利用
weblogic控制台做到。部署好后在
web浏览器中打开下面这个地址查看结果:
http://localhost:7001/
xmlweb/index.
jsp应该能看到类似图5的情形。
图5. 部署
web程序
正如上图展示的,从
数据库中以
xml形式获取的数据按漂亮的格式显示了出来。现在我们可以在很多地方用到这种技术,从简单的新闻聚合(news feed)到有模板和样式表的复杂列表引擎。
结语本教程为读者奉上了整合sql查询和
xml转换器的基础知识,給出了一个可以用在你自己软件中的特性。
xml技术本身在
web程序方面有许多用处,而与
数据库的整合使它成为更强大的工具。
下载本文中的独立
java程序:
xmlweb_src.zip:[下载文件]
文中的
web程序:
xmlweb.war:[下载文件]
作者介绍alexander prokhorenko 是一位经过认证的专业人员,获得sun系统管理员认证和sun
java程序员认证。他的兴趣领域包括系统开发生命周期、it项目管理、
服务器和应用程序架构。
olexiy prokhorenko 是一位sun认证企业架构师,同样获得了sun
java程序员认证和sun
web组件开发者认证。他的兴趣领域包括
web软件架构、高频变更需求的软件开发,以及异地外包团队的管理。