Tomcat文件夹下的context.xml和web.xml

Tomcat文件夹下conf文件夹中的context.xml文件存在的目的是什么?

  • 首先,你要明白一点,tomcat的工作原理是什么?也是一个Java程序,是一个网络服务。那么,webapp是如何嵌入的?反射。
  • webapp是如何加载的?webapp的入口? 是servlet和过滤器以及监听器。这是一个webapp的入口。
    一个webapp又被称为什么?在tomcat中被抽象成什么对象?是ServletContext。
    假如,你的tomcat下部署了两个webapp。最终你的tomcat中是不是管理了两个ServletContext对象。每一个对象代表一个webapp。

  • 现在的问题是,为什么建立2个,而不是3个?tomcat启动之后为什么会建立这样两个对象?Tomcat文件夹的conf文件夹中的server.xml里面配置了context标签。当tomcat启动的时候,会读取这个文件。发现配置了2个context,那么就应该建立两个ServletContext对象。

  • 为什么不同的url会跑到不同的ServeltContext?因为path,context标签下是不是指定了path,这样,在tomcat内部就是维护了一个map。每个context对应一个path,这样,tomcat接受到请求,读取url,就会把这个请求交给指定的ServletContext。但是,ServletContext粒度很大,一个ServeltContext下管理了很多个serlet,还需要进一步路由。这个路由规则由谁指定?是不是每个ServletContext内部,还会维护一个路由,这个路由就是每个项目的WEB-INF文件夹下的web.xml。也就是说项目里的web.xml 是来管理自己项目中的东西的。某个具体项目的WEB-INF文件夹下的web.xml的范围是这个项目ServletVontext的内部级别。

    WEB-INF文件夹下的web.xml是不是配置了不同的sevlet的mapping,全部由这个文件来指定。那么,tomcat为什么知道是这个文件?这些都需要tomcat这个java程序来读取、来分配、来指定规则,因为Tomcat文件夹下的conf文件夹中的context.xml中指定了这个web.xml的路径,

<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

假如你把第一行改了,你改成web2.xml。那么,你的webapp中也要相应的改成web2.xml

Tomcat文件夹下conf文件夹中的web.xml文件和自己项目下的web.xml关系

  • 举一个例子,一个url请求并非一定访问一个自定义的serlet。比如静态资源,比如jsp,访问这样资源的url,没有访问你写的servlet吧。那么,tomcat怎么可以准确的路由过去呢?
  • 你会说因为我的html静态文本就放在根目录指定的目录结构,所以url和他匹配,当然会加载咯。这是一种自然的想法吧。
  • 你肯定会问这个servlet在哪里?
  • 答案就是Tomcat文件夹下的中的conf文件夹下的web.xml。他是所有的webapp中的web.xml的父亲,所有的webapp中的web.xml都会继承此文件中的内容。如果子自己项目里的web.xml配置了一样的,会覆盖父亲。现在还以为静态资源是自然根据url路径匹配吗?不一定的,你可以覆盖,写你自己的规则。那tomcat为什么要提供这个默认的web.xml给我们继承呢?因为我上面说的这些静态资源呀什么的对于所有的webapp都是一个基本功能。如果他不提供,你就要自己实现,实现静态文件的url匹配返回客户端。这是不是很艰难?好多静态资源和其他通用的资源,能不让编程人员再次写url,就不让多次做重复的工作,减轻编程人员的负担。抽取共同功能,造成可重用性。
  • 这个和面向对象的继承没关系,有共性。就是继承的那种意思,你也可以当做是拼接,两个web.xml拼接在一起。实际上,和面向对象的继承区别很大的,面向对象继承那些有什么多态。也就是,把常用的东西抽取出来,就成了conf文件夹下的web.xml;然后再和自己写的项目里的web.xml拼接起来。

    —————————————-本文来自某位大神的分享————————————

猜你喜欢

转载自blog.csdn.net/yucdsn/article/details/78729912
今日推荐