?? 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 參數(shù)是 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 參數(shù)是 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]與數(shù)據(jù)庫對接[/b]
我們的最后一個示例是根據(jù)數(shù)據(jù)庫查詢生成 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])。這個免費產(chǎn)品使您能夠在 DB2 中存儲 XML 文檔。我們的查詢從 DB2 中提取這些文檔,然后將其傳送給用戶。
如果您使用 Oracle 8i 代替 DB2,您將會發(fā)現(xiàn)它自稱具有類似的功能(請參閱[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#resources]參考資料[/url])。對于不理解 XML 的數(shù)據(jù)庫,您可以將 XML 文檔存儲為字符大對象 (CLOB),并以文本塊的方式檢索文檔。
但是,在安裝數(shù)據(jù)庫以后,您需要完成以下三件事情才能使此代碼工作:[OL][LI]首先,將 DbOwner、DbUserid 和 DbPasswd 變量改為適合系統(tǒng)的適當值。
[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]下一步,使用適合您的系統(tǒng)的 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 語句進行硬編碼;如果根據(jù)用戶輸入[/#] [#666666]// 限制查詢,則情況會更為復雜。[/#] [#006600]String[/#] [#000066]query[/#] = [#0000ff]"select order from "[/#] + [#006600]DbOwner[/#] + [#0000ff]".sales_order_view"[/#];[/PRE][/TD][/TR][/TABLE][/LI][/OL]
在 service 方法中,我們的 servlet 連接 DB2,執(zhí)行一個查詢(其結果為一組 XML 文檔),分析查詢結果,并將分析過的數(shù)據(jù)寫入輸出流中。清單 6 顯示了與此關系最密切的代碼部分:
[b]清單 6. xmlfromdb2.java[/b] [TABLE][TR][TD][PRE] [#666666]// 我們在此處對 SQL 語句進行硬編碼;如果根據(jù)用戶輸入[/#] [#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]
要了解全部細節(jié),您可以查看[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 是向客戶發(fā)送內(nèi)容的一種偉大機制,而 XML 是發(fā)送結構化數(shù)據(jù)的一種完美機制。您還可以使用 servlet 處理服務器上的 XML 文檔,并將它們的內(nèi)容發(fā)送給客戶機。最重要的是,這兩種技術都是跨平臺技術,可為您的應用程序帶來更大的靈活性和可移值性。
[b]參考資料[/b]
[UL][LI]了解有關 [url href=http://www-4.ibm.com/software/data/db2/extenders/xmlext/index.html]DB2 XML Extender[/url] 的詳細信息。產(chǎn)品附帶的文檔中有一個深入的教程,它可幫助您將 XML 文檔帶入關系數(shù)據(jù)庫的世界中。 [LI]了解有關 [url href=http://www.oracle.com/database/oracle8i/]Oracle 數(shù)據(jù)庫產(chǎn)品[/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] 網(wǎng)站學習使用 Emacs 彩色編碼代碼清單。HTMLize 程序包可從網(wǎng)址 [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 + -