选择显示字体大小

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查询语言来与数据打交道。虽然面向xmlxml-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;第二种办法是用oraclexmltype列类型(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.*;
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=&quot;1&quot;>
      <empno>7369</empno>
      <ename>smith</ename>
   </person>
   <person num=&quot;2&quot;>
      <empno>7499</empno>
      <ename>allen</ename>
   </person>
   <person num=&quot;3&quot;>
      <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转换方法的优点并解释为什么我们觉得它有用处。读者或许会这样问自己:&ldquo;为什么要在这里要使用xml?为什么将它称为&lsquo;桥&rsquo;?&rdquo;最好的办法是通过一个小例子来解释将xml作为&ldquo;桥&rdquo;的优点。假设你现在有一个信息门户网站,设计这个门户的目的是为了将新闻从sql数据库传达到最终用户;这些用户可能是任何人,包括使用wap浏览器的移动电话用户,或者装备了现代浏览器的常规网上冲浪者。此外,你作为信息的所有者,可以将这些新闻转售出去,而且新闻标题要不一样,例如&ldquo;news from the acme, corp.&rdquo;和&ldquo;latest news from big company&rdquo;或者别随便的什么。而要新闻本身却是没有改变,所以,技术上只是改变了&ldquo;外观(look and feel)&rdquo;,那为什么要为可能收到新闻的每一类最终用户都写一次代码呢?

现在你发现自己需要某种既能接受sql又能生成不同数据格式的透明桥梁&mdash;&mdash;这座桥是xml。你编写的servlet数据库提出一个请求,接收xml输出然后将一个xsl模板应用在之上,为最终用户生成一个页面。这样需要改动的仅是一个xsl设计,没有别的东西。没有额外的代码,不会浪费时间。想和其他人共享你的新闻?主意不错,但何必允许别人访问你的sql数据库?又何必费神解释数据库的结构呢?&mdash;&mdash;只要简单地由基本的sql查询生成并共享xml就行了。

准备web程序的环境
到这里已经成功的编写了独立程序的代码,能够执行sql查询并生成xml文档,我们完成了一半的工作。下一步要掌握weblogic server中将xml转换成不同格式的选项,再构建一个web程序。现在有许多不同的处理xml流的技术,我们只关注其中一种&mdash;&mdash;使用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=&quot;1.0&quot; ?>
<xsl:stylesheet version=&quot;1.0&quot;  xmlns:xsl=&quot;http://www.w3.org/1999/xsl/transform&quot;>

<xsl:template match=&quot;/&quot;>

<table width=&quot;60%&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;1&quot;>
<tr>
<td align=&quot;center&quot;><b>employer no.</b></td>
<td align=&quot;center&quot;><b>employer name</b></td>
</tr>

<xsl:apply-templates select=&quot;employers&quot;/>

</table>


</xsl:template>

<xsl:template match=&quot;person&quot;>

<tr>
<td align=&quot;center&quot;><xsl:value-of select=&quot;empno&quot;/></td>
<td align=&quot;center&quot;><xsl:value-of select=&quot;ename&quot;/></td>
</tr>

</xsl:template>

</xsl:stylesheet>


正如在上面看到的,这个样式表匹配根元素,创建一个表格,每当与person元素的模板匹配就插入一行。利用这个文件我们可以从新的xml文档生成html文档。

我们这个web程序的主要文件是index.jsp,一个平常的jsp文件。现在看看用到的jsp标签,其中的xslt jsp标签语法基于xmljsp标签由一个开始标记、一个可选的主干和匹配的关闭标签组成。以<xslt>标签为例,拥有可选的(特定的)参数。比如xml,标明想转换的xml文件的位置(相对于web程序的文档根目录);比如stylesheet,标明用于转换xml文档的样式表达的位置&mdash;&mdash;同样是一个相对于web程序文档根目录的位置。要了解标签和可选项的更多信息,可以参考在线文档(using the jsp tag to transfer xml data)中的&ldquo;xslt jsp tag syntax&rdquo;一节。现在来看jsp文件:

1. <%@ taglib uri=&quot;xmlx.tld&quot; prefix=&quot;x&quot;%>

2. <html>
3. <head>
4. <title>:: an xml bridge ::</title>
5. </head>
6. <body>

7. <%@page import=&quot;java.sql.*&quot;%>
8. <%@page import=&quot;oracle.xml.sql.query.*&quot;%>
9. <%@page import=&quot;oracle.jdbc.*&quot;%>

10. <%

11.        string tablename = &quot;emp&quot;;
12.        int maxrows = 3;

13.        context ctx = new initialcontext ();
14.        datasource ds = (datasource) ctx.lookup (&quot;myora&quot;);

15.        connection conn = ds.getconnection ();

16.        oraclexmlquery qu = new oraclexmlquery
      (conn, &quot;select empno, ename from &quot; + tablename);

17.        qu.setmaxrows (maxrows);
18.        qu.setrowsettag (&quot;employers&quot;);
19.        qu.setrowtag (&quot;person&quot;);

20.        string xmlstring = qu.getxmlstring ();

21.        conn.close ();
22. %>

23. <x:xslt stylesheet=&quot;html.xsl&quot;>  
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软件架构、高频变更需求的软件开发,以及异地外包团队的管理。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons