📄 servlet 和 xml:互为补充(二)(转).txt
字号:
作者:zergman
email: zergman@chinaasp.com
日期:2001-6-15 13:58:03
[b]清单 5. printDOMTree[/b] [TABLE][TR][TD][PRE] [#993333]if[/#] (requestedSubtree.equalsIgnoreCase([#0000ff]"author"[/#])) printDOMTree(author, out); [#993333]else[/#] [#993333]if[/#] (requestedSubtree.equalsIgnoreCase([#0000ff]"lines"[/#])) printDOMTree(lines, out); [#993333]else[/#] [#993333]if[/#] (requestedSubtree.equalsIgnoreCase([#0000ff]"title"[/#])) printDOMTree(title, out); [#993333]else[/#] printDOMTree(doc, out);[/PRE][/TD][/TR][/TABLE]
如果 subtree 参数是 author,则结果是:[TABLE][TR][TD][PRE] <author>[#0000ff] [/#]<last-name>[#0000ff]Shakespeare[/#]</last-name>[#0000ff] [/#]<first-name>[#0000ff]William[/#]</first-name>[#0000ff] [/#]<nationality>[#0000ff]British[/#]</nationality>[#0000ff] [/#]<year-of-birth>[#0000ff]1564[/#]</year-of-birth>[#0000ff] [/#]<year-of-death>[#0000ff]1616[/#]</year-of-death>[#0000ff] [/#]</author>[/PRE][/TD][/TR][/TABLE]
如果 subtree 参数是 title,则结果是:[TABLE][TR][TD][PRE]<title>[#0000ff]Sonnet 130[/#]</title>[/PRE][/TD][/TR][/TABLE]
您可以查看[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/xmlfromdom-src.html]完整清单的 HTML 视图[/url]或直接查看 [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/xmlfromdom.java]Java 源文件[/url]。
[b]与数据库对接[/b]
我们的最后一个示例是根据数据库查询生成 XML。有许多方法可做到这一点(请参阅 developerWorks 的文章 [url href=http://www-4.ibm.com/software/developer/library/buildappl/genxml.html]Generating XML from a Data Store[/url]);对于本例而言,我们将使用 IBM 的 XML Extender for DB2(请参阅[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#resources]参考资料[/url])。这个免费产品使您能够在 DB2 中存储 XML 文档。我们的查询从 DB2 中提取这些文档,然后将其传送给用户。
如果您使用 Oracle 8i 代替 DB2,您将会发现它自称具有类似的功能(请参阅[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#resources]参考资料[/url])。对于不理解 XML 的数据库,您可以将 XML 文档存储为字符大对象 (CLOB),并以文本块的方式检索文档。
但是,在安装数据库以后,您需要完成以下三件事情才能使此代码工作:[OL][LI]首先,将 DbOwner、DbUserid 和 DbPasswd 变量改为适合系统的适当值。
[TABLE][TR][TD][PRE] [#666666]/////////////////////////////////////////////////////////////////[/#] [#666666]// 一定要正确更改这三个字符串,否则 //[/#] [#666666]// servlet 不会工作。 //[/#] [#666666]/////////////////////////////////////////////////////////////////[/#] [#006600]DbUserid[/#] = [#0000ff]"xxxxxxxx"[/#]; [#006600]DbPasswd[/#] = [#0000ff]"xxxxxxxx"[/#]; [#006600]DbOwner[/#] = [#0000ff]"xxxxxxxx"[/#]; [/PRE][/TD][/TR][/TABLE]
[LI]下一步,使用适合您的系统的 JDBC 驱动程序。我们在使用 DB2。
[TABLE][TR][TD][PRE] [#993333]static[/#] [#006600]String[/#] [#006600]JDBCDriver[/#] = [#0000ff]"COM.ibm.db2.jdbc.app.DB2Driver"[/#]; ... [#993333]try[/#] { Class.forName([#0000ff]"COM.ibm.db2.jdbc.app.DB2Driver"[/#]).newInstance(); } [#993333]catch[/#] ([#006600]Exception[/#] [#000066]e[/#]) { System.out.println([#0000ff]"Can't get the driver!"[/#]); e.printStackTrace(); }[/PRE][/TD][/TR][/TABLE]
[LI]如果你愿意,可以改掉下面的 SQL 查询语句。为了简化示例,此处仅检索 sales_order_view 表的 order 列中的全部 XML 文档。
[TABLE][TR][TD][PRE] [#666666]// 我们在此处对 SQL 语句进行硬编码;如果根据用户输入[/#] [#666666]// 限制查询,则情况会更为复杂。[/#] [#006600]String[/#] [#000066]query[/#] = [#0000ff]"select order from "[/#] + [#006600]DbOwner[/#] + [#0000ff]".sales_order_view"[/#];[/PRE][/TD][/TR][/TABLE][/LI][/OL]
在 service 方法中,我们的 servlet 连接 DB2,执行一个查询(其结果为一组 XML 文档),分析查询结果,并将分析过的数据写入输出流中。清单 6 显示了与此关系最密切的代码部分:
[b]清单 6. xmlfromdb2.java[/b] [TABLE][TR][TD][PRE] [#666666]// 我们在此处对 SQL 语句进行硬编码;如果根据用户输入[/#] [#666666]// 限制查询,则情况会更为复杂。[/#] [#006600]String[/#] [#000066]query[/#] = [#0000ff]"select order from "[/#] + [#006600]DbOwner[/#] + [#0000ff]".sales_order_view"[/#]; res.setContentType([#0000ff]"text/xml"[/#]); [#993333]try[/#] { [#006600]ConInfo[/#] [#000066]index[/#] = [#993333]new[/#] [#006600]ConInfo[/#](); [#006600]Connection[/#] [#000066]con[/#] = getCon(index); [#006600]Statement[/#] [#000066]stmt[/#] = con.createStatement(); [#006600]ResultSet[/#] [#000066]rs[/#] = stmt.executeQuery(query); ... [#666666]// 显示结果集。我们从每行取出 XML 文档,[/#] [#666666]// 对其进行分析,然后打印 DOM 树。当没有更多的行时,rs.next() 返回[/#] [#666666]// false。[/#] [#993333]while[/#] (rs.next()) { [#006600]String[/#] [#000066]nextOrder[/#] = rs.getString(1).trim(); [#006600]Document[/#] [#000066]doc[/#] = [#990099]null[/#]; [#006600]StringReader[/#] [#000066]sr[/#] = [#993333]new[/#] [#006600]StringReader[/#](nextOrder); [#006600]InputSource[/#] [#000066]iSrc[/#] = [#993333]new[/#] [#006600]InputSource[/#](sr); [#993333]try[/#] { parser.parse(iSrc); doc = parser.getDocument(); } [#993333]catch[/#] ([#006600]Exception[/#] [#000066]e[/#]) { System.err.println([#0000ff]"Sorry, an error occurred: "[/#] + e); } [#993333]if[/#] (doc != [#990099]null[/#]) printDOMTree(doc, out); }[/PRE][/TD][/TR][/TABLE]
要了解全部细节,您可以查看[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/xmlfromdb2-src.html]完整清单的 HTML 视图[/url]或直接查看[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/xmlfromdb2.java]Java 源文件[/url]。
[b]小结[/b]
尽管这些 servlet 示例中没有一个可以改变世界,但它们确实展示了 XML 和 servlet 配合得有多么好。Servlet 是向客户发送内容的一种伟大机制,而 XML 是发送结构化数据的一种完美机制。您还可以使用 servlet 处理服务器上的 XML 文档,并将它们的内容发送给客户机。最重要的是,这两种技术都是跨平台技术,可为您的应用程序带来更大的灵活性和可移值性。
[b]参考资料[/b]
[UL][LI]了解有关 [url href=http://www-4.ibm.com/software/data/db2/extenders/xmlext/index.html]DB2 XML Extender[/url] 的详细信息。产品附带的文档中有一个深入的教程,它可帮助您将 XML 文档带入关系数据库的世界中。 [LI]了解有关 [url href=http://www.oracle.com/database/oracle8i/]Oracle 数据库产品[/url]的详细信息。 [LI]试用 WebSphere 附带的免费 [url href=http://www.software.ibm.com/webservers/appserv/tutorial.html]servlet 教程[/url]。 [LI]通过 developerWorks 的 [url href=http://www.cn.ibm.com/developerWorks/education/xml/xmljava/index.html]XML programming in Java[/url] 教程深入研究如何分析 XML 文件。 [LI]下载作者为 City Java 用户组制作的演示文稿的 [url href=ftp://www6.software.ibm.com/software/developer/library/xmlservlet.pdf]PDF[/url] 版本。 [LI]在 [url href=http://www.gnu.org/software/emacs/emacs.html]www.gnu.org[/url] 网站学习使用 Emacs 彩色编码代码清单。HTMLize 程序包可从网址 [url href=http://jagor.srce.hr/~hniksic/htmlize.el]jagor.srce.hr[/url] 获得。[/LI][/UL]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -