`
zhaohaolin
  • 浏览: 1032111 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

 

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

 

Java代码  收藏代码
  1. public   void  load() {  
  2.   
  3.         long  t1 = System.nanoTime();  
  4.         initDirs();  
  5.         initNaming();  
  6.         Digester digester = createStartDigester();  
  7.         ........  
  8.        digester.push(this );  
  9.        digester.parse(inputSource);  
  10.         ........  
  11.         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对象。形同:

 

Java代码  收藏代码
  1. // Configure the actions we will be using   
  2. digester.addObjectCreate("Server" ,  
  3.                          "org.apache.catalina.core.StandardServer" ,  
  4.                          "className" );  
  5. digester.addSetProperties("Server" );  
  6. digester.addSetNext("Server" ,  
  7.                     "setServer" ,  
  8.                     "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文件为

 

Xml代码  收藏代码
  1. <? xml   version = "1.0" ?>   
  2. < catalog   library = "somewhere" >   
  3.    < book >   
  4.       < author > Author 1 </ author >   
  5.       < title > Title 1 </ title >   
  6.    </ book >   
  7.    < book >   
  8.       < author > Author 2 </ author >   
  9.       < title > His One Book </ title >   
  10.    </ book >   
  11.    < book >   
  12.       < author > Author 3 </ author >   
  13.       < title > His Other Book </ title >   
  14.    </ book >   
  15. </ catalog >   
<?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

 

Java代码  收藏代码
  1. package  com.xiao;  
  2.   
  3. public   class  Book {  
  4.        private  String author;  
  5.        private  String title;  
  6.   
  7.        public  Book() {}  
  8.   
  9.        public   void  setAuthor( String rhs ) { author = rhs; }  
  10.        public   void  setTitle(  String rhs ) { title  = rhs; }  
  11.          
  12.        public  String getAuthor(  ) {  return  author; }  
  13.        public  String getTitle(  ) {  return  title; }  
  14.          
  15.        public  String toString() {  
  16.           return   "Book: Author='"  + author +  "' Title='"  + title +  "'" ;  
  17.        }  
  18.     }  
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

 

Java代码  收藏代码
  1. package  com.xiao;  
  2. import  java.util.Vector;  
  3. public   class  Catalog {  
  4.    private  Vector<Book> books;  
  5.   
  6.    public  Catalog() {  
  7.       books = new  Vector<Book>();  
  8.    }  
  9.    public   void  addBook( Book rhs ) {  
  10.       books.addElement( rhs );  
  11.    }  
  12.    public  String toString() {  
  13.       String newline = System.getProperty( "line.separator"  );  
  14.       StringBuffer buf = new  StringBuffer();  
  15.       buf.append( "--- Books ---"  ).append( newline );  
  16.       for int  i= 0 ; i<books.size(); i++ ){  
  17.           Book book  = books.elementAt(i);  
  18.          buf.append( book.toString()).append( newline );  
  19.       }  
  20.       return  buf.toString();  
  21.    }  
  22. }  
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

 

Java代码  收藏代码
  1. package  com.xiao;  
  2. import  java.io.IOException;  
  3. import  org.apache.tomcat.util.digester.Digester;  
  4. import  org.xml.sax.SAXException;  
  5.   
  6. public   class  CreateCatalog {  
  7.     protected   Catalog ct;  
  8.       
  9.     public   void  SetCatalog(Catalog ol){  
  10.           
  11.         ct = ol;  
  12.     }  
  13.       
  14.     public  Catalog GetCatalog(){  
  15.           
  16.         return   this .ct;  
  17.     }  
  18.     public  String toString() {  
  19.           
  20.         return  ct.toString();  
  21.         }  
  22.       
  23.     public  Digester createStartDigester() throws  IOException, SAXException  
  24.     {  
  25.         Digester digester = new  Digester();  
  26.         digester.setValidating( false  );  
  27.         //解析XML时,遇到catalog,就实例化一个com.xiao.Catalog对象,并且压栈   
  28.         digester.addObjectCreate( "catalog" "com.xiao.Catalog" );  
  29.         //对catalog,调用栈的次top对象(现在还没有压入,父对象)的SetCatalog函数。   
  30.         //passing the element that is on the top of the stack, which must be of type com.xiao.Catalog   
  31.         //This is the rule that causes the parent/child relationship to be created.   
  32.         digester.addSetNext("catalog" "SetCatalog" "com.xiao.Catalog" );  
  33.           
  34.         digester.addObjectCreate( "catalog/book" , "com.xiao.Book" );  
  35.           
  36.         //对rule,调用当前top object的setAuthor函数,参数个数为1   
  37.         digester.addCallMethod("catalog/book/author" "setAuthor" , 1 );  
  38.         //对rule,添加第一个参数值   
  39.         digester.addCallParam("catalog/book/author" 0 );  
  40.         digester.addCallMethod("catalog/book/title" "setTitle" , 1 );  
  41.         digester.addCallParam("catalog/book/title" 0 );  
  42.         //此时次top的object就是com.xiao.Catalog,调用它的addBook函数,将com.xiao.Book传入   
  43.         digester.addSetNext("catalog/book" "addBook" "com.xiao.Book" );  
  44.           
  45.         return  (digester);  
  46.     }  
  47. }  
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

 

Java代码  收藏代码
  1. package  com.xiao;  
  2.   
  3. import  org.apache.tomcat.util.digester.Digester;  
  4. import  org.xml.sax.InputSource;  
  5. import  org.xml.sax.SAXException;  
  6.   
  7. import  java.io.*;  
  8. public   class  TestDigester {  
  9.       
  10.     public   static   void  main(String[] args)  throws  IOException, SAXException  {  
  11.         // TODO Auto-generated method stub   
  12.         CreateCatalog cc = new  CreateCatalog();  
  13.         Digester digester = cc.createStartDigester();     
  14.         String configFile = "xiapingtest/ts.xml" ;     
  15.         InputSource inputSource = null ;  
  16.         InputStream inputStream = null ;  
  17.         File file = new  File(System.getProperty( "user.dir" ),configFile);  
  18.         inputSource = new  InputSource( "file://"  + file.getAbsolutePath());  
  19.         inputStream = new  FileInputStream(file);  
  20.         inputSource.setByteStream(inputStream);  
  21.         //在加入CreateCatalog对象,这个是第一个压入的对象   
  22.         digester.push(cc);  
  23.         //处理xml文件,逐个加入对象   
  24.         digester.parse(inputSource);          
  25.         System.out.println(cc.toString());  
  26.     }  
  27.   
  28. }  
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());
	}

}

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

分享到:
评论

相关推荐

    Tomcat源码分析_v4 完整版1

    【Tomcat源码分析_v4 完整版1】这篇文档主要探讨了Tomcat源码中的部分核心概念,包括XML解析框架Digester的工作原理及其在Java对象映射中的应用。以下是对这些知识点的详细说明: **Java对象创建与管理:** 在...

    Tomcat的架构和设计

    2. **读取配置**:在`Catalina.process()`方法中,首先创建`Digester`实例来读取`server.xml`配置文件,并将XML配置转换为Java对象,这是利用了`Digester`设计模式。 3. **组件初始化与启动**: - `server....

    Struts+Spring+Hibernate框架说明文档

    - **detail设置**:设置Digester的debug级别,Digester用于解析XML配置文件。 - **load-on-startup设置**:指示Web应用是否在启动时加载Servlet,以及加载的优先级。 通过以上详细的说明,可以看出SSH架构是如何...

    Java开发中常用jar包的作用

    - **作用**: 是一个轻量级的XML API,用于读取和写入XML文件,Hibernate使用它来解析配置文件和映射文件。 #### ehcache-1.2.jar - **作用**: Hibernate支持的二级缓存实现之一,如果未使用其他缓存方案,则此jar包...

    基于ssm+vue的垃圾分类网站(java毕业设计,包括源码,数据库,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SSM 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:vue/html5 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    Flutter分析:带有质量平衡部分机翼的MATLAB计算(含Elastic轴与中心对齐)

    内容概要:本文档主要针对含有质量平衡段(即弹性轴和重心重合点xa=0)的硬翼Flutter问题提供了MATLAB解决方案。文档通过迭代的方式对一系列参数(如频率比(fr)、弹性轴(E)和半径(r)等)进行操作,并利用贝塞尔函数(Kn)来评估flutter速度(UFhat),从而预测了不同质比(mu)下flutter的缩减速度变化情况。同时,文档包含了绘图命令以视觉展示减小颤振速度随质量比变化的趋势以及相应的MATLAB代码。 适合人群:航空工程、飞行器动力学领域的科研工作者,工程师及研究生。尤其是那些从事飞行安全性和稳定性研究的专业人士。 使用场景及目标:主要用于解决飞行器设计过程中遇到的具体颤振问题,能够为设计新型飞机或其他有翼飞行物体提供科学依据和技术支持。它还能够辅助教育,帮助相关专业的学生理解flutter现象及其预防措施。 其他说明:此文件是以数值方法探讨带质量平衡的翅膀颤振特性的实例,在工程上有着重要意义。对于希望深入学习此类问题的人来说,这是一个极好的参考资料和实验平台。然而,实际应用还需要进一步考虑真实条件下的复杂因素,因此需要更多的专业知识和背景资料的支持。

    GUI面板MATLAB人脸识别系统.zip

    GUI面板MATLAB人脸识别系统

    2023年全国计算机二级笔记.pdf

    2023年全国计算机二级笔记.pdf

    【人机交互】MATLAB水果成熟度分析.zip

    【人机交互】MATLAB水果成熟度分析

    基于SSM+JSP的个人交友网站+数据库(Java毕业设计,包括源码,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:jsp 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    Java毕业设计-SpringBoot+Vue的车辆充电桩(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    2023年秋季学期公共课计算机基础与应用.pdf

    2023年秋季学期公共课计算机基础与应用.pdf

    基于SSM+JSP的多用户博客个人网站+数据库(Java毕业设计,包括源码,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:jsp 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    联邦基金目标利率数据.xlsx

    美联储在2024年9月18日宣布将其调50个基点,降至4.75%至5.00%之间的水平。这是美联储自2020年3月以来首次降息,也是自2023年7月将利率水平调升至历史高位后的首次下调,标志着货币政策由紧缩周期向宽松周期的转向 数据名称:美国联邦基金有效利率、目标利率历史数据 样本数量:12667条 数据年份:1990.1-2024.9 数据说明:包括有效利率、目标利率 更新日期:2024年9月

    基于SpringBoot+Vue的招聘信息管理系统 (2)(Java毕业设计,包括源码、数据库、教程).zip

    Java 项目,仅供学习参考。 Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    Delpih 12.3控件之ddj-installer-20250211.zip

    Delpih 12.3控件之ddj_installer_20250211.zip

    【工程项目】MATLAB车牌识别SVM方法,模板匹配太多人做了.zip

    【工程项目】MATLAB车牌识别SVM方法,模板匹配太多人做了

    【工程项目】MATLAB车牌出入库识别(GUI界面,计时计费,停车位计算,倾斜矫正).zip

    【工程项目】MATLAB车牌出入库识别(GUI界面,计时计费,停车位计算,倾斜矫正)

    Java毕业设计-SpringBoot+Vue的结合疫情情况的婚恋系统(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    基于SpringBoot+Vue的生鲜超市管理的设计与实现 (2)(Java毕业设计,包括源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

Global site tag (gtag.js) - Google Analytics