歡迎您光臨本站 註冊首頁

Servlet 和 XML:互為補充

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  研究 Java servlet 和 XML 如何共同生成 XML 文檔和 DOM 樹,以及它們如何與資料庫對接。本文包括幾項有用的技術:使用 HTTP 參數控制 DOM 樹的處理與生成,而無需 XML 源文檔。

對 Java 程序員來說,Servlet 和 XML 是最令人振奮的兩項技術。本文是為 2000 年 2 月 17 日舊金山 City Java 用戶組準備的演示文稿。在本文中您將看到如何使用 servlet 組成一個簡單的 XML 文檔,構建一個 DOM 樹,並將部分內容顯示在用戶屏幕上,最後您將看到如何從一個資料庫查詢生成 XML。

對於本文討論的示例來說,我們將擴展 HTTPServlet 類。HTTPServlet 類提供了通常與 CGI 程序相關的功能。它支持 put 和 get,並且使您的代碼具有對 HTTP 請求標頭的完全訪問權,包括 UserAgent 域。我們將創建一些簡單的 servlet,並說明它們如何處理以 XML 標籤標記的信息。在這一過程中我們還將說明文檔對象模型 (DOM) 的一些方法。這些簡單的應用程序將使您了解當將 servlet 和 XML 組合在一起時您能夠做哪些事情。





第一個 servlet 示例

作為開始,我們將編寫一個用來生成 XML 文檔的 10 行 servlet。在構建理解 XML 的 servlet 時,我們將按以下三個步驟進行:





將內容類型設為 text/xml。

創建 XML 文檔。

將 XML 文檔寫回客戶機。




在我們的大多數 Servlet 中,主要精力放在第二步。我們可能根據資料庫查詢創建一個 XML 文檔,也可能基於從客戶傳送來的 HTTP 參數生成它,或者也可能使用其他類型的數據檢索或生成方法。在本文的示例中,將主要考慮 HTTP 參數和資料庫查詢。


一個基本的 servlet

對於第一個示例,第二步「創建 XML 文檔」不是我們所關心的;我們只想生成一個有效的 XML 文檔。我們已將文檔硬編碼到源代碼中,如清單 1 所示。







彩色編碼

彩色編碼清單是本文的一個特色,我們正在 dW 進行試驗。為了生成我們的彩色編碼清單,我正在使用一些開放源代碼的工具。首先,我將文檔(Java、HTML、XML 等)載入 Emacs 中。Emacs 定義了關鍵字、註釋、函數名以及其他編程語言構件(大約有十多種)的顏色。在 Emacs 載入文件並為其加上顏色以後,我使用 HTMLize 程序包,這是一種用曾經流行的 Emacs Lisp 語言編寫的開放源代碼實用工具。HTMLize 接收一個清單(這個清單看起來與在 Emacs 中完全一樣),然後將其轉換為 HTML。結果將是一個完全彩色編碼的文件,它突出顯示關鍵字、註釋、函數名等。




請告拆我們您對這些新的、改進的代碼清單的想法。




如果您也想這樣做,請參閱參考資料中的相應鏈接。







