Tomcat源码的catalina中利用Digester解析conf/server.xml

最近在学习Tomcat的源码,在catalina. createStartDigester方法中,Tomcat开发人员采用了Digester来读取conf/server.xml文件,以前读取xml文件一般采用Dom4j和SAX。由于对Digester比较陌生,所以今天抽时间研究了一下Digester是如何解析xml文件的。先简单阐述下Dom4j和SAX解析XML的却别:
Dom4j是把一个xml文件全部读取到内存中,构建成一个DOM树来解析,所以Dom4j适合读取比较小的xml文件。
SAX是基于文件流来解析xml文件的,在读取xml文件流时,SAX会通过节点来触发相应的操作,也可以说SAX是基于文件流的事情触发机制来解析xml文件的。
Digeter是apache的common项目,作用是将XML转化成对象,使用者直接从对象中获取xml的节点信息。Digester是对SAX的包装,它也是基于文件流来解析xml文件,只不过这些解析操作对用户是透明的。Tomcat的配置文件conf/server.xml就是用Digester来读取的。
一、 下载Digester的jar
(1) Digester的jar下载地址(版本:2.0)
http://commons.apache.org/digester/
(2) Digester依赖的Logging的jar下载地址(版本:1.1.1)
http://commons.apache.org/logging/
(3) Digester依赖的BeanUtils的jar下载地址(版本:1.8.3)
http://commons.apache.org/beanutils/
二、 关键方法说明
(1) serverDigester.addObjectCreate("Server","com.test.server.digester.Server")
当解析xml文件时,遇到“Server”就初始化一个“com.test.server.digester.Server”对象,并且把该对象压入栈顶
(2) serverDigester.addSetProperties("Server", "port", "port")
给Server对象注册port属性,当解析到Server节点的port属性时调用Server的setPort方法
(3) serverDigester.addSetNext("Server/Listener", "addListener","com.test.server.digester.Listener")
当解析Server节点下的Listener节点的时候,调用Server对象的addListener方法,把当前Listener对象写入到Server对象中。无论Server节点下有多少个Listener节点,都会调用addListener方法
(4) serverDigester.addCallMethod("Server/Service/Engine", "setEngine", 0)
Service中添加Engine,调用当前top object的setEngine函数,参数个数为0
addCallMethod与addBeanPropertySetter方法等价
三、 注意事项
Xml中定义的属性要与对象中set和get方法一致,比如xml中定义了一个节点属性“engineType”,那么在java对象的set方法必须为setEngineType,除了首字母外,其他字母必须一致,不然在解析的时候会解析不到对应的属性值。不知道是否还有其他规则,没有摸清楚。
根据提供的引用内容,可以看出问题出在conf/server.xml文件的某个Listener配置上,其可能包含了org.apache.catalina.core.AprLifecycleListener和org.apache.catalina.core.JasperListener这两个类的一个或者两个。而根据引用的错误提示,我们可以看出JasperListener这个类没有被找到,因此可以尝试注释掉server.xml文件的JasperListener配置,然后重启Tomcat服务器,看是否能够解决问题。 以下是具体步骤: . 打开conf/server.xml文件。 2. 找到类似于以下的一段配置: ``` <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <Listener className="org.apache.catalina.core.JasperListener" /> Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> ``` 3. 将其的JasperListener配置注释掉,即在该行前面加上“<!--”并在该行后面加上“-->”,如下所示: ``` <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!--<Listener className="org.apache.catalina.core.JasperListener" />--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> ``` 4. 保存server.xml文件,并重启Tomcat服务器。 5. 检查是否能够正常启动Tomcat服务器,如果能够正常启动,则说明问题已经解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值