### XML 和 JSP 交互技术(2)

在这里我们编写一个 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 目录下。
XML 和 JSP 交互技术(4)
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 文件
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page language="java" import="com.jsp21.www.*,java.io.*" %>
<%@ page language="java" import="org.w3c.dom.*,org.xml.sax.*" %>
<%@ page language="java" import="javax.xml.parsers.SAXParser" %>
<%@ page language="java" import="javax.xml.parsers.SAXParserFactory" %>
<%@ page language="java" import="java.util.*" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
这是一个 XML+JSP 的例子，读取 XML 文件中的内容
try {
file://得到客户端请求的 file 文件名字
String newFile=request.getParameter("file");
file://如果没有 file 值，打印信息并返回
if(newFile==null||newFile.equals(""))
{out.println("请使用参数如 jspxml.jsp?file=e:\\\\personal.xml");
return;
}
String xmlFile ="file:" + new File(newFile);
file://创建一个 SAXParserFactory 的实例 saxpF
SAXParserFactory saxpF = SAXParserFactory.newInstance();
file://通过 saxpF 创建一个 SAXParser 的实例 saxpser
SAXParser saxpser = saxpF.newSAXParser();
file://创建一个 myHandler 对象的实例
myHandler handler = new myHandler();
// 将 XML 文件和 handler 事件关联起来，利用 handler 来解析 XML 文件中的内容