使用struts的Digester来解析xml

text.xml内容如下

<database>
 <user id="1">
  <userName>adcde</userName>
  <password>12345</password>
 </user>
 <user id="2">
  <userName>dfghjh</userName>
  <password>23654</password>
 </user>
</database>

 

测试用TestServlet.java

package addressbook;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.Hashtable;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServlet;

import org.apache.commons.digester.Digester;


import addressbook.model.UserBean;


public final class TestServlet extends HttpServlet {

 private static final long serialVersionUID = 4991770529524308513L;
 private Hashtable<String, UserBean> database = null;
 private int debug = 0;
 private String pathname = "/WEB-INF/test.xml";

 public int getDebug() {
  return (this.debug);
 }

 public void addUser(UserBean user) {
  System.out.println("user.id="+user.getId());
  System.out.println("user.name="+user.getUserName());
  System.out.println("user.pass="+user.getPassword());
  database.put(user.getUserName(), user);
 }

 public void init() throws ServletException {

  String value;
  value = getServletConfig().getInitParameter("debug");
  try {
   debug = Integer.parseInt(value);
  } catch (Throwable t) {
   debug = 0;
  }
  if (debug >= 1)
   log("Initializing database servlet");
  value = getServletConfig().getInitParameter("pathname");
  if (value != null)
   pathname = value;

  try {
   load();
   getServletContext().setAttribute(Constants.DATABASE_KEY, database);
  } catch (Exception e) {
   log("Database load exception", e);
   throw new UnavailableException("Cannot load database from '"
     + pathname + "'" + e.getMessage());
  }

 }

 private synchronized void load() throws Exception {

  database = new Hashtable<String, UserBean>();
  InputStream is = getServletContext().getResourceAsStream(pathname);
  BufferedInputStream bis = new BufferedInputStream(is);
  
  Digester digester = new Digester();
  digester.push(this);
  //不进行XML与相应的DTD的合法性验证
  digester.setValidating(false);

 //当遇到<user>时创建一个addressbook.model.UserBean对象
  digester.addObjectCreate("database/user", "addressbook.model.UserBean");
  digester.addSetProperties("database/user","id","id"); //设置attribute (id)
  digester.addBeanPropertySetter("database/user/userName","userName"); //设置bean property (userName)
  digester.addBeanPropertySetter("database/user/password", "password"); //设置bean property (password)
  digester.addSetNext("database/user","addUser");// 调用addUser方法,将设置好的javabean放入hashtable中
  
  digester.parse(bis);//进行解析

 }

 

 public void destroy() {

  getServletContext().removeAttribute(Constants.DATABASE_KEY);

 }
}

 

UserBean.java

 

package addressbook.model;

import java.io.Serializable;
import java.util.Enumeration;
import java.util.Hashtable;


public final class UserBean implements Serializable {

 private String id = null;
    private String password = null;
    private String userName = null;
   // Getter/Setter methods for all defined properties

    public String getPassword() {

 return (password);

    }
   public String getUserName() {

 return (userName);

    }
    public void setPassword(String password) {

 this.password = password;

    }
    public void setUserName(String userName) {

 this.userName = userName;

    }

