以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的?

Tomcat部署webapps下项目方法位于:HostConfig#deployApps,别问怎么知道的,看源码,也可以支持看下我前面的博客,虽然介绍粗枝大叶,但是也能走到这步了。

介绍下deployApps,最开始获取两个配置,分别是catalina-home/webapps以及catalina-home/conf/Catalina/localhost路径,filterAppPaths方法呢主要是过滤webapps下不想部署的项目,比如你有些大项目以前部署的,现在不想用了,但是不想删除呢?就可以忽略部署来节省Tomcat启动时间,具体方式就是在server.xml中Host元素里添加属性deployIgnore,支持正则表达式过滤。

deployDescriptors、deployWARs是部署特定类型的项目,比如war包等,这里主要介绍的是deployDirectories,有兴趣的可以自行研究另外两种.

那我们明白了Tomcat部署项目还是得靠deployDirectories方法.

HostConfig#deployDirectories方法如下,思路清晰,先介绍个大体,webapps下每个项目,只要是文件夹的(名字不为META-INF\WEB-INF)的,都会通过多线程的方式去”部署项目”,(这里需要提及一点,怕引起误会,这里Tomcat默认给配置的ExecutorService初始线程个数、最大线程个数都是1,这个就尴尬了,是啥原因引起的无从而就,如果调大个数是否能提高销量有待确认!)下面开始一点点介绍这个“部署”过程.

第一步,介绍ContextName实例化

name是webapps下各个文件夹类项目的名字,FWD_SLASH_REPLACEMENT就是 # ,VERSION_MARKER就是 ## , 代码比较简单,直接看结果,比如webapps下doc目录,最后得到的四个属性值结果就是 baseName就是docs ,version就是 “”,path就是 /docs ,name就是 /docs , 其他正常项目名不含#都是类似,举两个个例:Root目录,baseName是Root,version就是“” , path就是 “”, name就是 “”  .

第二步.线程来调用DeployDirectory完成部署

DeployDirectory是HostConfig内部类,实现了Runnable,持有三重要属性:HostConfig--外部类实例,ContextName--上面初始化的上下文名称类,File---当前webapps下目录的File句柄

run方法是核心,一看还不是调用HostConfig#deployDirectory!

第三步. HostConfig#deployDirectory部署项目

代码比较长,分成片段来记录:  前几行打印日志,就是Tomcat常见到的日志如下.  然后  xml文件引用指向 webapps下当前正在部署的项目(暂叫A吧),xml指向A项目META-INF/content.xml文件,而xmlCopy指向 catalina-home/conf/Catalina/localhost/A.xml,copyThisXml默认是false,deployThisXML默认是true.

Deploying web application directory E:\Tomcat_Source_Code\apache-tomcat-8.0.53-src\catalina-home\webapps\docs

代码片段二. 截取了try-catch块前半段, 由于deployThisXML默认是true,但是我们假设content.xml不存在的情况,就会执行if判断逻辑最后一段,contextClass默认是StandardContext,所以实例化了一个StandardContext!

代码片段三. try-catch块后半段逻辑:configClass默认是ContextConfig,是个Tomcat的监听器,实例化后在StandardContext上监听着,此外StandardContext赋值四个ContextName的属性.

然后将StandardContext和StandardHost关联起来!  代码片段四.finally块做了一些收尾工作,这个留待时候再分析,先分析StandardContext与StandardHost的关联!

StandardHost和StandardContext关联起来步骤比较复杂!

先判断是否webapps是否有项目名解析之后name一样的,抛出异常来不允许这样做!将StandardContext父类设置为StandardHost,将StandardContext作为value,项目名name作为key存入StandardHost的 children属性中(这也说明StandardHost的getChildren肯定是调用children.values()来获取);   部署一个项目之后就会调用项目StandardContext#start方法,项目启动之后触发对应监听事件.  StandardContext#start简单分析见这里,Tomcat8源码笔记(九)组件StandardContext启动流程--未完待续

代码片段四.finally块

部署完成之后,最终达成这样的效果,将部署信息存放在HostConfig的deployed中,比如 /docs--对应部署信息.

