XML和JSP互動技術

來源:互聯網
上載者:User
js|xml|互動

XML和JSP都是近兩年才出現的技術,目前已經成為了很多程式員的熱點話題。XML(可擴充的標記語言)是用來定義文檔標記語言的架構,主要用來儲存和發送資料資訊,以便各種基於WEB的應用之間能更方便的交換資料。而Jsp是伺服器端程式動態設計語言,可以用來設計伺服器端各種程式如B2B、B2C等各種系統,由於其物件導向、編譯執行、健壯等特性,也得到了越來越多的應用。
  一個很實用的技術就是如何將XML和JSP結合起來,所幸的是我們不用去寫底支援層東西了,因為很多廠商如SUN、IBM等都發布了自己的支援XML的API,其中SUN公司提供了一個支援在Java下使用XML的API-JAXP(JAVATM API for XML Processing Optional Package),這部分API提供了基本的讀寫、操作XML文檔的功能,通過它我們可以很方便的將XML整合到Java應用程式中來。
  目前JAXP的版本是1.1,除了基本XML支援外還支援SAX 2.0 、DOM 2和XSL技術。SUN公司提供的JAXP可以在SUN公司的首頁http://java.sun.com/xml 下載。 
  一、 JAXP的安裝
  1、安裝前請確認您用的是JDK 1.1.8 以上版本的Java環境。
  2、在http://java.sun.com/xml 下載JAXP1.1的zip版本,解壓到硬碟中,假定解壓目錄為#JAXP11,解壓後發現有三個jar檔案jaxp.jar crimson.jar xalan.jar,這就是JAXP的核心了。
  3、修改系統的CLASSPATH變數,在Windows平台下添加這樣一行:
   #JAXP11\jaxp.jar; #JAXP11\crimson.jar; #JAXP11\xalan.jar
   在Unix/Linux系統下添加下面一行:
   #JAXP11/jaxp.jar: #JAXP11/crimson.jar: #JAXP11/xalan.jar alan.jar 
如果你使用的是Java2的話,有一種更簡單的方法,將上面的三個檔案直接拷貝到JDK的Lib擴充目錄中去,如#JAVA_HOME/jre/lib/ext(#JAVA_HOME代表JDK目錄),這樣就不用修改CLASSPATH了。
  4、好了,安裝完成了,下一步就是編寫程式然後運行了。
  二、 簡單的XML例子
  XML (EXtensible Markup Language )是一種類似HTML的語言,和HTML不同,XML主要用來描述結構化資料,通過XML格式我們可以很方便的在各種應用程式之間交換資料,而這些都是傳統技術需要花費很大精力才能做到的。
  讓我們來看一個簡單的XML文檔例子,這個例子儲存了部分個人檔案,請將它儲存為personal.xml檔案,因為後面我們的Jsp檔案還會調用它中間的資料。
   
  <個人檔案>
  <姓名>劉玉鋒 
  <性別>男 
  <年齡>24 
  coolknight@263.net 
  <個人首頁>http://www.21jsp.com 
  <介紹>歡迎大家訪問我的首頁! 
  
是不是很類似於HTML檔案,如HTML中的元素"你好"等等,因為XML和HTML一樣都是標準SGML的子集合,所以有類似之處。但也有很多不同之處需要注意,比如XML檔案必須有成對地標記而且大小寫敏感,而這些在HTML中都是預設允許的。
  第一行是必須的XML聲明, 我們可以看到聲明是在之間的,中間可以定義部分屬性,version="1.0"表示文檔將使用XML1.0的規範,encoding="gb2312"表示採用中文字元集,這樣我們在下面對於資料就可以使用中文了。
  接著就是<個人檔案>標記了,這是XML檔案中的根項目,也是不可缺少的,而且必須有一個對應的結束標記,在開始和結束標記之間我們就可以定義自己的資料描述了。
  嵌套在<個人檔案>標記如"<姓名>劉玉鋒"就是具體的資料描述了,同根項目一樣必須是成對的標記,在標記中間可以是標記對應具體的數值。這種表示方法有點類似於資料庫中的記錄了,欄位名字為"姓名"、"性別"等,上面的XML檔案就相當於一個只有一條記錄的表"個人檔案"。當然在XML檔案中可以進行多層嵌套,但這就不在本文的討論範圍了。
  當然,這裡只是一個特別簡單能代表XML的例子,XML的相關內容特別多,如果想更多瞭解XML的話建議還是看相關的書籍。

