首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

Tomcat7起步分析(三)Digester的使用

2013-08-01 
Tomcat7启动分析(三)Digester的使用前一篇文章里最后看到Bootstrap的main方法最后会调用org.apache.catali

Tomcat7启动分析(三)Digester的使用

前一篇文章里最后看到Bootstrap的main方法最后会调用org.apache.catalina.startup.Catalina对象的load和start两个方法,那么就来看看这两个方法里面到底做了些什么。

?

load方法:

?

这个110行的代码看起来东西挺多,把注释、异常抛出、记录日志、流关闭、非空判断这些放在一边就会发现实际上真正做事的就这么几行代码:

?

Digester的使用一般来说有4步:1.实例化一个Digester对象,并在对象里设置相应的节点解析规则。2.设置要解析的文件作为输入源(InputSource),这里InputSource与SAX里的一样,用以表示一个xml实体。3.将当前对象压入栈,4.调用Digester的parse方法解析xml,生成相应的对象。第3步中将当前对象压入栈中的作用是可以保存一个到Digester生成的一系列对象直接的引用,方便后续使用而已,所以不必是当前对象,只要有一个地方存放这个引用即可。

再说下上面例子中的createStartDigester方法,第27行实例化一个Digester对象,第30行设置为false表示解析xml时不需要进行DTD的规则校验,第33行的意思是如果xml中相应节点没有设置解析规则会在控制台显示提示信息,第36到40行是将xml节点中的className 作为假属性,不必调用默认的setter方法(一般的节点属性在解析时将会以属性值作为入参调用该节点相应对象的setter方法,而className属性的作用是提示解析器用该属性的值来实例化对象),第42行addObjectCreate方法的意思是碰到xml文件中的Server节点则创建一个org.study.digester.MyStandardServer对象,第44行是根据Server节点中的属性信息调用相应属性的setter方法,以上面的xml文件为例则会调用setPort、setShutdown方法,入参分别是8005、SHUTDOWN,第45行的意思是将Server节点对应的对象作为入参调用栈顶对象的setMyServer方法,这里的栈顶对象即第81行所设置的当前类的对象this,就是说调用MyDigester类的setMyServer方法。下面几段代码的作用与42到46类似,只是在碰到xml文件的不同节点时产生不同的对象,并调用相应的方法,如第48行在碰到xml的Server节点下的Listener节点时取className属性的值作为实例化类实例化一个对象等等,不再赘述。

这里有必要说明的是很多文章里按照代码顺序来描述Digester的所谓栈模型来讲述addSetNext方法时的调用对象,实际上我的理解addSetNext方法具体哪个调用对象与XML文件里的节点树形结构相关,当前节点的父节点是哪个对象该对象就是调用对象。因为把这里的代码顺序打乱仍然可以按规则解析出来,createStartDigester方法只是在定义解析规则,具体解析与addObjectCreate、addSetProperties、addSetNext这些方法的调用顺序无关。

该示例的代码在附件中,将其放入tomcat7的源代码环境中即可直接运行。

?

看懂了上面的例子Catalina的createStartDigester方法应该就可以看懂了,它只是比示例要处理的节点类型更多,并且增加几个自定义的解析规则,如384行在碰到Server/GlobalNamingResources/节点时将会调用org.apache.catalina.startup.NamingRuleSet类中的addRuleInstances方法添加解析规则。

?

要解析的XML文件默认会先找conf/server.xml,如果当前项目找不到则通过其他路径找xml文件来解析,这里以默认情况为例将会解析server.xml

?

?

?

这样经过对xml文件的解析将会产生org.apache.catalina.core.StandardServer、org.apache.catalina.core.StandardService、org.apache.catalina.connector.Connector、org.apache.catalina.core.StandardEngine、org.apache.catalina.core.StandardHost、org.apache.catalina.core.StandardContext等等一系列对象,这些对象从前到后前一个包含后一个对象的引用(一对一或一对多的关系)。

?

解析完xml之后关闭文件流(第627行),接着设置StandardServer对象(该对象在上面解析xml时)的catalina的引用为当前对象,这种对象间的双向引用在Tomcat的很多地方都会碰到。

?

接下来将调用StandardServer对象的init方法。

?

上面分析的是Catalina的load方法,上一篇文章里看到Bootstrap类启动时还会调用Catalina对象的start方法,代码如下:

这里最主要的是调用StandardServer对象的start方法。

?

经过以上分析发现,在解析xml产生相应一系列对象后会顺序调用StandardServer对象的init、start方法,这里将会涉及到Tomcat的容器生命周期(Lifecycle),关于这点留到下一篇文章中分析。

热点排行