清單 1. xmlfromscratch.java
public class xmlfromscratch extends HttpServlet
{
public void service(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/xml");
PrintWriter out = response.getWriter();

out.println("");
out.println("");
out.println(" Hello, World!");
out.println("
");
}
}






這一段令人興奮的代碼生成的結果如下所示:




清單 2. xmlfromscratch.java 的結果


Hello, World!









您可以查看完整清單的 HTML 視圖或直接查看 Java 源文件。





生成 XML 段

現在,我們已經創建了一個 servlet,它通過硬編碼生成一個沒有意義的簡單 XML 文檔。在下一個 servlet 中,我們從零開始生成一個 DOM 樹,然後將 DOM 樹的一部分顯示在請求者的屏幕上。向請求者發送回的 DOM 樹部分取決於 servlet 接收到的 HTTP 參數。本例展示了幾項有用的技術:使用 HTTP 參數控制 DOM 樹的處理與生成,而無需 XML 源文檔。




清單 3 顯示了處理 HTTP 參數的代碼段:




清單 3. xmlfromdom.java
public void service(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/xml");
PrintWriter out = response.getWriter();

Enumeration keys;
String key;
String requestedSubtree = "";

keys = request.getParameterNames();
while (keys.hasMoreElements())
{
key = (String) keys.nextElement();
if (key.equalsIgnoreCase("subtree"))
requestedSubtree = request.getParameter(key);
}






正如在上一個示例中那樣,我們將內容類型設置為 text/xml。在此之後,我們使用 HttpServletRequest.getParameterNames 方法從 HTTP 請求中檢索所有參數。




在處理完這些參數以後,我們需要查找用戶所請求的信息。我們使用的信息從對象中構建 DOM 樹;該 DOM 樹包含了莎士比亞十四行詩的文本,以及關於這首十四行詩的其他信息。我們將根據 HTTP subtree 參數返回 DOM 樹的一部分。清單 4 顯示了構建 DOM 樹的部分代碼:




清單 4. 構建 DOM 樹
Document doc = null;
Element author = null;
Element lines = null;
Element title = null;

public void initialize()
{
doc = (Document)Class.
forName("org.apache.xerces.dom.DocumentImpl").
newInstance();

if (doc != null)
{
Element root = doc.createElement("sonnet");
root.setAttribute("type", "Shakespearean");

author = doc.createElement("author");

Element lastName = doc.createElement("last-name");
lastName.appendChild(doc.createTextNode("Shakespeare"));
author.appendChild(lastName);





我們創建了一個 Java 類的實例,該類實現了 DOM Document 介面,然後我們要求那個節點為我們創建各種節點。您很容易重新編寫這個應用程序,使它通過分析 XML 文件生成 DOM 樹。為了簡化這個示例(並減少我的工作量),我們定義了一些實例變數來保存準備為其提供服務的節點的值。這些值在類聲明頂部聲明,並在 initialize 方法中初始化。




最後一步是將被請求的 DOM 樹部分發送給用戶。為了實現這一任務,我們使用一個遞歸方法,printDOMTree,它處理節點及其所有子節點。因為這個方法是遞歸的,所以我們從文檔根節點還是從 DOM 樹的其他節點開始並不重要。如果所請求的是我們知道的一個節點,則可以將這個節點傳遞給方法 printDOMTree。否則,我們可以傳遞 Document 節點。清單 5 顯示了這一步驟。




清單 5. printDOMTree
if (requestedSubtree.equalsIgnoreCase("author"))
printDOMTree(author, out);
else if (requestedSubtree.equalsIgnoreCase("lines"))
printDOMTree(lines, out);
else if (requestedSubtree.equalsIgnoreCase("title"))
printDOMTree(title, out);
else
printDOMTree(doc, out);





如果 subtree 參數是 author,則結果是:




Shakespeare
William
British
1564
1616





如果 subtree 參數是 title,則結果是:



Sonnet 130




您可以查看完整清單的 HTML 視圖或直接查看 Java 源文件。





與資料庫對接

我們的最後一個示例是根據資料庫查詢生成 XML。有許多方法可做到這一點(請參閱 developerWorks 的文章 Generating XML from a Data Store);對於本例而言,我們將使用 IBM 的 XML Extender for DB2(請參閱參考資料)。這個免費產品使您能夠在 DB2 中存儲 XML 文檔。我們的查詢從 DB2 中提取這些文檔,然後將其傳送給用戶。



如果您使用 Oracle 8i 代替 DB2,您將會發現它自稱具有類似的功能(請參閱參考資料)。對於不理解 XML 的資料庫,您可以將 XML 文檔存儲為字元大對象 (CLOB),並以文本塊的方式檢索文檔。




但是,在安裝資料庫以後,您需要完成以下三件事情才能使此代碼工作:






首先,將 DbOwner、DbUserid 和 DbPasswd 變數改為適合系統的適當值。


/////////////////////////////////////////////////////////////////
// 一定要正確更改這三個字元串,否則 //
// servlet 不會工作。 //
/////////////////////////////////////////////////////////////////
DbUserid = "xxxxxxxx";
DbPasswd = "xxxxxxxx";
DbOwner = "xxxxxxxx";







下一步,使用適合您的系統的 JDBC 驅動程序。我們在使用 DB2。


static String JDBCDriver = "COM.ibm.db2.jdbc.app.DB2Driver";
...
try
{
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
}
catch (Exception e)
{
System.out.println("Can\'t get the driver!"); e.printStackTrace();
}







如果你願意,可以改掉下面的 SQL 查詢語句。為了簡化示例,此處僅檢索 sales_order_view 表的 order 列中的全部 XML 文檔。

// 我們在此處對 SQL 語句進行硬編碼;如果根據用戶輸入
// 限制查詢,則情況會更為複雜。 String query = "select order from " + DbOwner + ".sales_order_view";








在 service 方法中,我們的 servlet 連接 DB2,執行一個查詢(其結果為一組 XML 文檔),分析查詢結果,並將分析過的數據寫入輸出流中。清單 6 顯示了與此關係最密切的代碼部分:


清單 6. xmlfromdb2.java
// 我們在此處對 SQL 語句進行硬編碼;如果根據用戶輸入
// 限制查詢,則情況會更為複雜。 String query = "select order from " + DbOwner + ".sales_order_view";

res.setContentType("text/xml");

try
{
ConInfo index = new ConInfo();
Connection con = getCon(index);
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);

...

// 顯示結果集。我們從每行取出 XML 文檔,
// 對其進行分析,然後列印 DOM 樹。當沒有更多的行時,rs.next() 返回
// false。 while (rs.next())
{
String nextOrder = rs.getString(1).trim();
Document doc = null;
StringReader sr = new StringReader(nextOrder);
InputSource iSrc = new InputSource(sr);

try
{
parser.parse(iSrc);
doc = parser.getDocument();
}
catch (Exception e)
{
System.err.println("Sorry, an error occurred: " + e);
}

if (doc != null)
printDOMTree(doc, out);
}





要了解全部細節,您可以查看完整清單的 HTML 視圖或直接查看Java 源文件。





小結

儘管這些 servlet 示例中沒有一個可以改變世界,但它們確實展示了 XML 和 servlet 配合得有多麼好。Servlet 是向客戶發送內容的一種偉大機制,而 XML 是發送結構化數據的一種完美機制。您還可以使用 servlet 處理伺服器上的 XML 文檔,並將它們的內容發送給客戶機。最重要的是,這兩種技術都是跨平台技術,可為您的應用程序帶來更大的靈活性和可移值性。





參考資料







了解有關 DB2 XML Extender 的詳細信息。產品附帶的文檔中有一個深入的教程,它可幫助您將 XML 文檔帶入關係資料庫的世界中。


了解有關 Oracle 資料庫產品的詳細信息。


試用 WebSphere 附帶的免費 servlet 教程。


通過 developerWorks 的 XML programming in Java 教程深入研究如何分析 XML 文件。


下載作者為 City Java 用戶組製作的演示文稿的 PDF 版本。


在 www.gnu.org 網站學習使用 Emacs 彩色編碼代碼清單。HTMLize 程序包可從網址 jagor.srce.hr 獲得。


[火星人 ] Servlet 和 XML:互為補充已經有248次圍觀

http://coctec.com/docs/program/show-post-72317.html