三、JSP和XML互動
  前面已經說過了,Jsp通過SUN公司的API-JAXP可以實現和XML的互動,那麼具體實現主要有兩種方法,一種是採用DOM2 API,另外一種是採用SAX2 API。
  在這裡我們主要討論JAXP中的SAX(Simple API for XML Parsing)技術,DOM2技術可以看SUN公司相關的文檔。
  1)關於SAX模型
  SAX模型是一種處理XML檔案的方法,它是事件驅動的,有些類似於AWT中的事件驅動機制,通過事件驅動來識別XML文檔的內容。在API中關於SAX的主要有下面的幾個包:
  oorg.xml.sax
  oorg.xml.sax.helpers
  oorg.xml.sax.ext
在前台的Java程式或者是Jsp程式中通過調用這幾個包中的API就可以很好地實現Java和XML的互動。
  2)關於HandlerBase介面
  我們知道在AWT中一般是通過實施ActionListener等介面實現事件的處理的,同樣的在SAX中SUN也提供了一個類似的介面HandlerBase來處理XML解析的功能,通過將HandlerBase和XML檔案關聯可以很好的來處理XML檔案。
  在實施介面中我們主要重載三個HandlerBase的方法startElement(String tag, AttributeList attrs)、characters(char[] ch, int start, int length)、endElement(String name)。
  startElement()在讀取一行XML資料的開始標記時候觸發,子類必須覆蓋這個方法,這樣就可以在處理XML節點前先進行自己的處理(比如開始讀取或者寫入XML檔案中的節點時候)。
  public void startElement (String name, AttributeList attributes)
   throws SAXException
   {
    // no op
    }
參數name代表XML節點名字,attributes代表預設或者特殊的屬性,這個方法拋出一個違例org.xml.sax.SAXException。
  characters()方法主要用來處理和之間具體的資料,在處理節點資料時候觸發,我們可以覆蓋這個方法來進行資料操作的處理,可以添加代碼讀取節點資料值或者是寫入節點資料值。
  public void characters (char ch[], int start, int length)
   throws SAXException
   {
    // no op
    }
參數ch[]代表一個字元數組,start代表字元數組的開始位置,length代表要取的字元數組中ch[]中的元素個數,同樣的這個方法拋出一個違例org.xml.sax.SAXException。
  endElement()方法在處理節點元素結束的時候觸發,也就是碰到標記的時候,我們可以覆蓋這個方法來進行資料的收尾工作,比如將節點資料寫入到檔案中。
  public void endElement (String name)
   throws SAXException
    {
     // no op
    }
參數name代表XML節點名字,這個方法拋出一個違例org.xml.sax.SAXException
  從上面我們也可以看出,三個方法在XML事件處理中的順序依次為:
   startElement()àcharacters()àendElement(String name)
也許還不好理解,不要緊在下面我們將會寫一個類myHandler類實現HandlerBase介面,並且覆蓋這三個主要的方法來實現我們的XML檔案讀取操作。
  3)關於雜湊表 
  由於程式用到了雜湊表,所以在這裡先簡單的介紹一下雜湊表的基本文法以便大家能更好的理解下面的程式。
  雜湊表HashTable是從Dictionary派生出來的,裡面具有一系列的關鍵字和數值,一個關鍵字對應一個數值,識別主要是通過對象的雜湊碼hashCode識別。
  我們程式中用到的方法如下:
  put(Object key,Object value)添加一對關鍵字/數值到雜湊表中
  get(Object key)根據關鍵字得到它的值
  keys()取得所有關鍵字並返回一個集合Enumeration
此外,雜湊表還具有其他很多有用的方法如長度size()、是否為空白empty()、是否重複containsKey()等等,限於篇幅在這裡就不進行介紹了。

