`
smartvessel
  • 浏览: 82009 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tomcat 7 源码分析-3 使用Digester读取xml文件实例化server

阅读更多

接下来tomcat要load了,看下面一些程序片段

public void load() {

        long t1 = System.nanoTime();
        initDirs();
        initNaming();
        Digester digester = createStartDigester();
        ........
       digester.push(this);
       digester.parse(inputSource);
        ........
        getServer().init();

 令人费解的如何实例化server的?digester有何作用?原来digester是apache的common项目,作用是讲XML转成Object。tomcat读取配置文件conf\server.xml,实例化server对象。形同:

        // Configure the actions we will be using
        digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");
        digester.addSetProperties("Server");
        digester.addSetNext("Server",
                            "setServer",
                            "org.apache.catalina.Server");

 要读懂这些还真费解,这里写了个小例子。

首先xml文件为

<?xml version="1.0"?>
<catalog library="somewhere">
   <book>
      <author>Author 1</author>
      <title>Title 1</title>
   </book>
   <book>
      <author>Author 2</author>
      <title>His One Book</title>
   </book>
   <book>
      <author>Author 3</author>
      <title>His Other Book</title>
   </book>
</catalog>

 Book.java

package com.xiao;

public class Book {
	   private String author;
	   private String title;

	   public Book() {}

	   public void setAuthor( String rhs ) { author = rhs; }
	   public void setTitle(  String rhs ) { title  = rhs; }
	   
	   public String getAuthor(  ) { return author; }
	   public String getTitle(  ) { return title; }
	   
	   public String toString() {
	      return "Book: Author='" + author + "' Title='" + title + "'";
	   }
	}

Catalog.java

package com.xiao;
import java.util.Vector;
public class Catalog {
   private Vector<Book> books;

   public Catalog() {
      books = new Vector<Book>();
   }
   public void addBook( Book rhs ) {
      books.addElement( rhs );
   }
   public String toString() {
      String newline = System.getProperty( "line.separator" );
      StringBuffer buf = new StringBuffer();
      buf.append( "--- Books ---" ).append( newline );
      for( int i=0; i<books.size(); i++ ){
    	  Book book  = books.elementAt(i);
         buf.append( book.toString()).append( newline );
      }
      return buf.toString();
   }
}

 CreateCatalog.java

package com.xiao;
import java.io.IOException;
import org.apache.tomcat.util.digester.Digester;
import org.xml.sax.SAXException;

public class CreateCatalog {
	protected  Catalog ct;
	
	public void SetCatalog(Catalog ol){
		
		ct = ol;
	}
	
	public Catalog GetCatalog(){
		
		return this.ct;
	}
	public String toString() {
		
		return ct.toString();
		}
	
	public Digester createStartDigester()throws IOException, SAXException
	{
		Digester digester = new Digester();
		digester.setValidating( false );
		//解析XML时,遇到catalog,就实例化一个com.xiao.Catalog对象,并且压栈
		digester.addObjectCreate( "catalog", "com.xiao.Catalog");
		//对catalog,调用栈的次top对象(现在还没有压入,父对象)的SetCatalog函数。
		//passing the element that is on the top of the stack, which must be of type com.xiao.Catalog
		//This is the rule that causes the parent/child relationship to be created.
		digester.addSetNext("catalog", "SetCatalog", "com.xiao.Catalog");
		
		digester.addObjectCreate( "catalog/book","com.xiao.Book");
		
		//对rule,调用当前top object的setAuthor函数,参数个数为1
		digester.addCallMethod("catalog/book/author", "setAuthor",1);
		//对rule,添加第一个参数值
		digester.addCallParam("catalog/book/author", 0);
		digester.addCallMethod("catalog/book/title", "setTitle",1);
		digester.addCallParam("catalog/book/title", 0);
		//此时次top的object就是com.xiao.Catalog,调用它的addBook函数,将com.xiao.Book传入
		digester.addSetNext("catalog/book", "addBook", "com.xiao.Book");
		
		return (digester);
	}
}

 TestDigester.java

package com.xiao;

import org.apache.tomcat.util.digester.Digester;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import java.io.*;
public class TestDigester {
	
	public static void main(String[] args) throws IOException, SAXException  {
		// TODO Auto-generated method stub
		CreateCatalog cc = new CreateCatalog();
		Digester digester = cc.createStartDigester();	
		String configFile = "xiapingtest/ts.xml";	
		InputSource inputSource = null;
		InputStream inputStream = null;
		File file = new File(System.getProperty("user.dir"),configFile);
		inputSource = new InputSource("file://" + file.getAbsolutePath());
		inputStream = new FileInputStream(file);
		inputSource.setByteStream(inputStream);
		//在加入CreateCatalog对象,这个是第一个压入的对象
		digester.push(cc);
		//处理xml文件,逐个加入对象
		digester.parse(inputSource);		
		System.out.println(cc.toString());
	}

}

 部分解释以及在代码注释里。

分享到:
评论
1 楼 jieyuan_cg 2010-08-28  
呃,这个不就是castor做的事情么?

相关推荐

    Tomcat7启动分析(三)Digester的使用

    在Tomcat7的启动过程中,涉及到很多内部组件的初始化,其中`Digester`是一个重要的工具,用于解析XML配置文件,将XML结构映射为Java对象。本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `...

    利用commons-digester解析xml

    在提供的文件列表中,有一个名为“Privilege”的文件,这可能是示例中的一个权限或者角色相关的类,或者是一个XML配置文件,用于演示如何使用Digester解析与权限或角色相关的XML数据。具体用途可能需要参考实际的...

    Digester读取XML学习

    【标题】:“Digester读取XML学习” 在Java开发中,处理XML文件是常见的任务,尤其是在构建配置驱动的应用程序时。Apache Commons Digester是一个强大的工具,它允许开发者将XML文件解析为Java对象,通过匹配XML...

    digester解析XML文件实例

    3. **解析XML**:使用`parse()`方法加载XML文件并开始解析。在解析过程中,匹配到的规则会被触发执行。 4. **XML结构与Java对象**:XML文件的根元素通常对应一个顶级Java对象,而子元素则对应该对象的属性或者子...

    Jakarta-Common-Digester使用笔记

    Digester不是一个XML Parser,它只是对SAX更高层次上的一个封装使用Digester,将XML映射成javaBean. 我们无须了解SAX和DOM的解析过程,只要给Digester添加一些解析规则,就能对一个xml文件进行解析。Digester使用...

    Digester读取xml教程.rar

    本教程将深入探讨如何使用Digester来读取XML文件,帮助你更好地理解和应用这一强大的工具。 1. **什么是Digester?** Apache Commons Digester是一个Java库,它允许开发者通过定义一系列规则来解析XML文档,这些...

    commons-digester源码

    - 配置文件解析:例如,Web应用服务器如Tomcat就使用Digester来解析server.xml配置文件。 - 数据对象的自动构建:XML数据可以映射到相应的Java对象,简化数据处理。 6. **源码学习价值:** - 深入理解XML到Java...

    Digester解析XML文件

    3. **配置Digester**:在Config.java中,实例化Digester对象,然后添加规则。例如,你可以使用`addRule()`或`addRuleSet()`方法,指定当XML中的`&lt;student&gt;`元素出现时,创建一个Student对象并设置其属性。 4. **...

    commons-digester3-3.2-API文档-中文版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    commons-digester-2.1.jar

    `commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...

    commons-digester3-3.2-API文档-中英对照版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    使用Digester解析XML文档示例

    Digester能够根据定义好的规则自动将XML文档转换成Java对象,非常适合用在配置文件读取、数据交换等场景。 #### 二、Digester的基本原理 1. **SAX事件驱动**:Digester内部使用SAX事件模型来解析XML文档。当解析器...

    Digester的XML规则文件配置

    通过以上分析可以看出,使用`org.apache.commons.digester.xmlrules`包中的类,我们可以通过编写XML规则文件来灵活地控制Digester对XML数据的解析过程。这种方式不仅简化了代码的编写,还提高了程序的可维护性和扩展...

    我的tomcat7源码手撕过程

    - **初始化Digester**:通过`createStartDigester()`创建`Digester`实例,并定义了解析`server.xml`的规则。 - **解析配置文件**:`digester.parse(inputSource)`解析`server.xml`,将XML元素转换为对应的Java对象...

    commons-digester-2.0.rar源文件及jar文件

    在"commons-digester-2.0.rar"这个压缩包中,包含了"commons-digester-2.0-bin.zip"和"commons-digester-2.0-src.zip"两个子文件,分别对应着编译好的二进制库和源代码。 一、commons-digester-2.0-bin.zip 这个...

    digester解析xml的问题.pdf

    3. **解析 XML**:创建好 Digester 实例后,使用 `parse` 方法读取 XML 文件并执行预定义的规则。代码示例如下: ```java Digester digester = new Digester(); digester.setValidating(false); // 关闭验证,...

    digester解析xml必备包.rar

    3. **解析XML**:使用`parse`方法,传入XML文件的输入流,开始解析过程。 4. **处理结果**:解析完成后,根对象(通常是XML文档的顶级元素对应的Java对象)会被返回,其他对象可以通过根对象访问。 通过以上步骤,...

    使用digester配置rule.xml规则来解析自定义的xml文件-代码

    本篇文章将深入探讨如何使用Digester和`rule.xml`配置文件来解析自定义的XML文件。 首先,让我们了解什么是Apache Digester。Digester是一个开源库,它提供了从XML到Java对象的映射功能。通过定义一系列的“消化...

    digester组件简化了xml文件处理操作

    ### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...

Global site tag (gtag.js) - Google Analytics