    /**
  * @return the id
  */
 public String getId() {
  return id;
 }
 /**
  * @param id the id to set
  */
 public void setId(String id) {
  this.id = id;
 }

 

为了在web容器加载web应用时就被加载并初始化,要在web.xml中进行如下配置

web.xml的配置

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC
          "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
          "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
 <display-name>Struts Application AddressBook</display-name>
  <servlet>
  <servlet-name>test</servlet-name>
  <servlet-class>addressbook.TestServlet</servlet-class>
  <init-param>
   <param-name>debug</param-name>
   <param-value>2</param-value>
  </init-param>
  <init-param>
   <param-name>pathname</param-name>
   <param-value>/WEB-INF/test.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>

</web-app>

执行结果

user.id=1

user.name=abcde

user.pass=12345

user.id=2

user.name=dfghjh

user.pass=23654

 

以下为转载

http://blog.csdn.net/zerowzj/archive/2008/04/29/2343466.aspx

 

Apache Commons Digester用来简化xml文件处理,它依赖的组件:BeanUtils、Logging、Collections。在内部是采用SAX来解析XML文件。
检修ABC项目中的“面包屑”处理就是使用这种方案。所谓面包屑就是在页面上起到导航作用的连接。比如“文档类别管理-》检修管理-》标准文档类别”。这里我们使用ct-views.xml文件来存放面包屑的所
有内容。该xml文件的部分内容如下:
< views >
 
< page  id ="VSD_WI003" >
  
< description > 标准文档列表 </ description >
  
< helpurl > standarddoc/workitem/SortWorkItemList.htm </ helpurl >
  
< crumb  level ="0" >
   
< name > 标准文档 </ name >
  
</ crumb >
  
< crumb  level ="1" >
   
< name > 文档编制 </ name >
   
< url > /standarddoc/WorkItemIndexAction.do </ url >
   
< target > mainWorkFrame </ target >
  
</ crumb >
  
< crumb  level ="2" >
   
< name > 文档列表 </ name >
  
</ crumb >
 
</ page >
</ views >

 

我们定义了三个普通的JAVABEAN,从范围的大到小依次是ViewConfig,PageConfig,CrumbConfig。
他们包含自己的setter和getter。view中存放page,page里存放crumb。在系统加载的时候一次读到stack里。
用来解析xml的类为ParseViewConfig,作用是解析ct-views里的内容,缓冲到stack中。
内容如下:
public   class  ParseViewConfig  {
    Digester digester 
= new Digester();
    Logger logger 
= Toolkit.getInstance().getLogger(this.getClass().getName());
    
public ViewConfig parse(InputStream input) {
        ViewConfig config 
= null;
        
//不进行XML与相应的DTD的合法性验证
        digester.setValidating(false);
        
//当遇到<views>时创建一个ViewConfig对象
        digester.addObjectCreate("views", ViewConfig.class);
        
//当遇到<page>时创建一个PageConfig对象
        digester.addObjectCreate("views/page", PageConfig.class);
        
//设置attribute
        digester.addSetProperties("views/page""id""id");
        digester.addSetProperties(
"views/page""file""file");
        digester.addSetProperties(
"views/page""path""path");
        
//设置bean property
        digester.addBeanPropertySetter("views/page/description""description");
        digester.addBeanPropertySetter(
"views/page/helpurl""helpurl");
        
//当遇到<crumb>时创建一个CrumbConfig对象
        digester.addObjectCreate("views/page/crumb", CrumbConfig.class);
        
//设置attribute
        digester.addSetProperties("views/page/crumb""level""level");
        
//设置bean property
        digester.addBeanPropertySetter("views/page/crumb/url""url");
        digester.addBeanPropertySetter(
"views/page/crumb/name""name");
        digester.addBeanPropertySetter(
"views/page/crumb/target""target");
        
//这里的addCrumbConfig是调用父接点对象的方法名,这里是PageConfig
        digester.addSetNext("views/page/crumb""addCrumbConfig");
        
//这里的addPageConfig是调用父接点对象的方法名,这里是ViewConfig
        digester.addSetNext("views/page""addPageConfig");
        
try {
            config 
= (ViewConfig)digester.parse(input);
        }
 catch(SAXException ex) {
            logger.error(ex.getMessage(), ex);
        }
 catch(IOException ex) {
            logger.error(ex.getMessage(), ex);
        }

        
return config;
    }
 
该文件返回一个ViewConfig对象的引用。接着我们使用plug-in技术使系统在加载前就载入这些信息,为此加入了SysInitPlugIn类,它实现了org.apache.struts.action.PlugIn接口。
解析ct-views的相关代码如下:
 //得到文件流
        InputStream input = actionServlet.getServletContext().getResourceAsStream(
                            "/WEB-INF/ct-views.xml");
 //解析文件
        ParseViewConfig parseViewConfig = new ParseViewConfig();
        ViewConfig config = parseViewConfig.parse(input);
为此,可以把这里得到的ViewConfig在页面上通过getter方法得到其相关的属性值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值