?? servlet 和 xml:互為補充(一)(轉).txt
字號:
作者:zergman
email: zergman@chinaasp.com
日期:2001-6-15 13:57:18
[TABLE] [TD] [#FFFFFF] [b]Download it now![/b][/#] [/TD] [/TR] [TR] [TD] [url href=ftp://www6.software.ibm.com/software/developer/library/servlets-and-xml.pdf][B]PDF[/B][/url] (79.4 KB)
[url href=http://www.adobe.com/prodindex/acrobat/readstep.html]Free Acrobat™ Reader[/url] [/TD] [/TR]-->[TR][TD][url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index_eng.shtml][img]http://www.cn.ibm.com/developerWorks/i/src.jpg[/img][/url] [/TD][/TR][/TABLE]
[b]Servlet 和 XML:互為補充[/b]
Doug Tidwell
developerWorks 職員
2000 年 4 月
[TABLE][TR][TD][#ffffff][B]內容:[/B][/#][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#2]我們的第一個 servlet 示例[/url][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#3]一個基本的 servlet[/url][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#4]生成 XML 段[/url][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#5]與數據庫對接[/url][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#6]小結[/url][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#resources]參考資料[/url][/TD][/TR][TR][TD] [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#author]作者簡介[/url][/TD][/TR][TR][TD][img]http://www.cn.ibm.com/developerWorks/i/c.gif[/img][/TD][/TR][/TABLE]
[BLOCKQUOTE]研究 Java servlet 和 XML 如何共同生成 XML 文檔和 DOM 樹,以及它們如何與數據庫對接。本文包括幾項有用的技術:使用 HTTP 參數控制 DOM 樹的處理與生成,而無需 XML 源文檔。[/BLOCKQUOTE]
對 Java 程序員來說,Servlet 和 XML 是最令人振奮的兩項技術。本文是為 2000 年 2 月 17 日舊金山 City Java 用戶組準備的演示文稿。在本文中您將看到如何使用 servlet 組成一個簡單的 XML 文檔,構建一個 DOM 樹,并將部分內容顯示在用戶屏幕上,最后您將看到如何從一個數據庫查詢生成 XML。
對于本文討論的示例來說,我們將擴展 HTTPServlet 類。HTTPServlet 類提供了通常與 CGI 程序相關的功能。它支持 put 和 get,并且使您的代碼具有對 HTTP 請求標頭的完全訪問權,包括 UserAgent 域。我們將創建一些簡單的 servlet,并說明它們如何處理以 XML 標簽標記的信息。在這一過程中我們還將說明文檔對象模型 (DOM) 的一些方法。這些簡單的應用程序將使您了解當將 servlet 和 XML 組合在一起時您能夠做哪些事情。
[b]第一個 servlet 示例[/b]
作為開始,我們將編寫一個用來生成 XML 文檔的 10 行 servlet。在構建理解 XML 的 servlet 時,我們將按以下三個步驟進行: [OL][LI]將內容類型設為 text/xml。 [LI]創建 XML 文檔。 [LI]將 XML 文檔寫回客戶機。 [/LI][/OL]
在我們的大多數 Servlet 中,主要精力放在第二步。我們可能根據數據庫查詢創建一個 XML 文檔,也可能基于從客戶傳送來的 HTTP 參數生成它,或者也可能使用其他類型的數據檢索或生成方法。在本文的示例中,將主要考慮 HTTP 參數和數據庫查詢。
[b]一個基本的 servlet[/b]
對于第一個示例,第二步“創建 XML 文檔”[I]不是[/I]我們所關心的;我們只想生成一個有效的 XML 文檔。我們已將文檔硬編碼到源代碼中,如清單 1 所示。[TABLE][TR][TD]Color-coding our colorful coding[/b] -->
[B]彩色編碼[/B]
彩色編碼清單是本文的一個特色,我們正在 dW 進行試驗。為了生成我們的彩色編碼清單,我正在使用一些開放源代碼的工具。首先,我將文檔(Java、HTML、XML 等)載入 Emacs 中。Emacs 定義了關鍵字、注釋、函數名以及其他編程語言構件(大約有十多種)的顏色。在 Emacs 載入文件并為其加上顏色以后,我使用 HTMLize 程序包,這是一種用曾經流行的 Emacs Lisp 語言編寫的開放源代碼實用工具。HTMLize 接收一個清單(這個清單看起來與在 Emacs 中完全一樣),然后將其轉換為 HTML。結果將是一個完全彩色編碼的文件,它突出顯示關鍵字、注釋、函數名等。
請告拆我們您對這些新的、改進的代碼清單的想法。
如果您也想這樣做,請參閱[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/index.shtml#resources]參考資料[/url]中的相應鏈接。[/TD][/TR][/TABLE]
[b]清單 1. xmlfromscratch.java[/b] [TABLE][TR][TD][PRE][#993333]public[/#] [#993333]class[/#] [#006600]xmlfromscratch[/#] [#993333]extends[/#] [#006600]HttpServlet[/#] { [#993333]public[/#] [#006600]void[/#] [#666633]service[/#]([#006600]HttpServletRequest[/#] [#000066]request[/#], [#006600]HttpServletResponse[/#] [#000066]response[/#]) [#993333]throws[/#] [#006600]IOException[/#], [#006600]ServletException[/#] { response.setContentType([#0000ff]"text/xml"[/#]); [#006600]PrintWriter[/#] [#000066]out[/#] = response.getWriter(); out.println([#0000ff]"<?xml version=\"1.0\"?>"[/#]); out.println([#0000ff]"<greeting language=\"en_US\">"[/#]); out.println([#0000ff]" Hello, World!"[/#]); out.println([#0000ff]"</greeting>"[/#]); }}[/PRE][/TD][/TR][/TABLE]
這一段令人興奮的代碼生成的結果如下所示:
[b]清單 2. xmlfromscratch.java 的結果[/b] [TABLE][TR][TD][PRE][#993333]<?[/#][#006600]xml version="1.0"[/#][#993333]?>[/#]<greeting>[#0000ff] Hello, World![/#]</greeting>[/PRE][/TD][/TR][/TABLE]
您可以查看[url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/xmlfromscratch-src.html]完整清單的 HTML 視圖[/url]或直接查看 [url href=http://www.cn.ibm.com/developerWorks/java/servlets-and-xml/xmlfromscratch.java]Java 源文件[/url]。
[b]生成 XML 段[/b]
現在,我們已經創建了一個 servlet,它通過硬編碼生成一個沒有意義的簡單 XML 文檔。在下一個 servlet 中,我們從零開始生成一個 DOM 樹,然后將 DOM 樹的一部分顯示在請求者的屏幕上。向請求者發送回的 DOM 樹部分取決于 servlet 接收到的 HTTP 參數。本例展示了幾項有用的技術:使用 HTTP 參數控制 DOM 樹的處理與生成,而無需 XML 源文檔。
清單 3 顯示了處理 HTTP 參數的代碼段:
[b]清單 3. xmlfromdom.java[/b] [TABLE][TR][TD][PRE] [#993333]public[/#] [#006600]void[/#] [#666633]service[/#]([#006600]HttpServletRequest[/#] [#000066]request[/#], [#006600]HttpServletResponse[/#] [#000066]response[/#]) [#993333]throws[/#] [#006600]IOException[/#], [#006600]ServletException[/#] { response.setContentType([#0000ff]"text/xml"[/#]); [#006600]PrintWriter[/#] [#000066]out[/#] = response.getWriter(); [#006600]Enumeration[/#] [#000066]keys[/#]; [#006600]String[/#] [#000066]key[/#]; [#006600]String[/#] [#000066]requestedSubtree[/#] = [#0000ff]""[/#]; keys = request.getParameterNames(); [#993333]while[/#] (keys.hasMoreElements()) { key = ([#006600]String[/#]) keys.nextElement(); [#993333]if[/#] (key.equalsIgnoreCase([#0000ff]"subtree"[/#])) requestedSubtree = request.getParameter(key); }[/PRE][/TD][/TR][/TABLE]
正如在上一個示例中那樣,我們將內容類型設置為 text/xml。在此之后,我們使用 HttpServletRequest.getParameterNames 方法從 HTTP 請求中檢索所有參數。
在處理完這些參數以后,我們需要查找用戶所請求的信息。我們使用的信息從對象中構建 DOM 樹;該 DOM 樹包含了莎士比亞十四行詩的文本,以及關于這首十四行詩的其他信息。我們將根據 HTTP subtree 參數返回 DOM 樹的一部分。清單 4 顯示了構建 DOM 樹的部分代碼:
[b]清單 4. 構建 DOM 樹[/b] [TABLE][TR][TD][PRE] [#006600]Document[/#] [#000066]doc[/#] = [#990099]null[/#]; [#006600]Element[/#] [#000066]author[/#] = [#990099]null[/#]; [#006600]Element[/#] [#000066]lines[/#] = [#990099]null[/#]; [#006600]Element[/#] [#000066]title[/#] = [#990099]null[/#]; [#993333]public[/#] [#006600]void[/#] [#666633]initialize[/#]() { doc = ([#006600]Document[/#])Class. forName([#0000ff]"org.apache.xerces.dom.DocumentImpl"[/#]). newInstance(); [#993333]if[/#] (doc != [#990099]null[/#]) { [#006600]Element[/#] [#000066]root[/#] = doc.createElement([#0000ff]"sonnet"[/#]); root.setAttribute([#0000ff]"type"[/#], [#0000ff]"Shakespearean"[/#]); author = doc.createElement([#0000ff]"author"[/#]); [#006600]Element[/#] [#000066]lastName[/#] = doc.createElement([#0000ff]"last-name"[/#]); lastName.appendChild(doc.createTextNode([#0000ff]"Shakespeare"[/#])); author.appendChild(lastName);[/PRE][/TD][/TR][/TABLE]
我們創建了一個 Java 類的實例,該類實現了 DOM Document 接口,然后我們要求那個節點為我們創建各種節點。您很容易重新編寫這個應用程序,使它通過分析 XML 文件生成 DOM 樹。為了簡化這個示例(并減少我的工作量),我們定義了一些實例變量來保存準備為其提供服務的節點的值。這些值在類聲明頂部聲明,并在 initialize 方法中初始化。
最后一步是將被請求的 DOM 樹部分發送給用戶。為了實現這一任務,我們使用一個遞歸方法,printDOMTree,它處理節點及其所有子節點。因為這個方法是遞歸的,所以我們從文檔根節點還是從 DOM 樹的其他節點開始并不重要。如果所請求的是我們知道的一個節點,則可以將這個節點傳遞給方法 printDOMTree。否則,我們可以傳遞 Document 節點。清單 5 顯示了這一步驟。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -