现在的位置: 首页 > 综合 > 正文

How Tomcat Works 15

2018年05月22日 ⁄ 综合 ⁄ 共 4506字 ⁄ 字号 评论关闭
 

 

Digester是一个能把xml结点转化成java对象的工具,就像hibernate把数据库表转化成java对象一样。

关于Digester的用法参考书中的介绍,这里只讲tomcat对digester的用法。

 

在tomcat中,server.xml和web.xml都是用这个工具转化的。如果不用digester,我们可能会在程序中new出很多对象,然后设置它们的属性,再与其它对象关联,而现在,只需要写一个xml文件,设定它的格式,然后用digester解析,就可以得到所有的一切。这样减少了硬编码,而增加了灵活性。

 

一,先说解析web.xml。在ContextConfig的start方法中:

 

 

defaultConfig负责读取%CATALINA_HOME%/conf下的web.xml,applicationConfig负责读取web app下的web.xml。因为web.xml中的格式是一样的,所以在这里用了ruleSet。

这两个方法执行完毕后,此context就有了两个web.xml中定义的servlet的wrapper。%CATALINA_HOME%/conf下的web.xml定义了两个servlet,一个是用来处理静态资源的:

 

另一个是用来处理jsp的编译和处理的:

 

这两个servlet初始化时都有很多参数,详见该web.xml文件。

另外,它们的映射是:

 

 

 

当context找不到一个请求url的匹配servlet时,将会执行defaultservlet。关于url-pattern的匹配,见http://blog.csdn.net/forchase/archive/2009/05/08/4160226.aspx

 

1. 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /*
,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先
进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。
    
2.
最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此
时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。
     3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action
     4. 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet.

     5,如果两个servlet的url-pattern相同,将取在后面定义的,因为存储映射的是一个hashmap,在往里设值时,后设的会把先设的覆盖;注意,如果app的web.xml里的某pattern与conf下的web.xml中的某pattern相同,将取app下的web.xml中的配置,因为如前所述,在contextConfig里先调用的defaultConfig().

 

代码见StandardContextMapper中的map方法:

 

 

 

 

二,解析server.xml

解析server.xml是在catalina类的start方法里完成的,没什么特别,首先把this也就是catalina类push到digester的临时stack中,然后通过一系列rule设值。

在catalina的stop方法中,也用到了digester,用来得到server对象,并设置两个值:shutdown,port。所以,我们在server.xml中会看到:

 

在stop方法中,通过digester,得到server以及port,shutdown两个属性,然后在该port也就是8005建立一个socket客户端,发送“SHUTDOWN”到8005server端。还记得14章中说到过Server类中有个await方法一直等待关闭命令吗?这个对8005发送的“SHUTDOWN”就会使await方法跳出while循环,从而继续执行catalina start方法最后一段程序把server  stop掉。

 

这里就体现了digester,或者说sax解析xml的好处,同样的server.xml,start方法需要全部解析,而stop方法只需要解析到server结点,这样用sax来解析xml就不用读完整个xml了。

 

 

 

 

 

 

 

 

 

 

 

 

【上篇】
【下篇】

抱歉!评论已关闭.