大体流程粗糙的写了一遍,具体细节,类我还需要熟悉在记录吧。

 

 

Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目的更多相关文章

  1. Tomcat8源码笔记(三)Catalina加载过程

    之前介绍过 Catalina加载过程是Bootstrap的load调用的  Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...

  2. Tomcat8源码笔记(七)组件启动Server Service Engine Host启动

    一.Tomcat启动的入口 Tomcat初始化简单流程前面博客介绍了一遍,组件除了StandardHost都有博客,欢迎大家指文中错误.Tomcat启动类是Bootstrap,而启动容器启动入口位于 ...

  3. Tomcat8源码笔记(六)连接器Connector分析

    根据 Tomcat8源码笔记(五)组件Container分析 前文分析,StandardService的初始化重心由 StandardEngine转移到了Connector的初始化,本篇记录下Conn ...

  4. Tomcat8源码笔记(五)组件Container分析

    Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...

  5. Tomcat8源码笔记(四)Server和Service初始化

    上一章 简单说明下Tomcat各个组件: Server:服务器,Tomcat服务器,一个Tomcat只有一个Server组件; Service:业务层,是Server下最大的子容器,一个Server可 ...

  6. Tomcat8源码笔记(一)Lifecycle接口

    第一次阅读Tomcat8源码,就以Lifecycle作为笔记阅读的开篇吧,一千个读者就有一千个哈姆雷特,每个人都Tomcat的理解都不同,如果不记录一次Tomcat源码可能忘了就忘了. 断断DEBUG ...

  7. Tomcat8源码笔记(九)组件StandardContext启动流程--未完待续

    StandardContext代表的是webapps下项目,一个项目就是一个StandardContext,作为Tomcat组件的一部分,就会实现Lifecycle接口,被Tomcat管理着生命周期, ...

  8. Tomcat8源码笔记(二)Bootstrap启动

    TOMCAT源码调试入口是Bootstrap类的main方法,我的启动参数VM: -Dcatalina.home=E:/Tomcat_Source_Code/apache-tomcat-8.0.53- ...

  9. Tomcat8源码编译及导入Eclipse中研究

    最近因为需求需要修改Tomcat中的某些功能,无奈只能研究那部分源码然后稍作修改. 目前Tomcat最新版是8.0,下载了源码包,编译并导入Eclipse中研究比较方便. 1. Tomcat8源码编译 ...

随机推荐

  1. appium解决每次运行都需要安装Unlock以及AppiumSetting的问题

    这是我用appium遇到的第三个坑?之前因为环境的问题,chromedriver驱动总是安装不对,后来发现是因为路径的原因.解决之后,现在出现新的问题,那就是“appium每次运行都要去重新安装Unl ...

  2. 流量控制与RateLimiter

    一背景 如何提高系统的稳定性,简单来说除了加机器外就是服务降级.限流.加机器就是常说的分布式,从整个架构的稳定性角度看,一般SOA每个接口的所能提供的单位时间服务能力是有上限.假如超过服务能力,一般会 ...

  3. Ubuntu 16.04更新grub-pc提示脚本/var/lib/dpkg/info/grub-pc.postinst 执行错误

    错误信息: $ sudo aptitude upgrade 下列仅部分安装的软件包将被配置: grub-pc 将不会安装,升级或者删除任何软件包. 0 个软件包被升级,新安装 0 个, 0 个将被删除 ...

  4. mongdb的索引及备份

    1. mongodb的索引 1.1 为什么mongdb需要创建索引 加快查询速度 进行数据的去重 1.2 mongodb创建简单的索引方法 语法: db.集合.ensureIndex({属性:1}), ...

  5. MapGIS DataStore

    http://www.mapgis.com/index.php/index-show-tid-206.html 异构数据同时加载 DCServer感觉已经集成到 IGServer中了. >> ...

  6. sublime text3如何在浏览器预览?

    插件: view-in-browser CTRL + ALT + V 打开浏览器 默认打开firefox,settings里面可修改. Sublime Text - View In Browser V ...

  7. UE4动画及相关物理的更新顺序图

  8. python猜数字游戏console版本

    加入python学习小组后的第一次作业,python GUI写猜数字游戏.由于加班比较多,第一步先实现console版本,下一步再实现GUI版本. 虽然猜数字游戏是个小游戏,但是涉及到的基础知识点还是 ...

  9. 点击a标签的文字后页面的跳转

    1.方法一 (1)js var html=""; html+="<a href=\"#\" onclick=\check('"+id+ ...

  10. tomcat服务器怎样远程调试

    适合windows系统 1.首先tomcat/bin目录下startup.bat打开最前面添加以下代码: SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Dj ...