香帅 2011-03-11
接下来tomcat要load了,看下面一些程序片段
public
 
void
 load() {  
  
        long
 t1 = System.nanoTime();  
        initDirs();  
        initNaming();  
        Digester digester = createStartDigester();  
        ........  
       digester.push(this
);  
       digester.parse(inputSource);  
        ........  
        getServer().init();  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"
);  // 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文件为
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 + 
"'"
;  
       }  
    }  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();  
   }  
}  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);  
    }  
}  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());  
    }  
  
}  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());
	}
}部分解释以及在代码注释里。