- 浏览: 1032111 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
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();
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文件为
- <? 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 >
<?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 + "'" ;
- }
- }
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()); } }
部分解释以及在代码注释里。
发表评论
-
tomcat7.0.8的高级应用-apr1.4.2安装
2011-03-24 17:16 998一 windows下安装 直接 ... -
tomcat 7 源码分析-14 tomcat的container设计
2011-03-11 19:18 1565tomcat 7 源码分析-14 tomca ... -
tomcat 7 源码分析-13 处理request的Valve和Valve的链表Pipeline
2011-03-11 19:17 1143tomcat 7 源码分析-13 处理request的Val ... -
tomcat 7 源码分析-12 Enumeration枚举
2011-03-11 19:14 1265tomcat 7 源码分析-12 Enumeration枚举 ... -
tomcat 7 源码分析-11 tomcat对http协议的实现
2011-03-11 19:13 1422tomcat 7 源码分析-11 tomcat对http协议 ... -
tomcat 7 源码分析-10 线程池ThreadPoolExecutor
2011-03-11 19:12 2231tomcat 7 源码分析-10 线程池ThreadPool ... -
tomcat 7 源码分析-9 tomcat对ServerSocket的封装和使用
2011-03-11 19:11 1661tomcat 7 源码分析-9 tomcat对ServerS ... -
tomcat 7 源码分析-8 生命周期lifecycle和监听listener
2011-03-11 19:10 1406tomcat 7 源码分析-8 生命周期lifecycle和 ... -
tomcat 7 源码分析-7 server初始化中的JMX(DynamicMBean)再续
2011-03-11 19:09 1054tomcat 7 源码分析-7 server初始化中的JMX ... -
tomcat 7 源码分析-6 server初始化中的JMX(DynamicMBean)续
2011-03-11 19:08 1206tomcat 7 源码分析-6 server ... -
tomcat 7 源码分析-5 server初始化中的JMX(DynamicMBean)
2011-03-11 19:08 1376tomcat 7 源码分析-5 server初始化中的JMX ... -
tomcat 7 源码分析-4 server初始化背后getServer().init()
2011-03-11 19:06 1377tomcat 7 源码分析-4 server初始化背后get ... -
tomcat 7 源码分析-2 类加载ClassLoader
2011-03-11 19:04 1953tomcat 7 源码分析-2 类加载ClassLoader ... -
tomcat 7 源码分析-1 关于读取properties及注册系统properties
2011-03-11 19:02 1612tomcat 7 源码分析-1 关于读取properties ... -
Tomcat的四种基于HTTP协议的Connector性能比较
2011-03-11 17:58 1135Tomcat的四种基于HTTP协议的Connector性能比较 ...
相关推荐
【Tomcat源码分析_v4 完整版1】这篇文档主要探讨了Tomcat源码中的部分核心概念,包括XML解析框架Digester的工作原理及其在Java对象映射中的应用。以下是对这些知识点的详细说明: **Java对象创建与管理:** 在...
2. **读取配置**:在`Catalina.process()`方法中,首先创建`Digester`实例来读取`server.xml`配置文件,并将XML配置转换为Java对象,这是利用了`Digester`设计模式。 3. **组件初始化与启动**: - `server....
- **detail设置**:设置Digester的debug级别,Digester用于解析XML配置文件。 - **load-on-startup设置**:指示Web应用是否在启动时加载Servlet,以及加载的优先级。 通过以上详细的说明,可以看出SSH架构是如何...
- **作用**: 是一个轻量级的XML API,用于读取和写入XML文件,Hibernate使用它来解析配置文件和映射文件。 #### ehcache-1.2.jar - **作用**: Hibernate支持的二级缓存实现之一,如果未使用其他缓存方案,则此jar包...
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
内容概要:本文档主要针对含有质量平衡段(即弹性轴和重心重合点xa=0)的硬翼Flutter问题提供了MATLAB解决方案。文档通过迭代的方式对一系列参数(如频率比(fr)、弹性轴(E)和半径(r)等)进行操作,并利用贝塞尔函数(Kn)来评估flutter速度(UFhat),从而预测了不同质比(mu)下flutter的缩减速度变化情况。同时,文档包含了绘图命令以视觉展示减小颤振速度随质量比变化的趋势以及相应的MATLAB代码。 适合人群:航空工程、飞行器动力学领域的科研工作者,工程师及研究生。尤其是那些从事飞行安全性和稳定性研究的专业人士。 使用场景及目标:主要用于解决飞行器设计过程中遇到的具体颤振问题,能够为设计新型飞机或其他有翼飞行物体提供科学依据和技术支持。它还能够辅助教育,帮助相关专业的学生理解flutter现象及其预防措施。 其他说明:此文件是以数值方法探讨带质量平衡的翅膀颤振特性的实例,在工程上有着重要意义。对于希望深入学习此类问题的人来说,这是一个极好的参考资料和实验平台。然而,实际应用还需要进一步考虑真实条件下的复杂因素,因此需要更多的专业知识和背景资料的支持。
GUI面板MATLAB人脸识别系统
2023年全国计算机二级笔记.pdf
【人机交互】MATLAB水果成熟度分析
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 项目, 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
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
美联储在2024年9月18日宣布将其调50个基点,降至4.75%至5.00%之间的水平。这是美联储自2020年3月以来首次降息,也是自2023年7月将利率水平调升至历史高位后的首次下调,标志着货币政策由紧缩周期向宽松周期的转向 数据名称:美国联邦基金有效利率、目标利率历史数据 样本数量:12667条 数据年份:1990.1-2024.9 数据说明:包括有效利率、目标利率 更新日期:2024年9月
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
【工程项目】MATLAB车牌识别SVM方法,模板匹配太多人做了
【工程项目】MATLAB车牌出入库识别(GUI界面,计时计费,停车位计算,倾斜矫正)
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 (无前台不需要输入)
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 (无前台不需要输入)