| 導購 | 订阅 | 在线投稿
分享
 
 
 

XML和JSP交互技術(下)

來源:互聯網  2006-12-16 17:29:11  評論

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("姓名")這樣的方法來讀取特定的節點值。

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在上面的地址同樣可以下載。

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("姓名")這樣的方法來讀取特定的節點值。 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在上面的地址同樣可以下載。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有