### XML 和 JSP 交互技术(上)(1)

XML 和 JSP 都是近两年才出现的技术，目前已经成为了很多程序员的热点话题。XML(可扩展的标记语言)是用来定义文档标记语言的框架，主要用来存储和发送数据信息，以便各种基于ＷＥＢ的应用之间能更方便的交换数据。而 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 的安装
１、安装前请确认您用的是 JDK 1.1.8 以上版本的 Java 环境。
２、在 http://java.sun.com/xml 下载 JAXP1.1 的 zip 版本，解压到硬盘中，假定解压目录为#JAXP11，解压后发现有三个 jar 文件 jaxp.jar crimson.jar xalan.jar，这就是 JAXP 的核心了。
３、修改系统的 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 文件读取操作。