`
zhaohaolin
  • 浏览: 1037372 次
  • 性别: 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包...

    改进A星算法:实现多个机器人与AGV小车路径规划与动态避障的完整Matlab代码

    内容概要:本文介绍了如何利用改进的A星算法实现多个机器人和AGV小车的路径规划与动态避障。主要内容分为四个部分:首先是环境创建,通过矩阵表示地图并在特定位置设定障碍物;其次是机器人(小车)位置设置,指定起始点和目标点;然后重点讲解了改进后的A星算法,在原有基础上增加了对其他机器人位置和路径的考量,以避免碰撞;最后展示了路径规划的具体步骤以及结果显示方式。此外,文中还提供了详细的代码片段,涵盖从环境构建到路径规划的全过程,并讨论了一些优化技巧如路径冲突检测、动态权重调整等。 适合人群:从事机器人导航系统开发的研究人员和技术爱好者,特别是那些希望深入了解路径规划算法及其应用的人群。 使用场景及目标:适用于需要解决多机器人协作任务的企业和个人开发者,旨在提高自动化设备在复杂环境中的自主行动能力,确保高效且安全地完成预定任务。 其他说明:作者强调了该方法对于仓储物流等行业的重要性,并指出传统A星算法在此类应用场景中存在的局限性。同时提醒读者关注Matlab版本兼容性和实际部署时可能遇到的问题。

    【Windows系统管理】创建任务计划实现软件开机自启动:任务计划配置与BAT脚本自动化方法详解

    内容概要:本文档详细介绍了三种在Windows系统中创建任务计划以实现软件开机启动的方法。第一种方法是通过任务计划创建,包括打开任务计划、设置常规参数、触发器和操作,最终实现软件在系统重启后自动启动;第二种方法是通过降低用户权限来避免软件启动时出现UAC权限询问弹窗,具体步骤为调整用户账户控制设置到最低级别;第三种方法是利用bat脚本创建任务计划,提供了详细的脚本代码,包含管理员权限检查、可配置变量设置、创建任务命令以及相关辅助命令,同时提醒用户注意安全软件可能对任务创建或执行的限制。 适合人群:适用于有一定Windows操作系统使用经验,特别是需要设置软件开机自启动的计算机用户或IT运维人员。 使用场景及目标:①希望在系统重启后自动运行特定软件的用户;②希望通过脚本批量部署开机启动任务的企业IT管理员;③解决软件启动时UAC权限弹窗问题的用户。 阅读建议:对于想要深入了解任务计划创建机制和bat脚本编程的读者来说,建议仔细研究第三种方案中的脚本代码及其说明部分,并尝试在测试环境中进行实践操作。对于普通用户,则重点掌握前两种简单易行的方法即可。

    COMSOL实现双孔单渗透瓦斯抽采:分析煤层内裂隙与基质渗流及应力分布

    内容概要:本文详细介绍了如何使用COMSOL软件构建并实现双孔单渗透瓦斯抽采模型,探讨了煤层内部基质和裂隙的应力分布与渗透率之间的关系。文章首先解释了双孔单渗透模型的基础概念,即瓦斯在基质和裂隙中的流动特性。随后,逐步展示了如何在COMSOL环境中搭建几何模型、定义物理场以及设置材料属性,特别关注了裂隙和基质渗透率的定义及其随应力变化的影响。此外,文章还讨论了多物理场耦合的方法,如将固体力学与地下水流模块相结合,以模拟应力对裂隙渗透率的影响。最后,通过对不同渗透率条件下瓦斯流速和压力分布的模拟,揭示了优化瓦斯抽采方案的关键因素。 适合人群:从事煤矿安全工程、瓦斯抽采研究的专业人士和技术人员。 使用场景及目标:适用于希望深入了解煤层内瓦斯流动机制的研究人员,旨在提高瓦斯抽采效率,确保煤矿生产的安全性和经济性。 其他说明:文中提供了详细的建模步骤和代码片段,帮助读者更好地理解和复现实验结果。同时,强调了模型验证和优化的重要性,提出了若干实用技巧以应对常见的建模挑战。

    Rust高性能日志滚动:RollingFileAppender.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    敏矽微ME32G030系列 keil 扩展包

    敏矽微ME32G030系列 keil 扩展包

    西门子S7-200 Smart PLC与台达MS300变频器及欧姆龙E5CC温控器通讯程序:昆仑通态触摸屏控制实现与扩展模块SB CM01通讯的集成方案

    内容概要:本文详细介绍了如何使用西门子S7-200 Smart PLC与台达MS300变频器和欧姆龙E5CC温控器进行Modbus RTU通讯的具体实现步骤。主要内容涵盖硬件连接、参数设置、PLC程序编写、触摸屏配置等方面。文中不仅提供了详细的参数配置指导,如波特率、数据格式等,还展示了具体的梯形图代码和注意事项,确保各个设备之间的稳定通讯。此外,还分享了一些常见的调试问题及其解决方案。 适合人群:具备一定PLC编程基础的技术人员,尤其是从事自动化控制系统集成工作的工程师。 使用场景及目标:适用于需要集成多种工业设备的自动化控制系统项目,帮助工程师快速掌握不同品牌设备间的通讯方法,提高系统集成效率,减少调试时间和成本。 其他说明:文中提到的所有设备均采用Modbus RTU协议进行通讯,硬件连接主要涉及RS485接口和以太网接口。对于初学者来说,建议先熟悉Modbus协议的基本概念和通讯机制,以便更好地理解和应用本文的内容。

    Rust内存安全指针:NonNull优化技巧.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    大作业自媒体上传需要文档

    大作业自媒体上传需要文档

    基于id=0控制的电机定子参数辨识方法——通过递推最小二乘法对R, ψf, Ls的仿真研究

    内容概要:本文详细介绍了基于id=0控制的电机参数辨识方法,主要采用递推最小二乘法(RLS)对电机定子电阻R、永磁磁链ψf及dq轴电感Ls进行在线辨识。文章首先阐述了id=0控制策略及其优势,接着展示了RLS算法的具体实现过程,包括参数初始化、增益矩阵计算、参数更新和协方差矩阵更新。文中还讨论了采样频率的选择、积分环节的优化以及噪声处理等问题,并通过仿真实验验证了该方法的有效性和稳定性。此外,作者分享了一些实践经验,如针对不同厂家电机的适应性调整和在线参数校验技巧。 适合人群:从事电机控制及相关领域的研究人员和技术人员,尤其是对永磁同步电机参数辨识感兴趣的读者。 使用场景及目标:适用于需要精确辨识电机参数的场合,如高性能电机控制系统的设计与优化。目标是帮助读者掌握RLS算法在电机参数辨识中的应用,提高电机控制系统的性能和可靠性。 其他说明:文章提供了详细的代码示例和仿真结果,便于读者理解和实践。同时强调了物理直觉在参数辨识中的重要性,指出理论模型与实际情况可能存在差异,需灵活应对。

    基于单片机的智能大棚浇花花盆设计:光照、温度和土壤湿度监测与控制系统

    内容概要:本文详细介绍了一个基于单片机的智能大棚与花盆浇花系统的硬件和软件设计方案。硬件方面,系统集成了单片机、光敏电阻、A/D模块PCF8591、DS18B20温度传感器、土壤湿度传感器、1602液晶显示屏、按键、高亮LED灯、补温灯、风扇、继电器和水泵等多种组件。软件部分采用C语言编写,实现了光照、温度和土壤湿度的检测与控制。具体来说,通过光敏电阻和PCF8591进行光照检测与补光控制;利用DS18B20进行温度检测,并根据温度范围控制补温灯和风扇;通过土壤湿度传感器和继电器控制水泵进行精准浇水。此外,还提供了按键设置阈值等功能,确保系统的灵活性和实用性。 适合人群:对嵌入式系统和智能农业感兴趣的电子爱好者、学生和初学者。 使用场景及目标:适用于家庭园艺、小型农场等场合,旨在提供一种低成本、高效的自动化灌溉和环境控制系统,帮助用户更好地管理和维护植物生长环境。 其他说明:文中还提到了一些常见的硬件注意事项和技术细节,如I2C通信、单总线协议、延时处理等,有助于读者理解和调试系统。

    Rust跨语言异常传播:panic处理.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    离合器外圈钻孔专用机床的设计与研究.pdf

    离合器外圈钻孔专用机床的设计与研究.pdf

    基于PLC控制的纯净水灌装生产饮料厂电控系统设计:梯形图程序、接线图与组态画面详解

    内容概要:本文详细介绍了基于PLC(三菱FX3U)的纯净水灌装线电控系统的设计与优化。首先解释了IO分配表的作用及其具体配置,接着深入剖析了梯形图程序的关键逻辑,包括启保停电路、灌装控制逻辑以及保护机制。此外,还探讨了硬件接线的注意事项,如传感器电源隔离、电机接触器保护等。组态画面设计方面,强调了操作便捷性和故障诊断功能。最后分享了一些调试过程中遇到的实际问题及解决方案,如电压骤降引起的随机波动、电磁阀关闭延迟等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC控制系统有兴趣的学习者。 使用场景及目标:适用于希望深入了解PLC控制系统设计原理及应用的技术人员。目标是掌握纯净水灌装线电控系统的完整设计流程,提高系统的稳定性和效率。 其他说明:文中提到的具体案例和实践经验有助于读者更好地理解和应对实际工程中的挑战。

    gaoliwei1102_multi_ML_emtion_analysis_csdn_2660_1746371732584.zip

    gaoliwei1102_multi_ML_emtion_analysis_csdn_2660_1746371732584

    Java企业级开发_SpringBoot_MyBatis_MySQL_Druid_Swagger_Lombok_FastJson_通用Mapper_分页插件_代码生成器_RESTf.zip

    Java企业级开发_SpringBoot_MyBatis_MySQL_Druid_Swagger_Lombok_FastJson_通用Mapper_分页插件_代码生成器_RESTf

    Delphi 12.3控件之RADStudio-12-3-29-0-55362-2017-KeyPatch.7z

    Delphi 12.3控件之RADStudio-12-3-29-0-55362-2017-KeyPatch.7z

Global site tag (gtag.js) - Google Analytics