How Tomcat Works 15

 

 

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了。

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值