4) 實施HandlerBase介面
  在這裡我們編寫一個myHandler的類,它用來實施HandlerBase介面,並且覆蓋介面的三個主要方法startElement(String tag, AttributeList attrs)、characters(char[] ch, int start, int length)、endElement(String name)以便能對XML檔案進行操作。
  為了儲存資料以便外部程式能夠調用本類中的資料,我們採用了雜湊表結構來儲存解析XML檔案後的所有節點名字以及節點的資料值,startElement()方法主要用來讀取XML檔案中的節點名稱,characters()方法主要用來根據節點名稱讀取節點資料,endElement()方法主要是在一個XML節點處理完畢後將這對節點名稱和節點資料儲存在雜湊表中。
  在外部程式中我們只需要調用getTable()方法返回一個雜湊表對象就可以讀取所有的節點和節點資料值了。
  代碼不多,而且我在下面添加了很多注釋,應該很好看懂了。
  myHandler.java檔案
  file://檔案放置在包com.jsp21.www中
  package com.jsp21.www;
  file://匯入相關的java API
  import java.io.*;
  import org.w3c.dom.*;
  import org.xml.sax.*;
  import javax.xml.parsers.SAXParser;
  import javax.xml.parsers.SAXParserFactory;
  import java.util.Hashtable;
  import java.util.Enumeration;
  // myHandler類實現HandlerBase介面;
  public class myHandler extends HandlerBase {
  private String myElement = null; file://XML檔案中的標記名稱;
  private String myValue = null; file://XML檔案中標記對應的值;
  private Hashtable mytable = new Hashtable(); file://用來儲存XML檔案中所有的資料;
  file://得到儲存有XML資料的雜湊表Hashtable;
  public Hashtable getTable() {
   return mytable;
  }
  file://覆蓋HandlerBase介面中的startElement方法,讀取一行XML資料的開始標記時候執行此方法;
  // tag代表XML中的標記,如前面XML檔案中的NAME AGE等;
  public void startElement(String tag, AttributeList attrs)
   throws SAXException {
   myElement = tag;
  }
  file://覆蓋HandlerBase介面中的characters方法,主要用來得到和之間具體的資料;
  // 當對應myElement的標記發現值後,也就是startElement方法執行完畢後,就會觸發這個characters方法來得到具體的數值;
  file://如myElement="姓名"時候,myValue就會等於"劉玉鋒";
  public void characters(char[] ch, int start, int length)
  throws SAXException {
    myValue = new String(ch, start, length);
  }
  file://覆蓋HandlerBase介面中的endElement方法,主要用來在一行XML資料讀取完畢後進行自己的處理;
  // 當XML檔案中一行標記讀取完畢後,觸發此endElement方法;
  file://如果存在對應的結束標記,就將前面得到的標記myElement和值myValue
  file://放入到mytable雜湊表中;
  public void endElement(String name) throws SAXException {
  if ( myElement.equals(name) ) {
   mytable.put(myElement, myValue);
  }
  }
  }
好了,編譯這個class,並把myHandler.class檔案放置在CLASSPATH能找到的路徑中,比如Tomcat中應用程式的Web-inf\classes\com\jsp21\www目錄下。

5)Jsp程式調用XML
  在這裡,我們寫了一個比較簡單的Jsp程式來調用前面的myHandler類,並通過這個類來讀取personal.xml檔案中的內容,最後顯示在Jsp頁面中。
  首先我們建立一個SAXParserFactory的執行個體saxpF,然後通過這個執行個體來建立一個SAXParser的執行個體saxpser(可以用來解析XML檔案內容),當然還要建立myHandler類的執行個體,最後通過saxpser.parse()方法將XML檔案和myHandler類執行個體關聯起來(這樣會執行myHandler中的幾個事件處理方法)。
(說明:SAXParserFactory是一個抽象類別,定義了一個factory API可以讓Java應用程式配置或者是獲得一個SAX的解析器(SAX parser)。SAXParser也是一個抽象類別,通過這個類應用程式可以解析XML檔案的內容。)
  到這時候XML所有內容都儲存在了myHandler類執行個體中的雜湊表中,最後通過getTable()方法得到這個雜湊表對象,將雜湊表中的鍵儲存在集合Enumeration中,使用一個迴圈來讀取哈系表中的資料並顯示在Jsp頁面上。我們用集合的目的在於使這個Jsp程式盡量通用,傳遞一個XML檔案名稱字就可以讀出所有內容,當然你也可以不使用集合而使用(String)hshTable.get("姓名")這樣的方法來讀取特定的節點值。
  下面是Jsp檔案代碼,請儲存為jspxml.jsp檔案 
這是一個XML+JSP的例子,讀取XML檔案中的內容

   
代碼寫完好,將此檔案放在Web應用程式目錄下,然後通過瀏覽器運行這個程式,如http://192.168.0.98:7070/welcome_html/jspxml.jsp?file=e:\\personal.xml,注意必須使用參數?file=路徑\\personal.xml (路徑根據你儲存在硬碟中的目錄而定,Java表示:Windows系統下"\\"代表一個"\"),運行後的效果如下面所示:
 

可以看到,XML檔案中的所有資料都通過這個Jsp檔案讀取出來了,因為這個Jsp程式是檔案無關的,你也可以將file=e:\\personal.xml中的xml檔案名稱字換為其他的XML檔案看看最後運行效果。
  要說明一點的就是本人在最後實際採用的是JAXP1.01版本的API,有可能是本人的系統原因,發現程式在1.1版本下可以編譯通過,但啟動並執行時候會出現下面錯誤(即使JAXP1.1包中內建的例子main.java也這樣):
  java.lang.NoClassDefFoundError: org.apache.crimson.jaxp.SAXParserFactoryImpl
所以最後換作了1.01版本的JAXP來運行程式,1.01版本的JAXP在上面的地址同樣可以下載。



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.