新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论Java, J2SE, J2ME, J2EE, 以及Eclipse, NetBeans, JBuilder等Java开发环境,还有JSP, JavaServlet, JavaBean, EJB以及struts, hibernate, spring, webwork2, Java 3D, JOGL等相关技术。
    [返回] 计算机科学论坛计算机技术与应用『 Java/Eclipse 』 → XML和JSP交互技术(下) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6564 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: XML和JSP交互技术(下) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     hsower 帅哥哟,离线,有人找我吗?狮子座1983-8-21
      
      
      威望:7
      等级:大四寒假(收到IBM的Offer啦)
      文章:72
      积分:1606
      门派:XML.ORG.CN
      注册:2004/4/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hsower发送一个短消息 把hsower加入好友 查看hsower的个人资料 搜索hsower在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hsower的博客楼主
    发贴心情 XML和JSP交互技术(下)

    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类实例关联起来(这嶂葱衜yHandler中的几个事件处理方法)。

    (说明:SAXParserFactory是一个抽象类,定义了一个factory API可以让Java应用程序配置或者是获得一个SAX的解析器(SAX parser)。SAXParser也是一个抽象类,通过这个类应用程序可以解析XML文件的内容。)

      到这时候XML所有内容都保存在了myHandler类实例中的哈希表中,最后通过getTable()方法得到这个哈希表对象,将哈希表中的键保存在集合Enumeration中,使用一个循环来读取哈系表中的数据并显示在Jsp页面上。我们用集合的目的在于使这个Jsp程序尽量通用,传递一个XML文件名字就可以读出所有内容,当然你也可以不使用集合而使用(String)hshTable.get("姓名")这样的方法来读取特定的节点值。

    代码写完好,将此文件放在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在上面的地址同样可以下载。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/19 14:20:00
     
     v_gyc 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:2
      积分:66
      门派:XML.ORG.CN
      注册:2004/7/1

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给v_gyc发送一个短消息 把v_gyc加入好友 查看v_gyc的个人资料 搜索v_gyc在『 Java/Eclipse 』的所有贴子 引用回复这个贴子 回复这个贴子 查看v_gyc的博客2
    发贴心情 
    jsp 直接调用SAX, 玩具还可以。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/7/1 23:55:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Java/Eclipse 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 3:51:58

    本主题贴数2,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms