1.前言

  找了很多篇文章,没有一篇文章讲的清晰、明了,很多人只是会用,但不是能真正说明白,这年头找个懂理论的,真难!  

2.热部署

  原定义:tomcat处于运行状态时,能够监测webapps下的文件,如果有新的web应用加入进来,会自运发布这个WEB应用。

  实现方式:将Host标签的autoPlay设置为true(这个是默认的)

   打开tomcat的server.xml,你会发现:有一个<Host>标签,如果你没有修改过,就应该是这样的:

 <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
...
</Host>

  Host标签,有属性"autoPlay",其值为"true",表示的含义是:

  如果此项设为true,表示Tomcat服务处于运行状态时,能够监测appBase下的文件,如果有新有web应用加入进来,会自动发布这个WEB应用。

  证明:

  第一步:启动tomcat服务器,且webapps目录下没有web项目

  第二步:往该目录下复制一个项目

  tomcat下执行结果:tomcat正在自动发布该项目

  第四步:将该项目从webapps目录下移除

  tomcat下执行结果:取消该部署项目

  对于热部署的延伸

  定义:对Java文件进行修改后,不需要重启tomcat服务器,即时生效,即:在运行时更新Java类文件。

  实现方式:在Host标签内添加Context标签

<!-- 方式一 -->
<Context docBase="D:\workspace-eclipse\yyproject_jmjkk\WebRoot" path="/test"/>
<!-- 方式二 -->
<Context docBase="D:\workspace-eclipse\yyproject_jmjkk\WebRoot" path="/test" reloadable="false"/>

  注意:

  声明reloadable属性时,值必须设置为false;

  如果开发工具是eclipse,必须eclipse中修改server.xml,原因见热加载。

  实现原理:

  以纯JavaWeb项目为例,

  Java文件修改后,需要编译成class文件,我们之所以没有进行手动编译,是因为依赖于eclipse的自动编译功能(这件事eclipse帮我们做了);

  编译好的class文件都会被放到WebContent/WebRoot/WEB-INF/classes目录下;

  tomcat的Context标签的docBase属性的值指定为web项目的发布目录(WebContent/WebRoot)后,启动tomcat后,tomcat会直接访问将该目录下的文件;

  只有debug模式下才会将其加载到tomcat容器中;

  对于jsp的更新:jsp每次被调用,tomcat容器都会通过ClassLoader重新加载相应的jsp编译后的class文件并装载到JVM中;

  对于Java类的更新:当监听到class文件被修改后,通过动态修改内存中的字节码,将修改过的class文件再次装载到JVM中。

3.热加载

  当Context标签的reloadable属性的值为true时,就实现了热加载。

  定义:tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用。 

  前提:只有在debug模式下,该属性才起作用,普通模式下,就算你reloadable="true",也不会生效(class文件不会被更新,tomcat不会重启)。

  不推荐使用:因为只要你一修改代码,都自动会重启tomcat,我们必须等待项目重启后才能操作,简直是浪费时间。

  在debug模式下,修改完class文件后,即使不重启tomcat,jvm也会即时生效(tomcat自动将更新后的文件装载到JVM)。

  如何关闭tomcat的重启?

  打开运行项目的tomcat的配置文件,server.xml

  将你已经发布的项目对应的Context标签中的reloadable的值改为false,以debug模式重启tomcat即可。

  

  说明:必须在eclipse中修改server.xml,不要跑到tomcat的安装目录下修改该文件。

  因为eclipse中server.xml会覆盖tomcat本身自带的server.xml,所以就算你修改了也不会生效!

4.Context标签参数介绍

  <Context>代表了运行在<Host>上的单个Web应用;

  一个<Host>可以有多个< Context>元素,一个Context代表一个web应用;

  每个Web应用必须有唯一的URL路径,这个URL路径在<Context>中的属性path中设定。
  <Context path="/helloApp" docBase="helloApp" reloadable="false"/>
  <Context>元素的属性介绍:
  path:指定访问该Web应用的URL入口;

    a.可以自定义访问项目的请求路径;b.该参数不能省略;c.该参数的值不能为空。
  docBase:指定Web应用的文件路径,可以给定绝对路径,也可以给定相对于<Host>的appBase属性的相对路径,

  如果Web应用采用开放目录结构,则指定Web应用的根目录,如果Web应用是个war文件,则指定war文件的路径。

    绝对路径构成:"项目的路径"+"WebRoot/WebContent即WEB-INF的上级目录"
  reloadable:WEB-INF/classes和WEB-INF/lib目录下class文件内容发生改变时,是否重新发布

    如果这个属性设为true,tomcat服务器在运行状态下会监视在WEB-INF/classes和WEB-INF/lib目录下class文件的改动,如果监测到有class文件被更新的,服务器会自动重新加载Web应用 ,也就是热加载;    

UpdateTime--2016年12月25日09:19:24

好处:可以减少启动tomcat次数  

说明:xml文件在项目启动时,会将其加载到内存中,其他文件修改信息后可以不用重新发布
  其中,下面指定文件的内容发生变化时,不需要重启tomcat
  *.jsp文件
  *.js文件 -->如果有缓存,可以采用问号传参的方式避免缓存,在引入该文件的jsp页面后添加"?v=111",例:
    <script type="text/javascript" src="<c:url value="/xnh/server/monitor/appro/hosappro_index.js?v=111"/>"></script>
  *.java文件 -->这种只适合修改方法里的内容,如果内容发生变化,提示需要重启tomcat,则需要重启
  *.grf文件
注意:
  *.xml,*.properties文件内容发生变化时,需要重启tomcat才能生效
这种加载项目的方式与将项目发布到tomcat的区别:  

  区别一:上面指出的好处
  区别二:

    加载的项目会随着的tomcat的启动和关闭而产生或死亡,不会留下任何痕迹(work文件夹除外),而将项目发布到tomcat的方式,实际上是将项目发布到tomcat指定的发布目录webapps文件夹,所以当切换运行项目时,采用热部署的方式不会运行额外的项目,而采用发布的方式则需要将清理webapps文件夹才能保证只加载该项目到tomcat中

  区别三:启动多个项目的方式不同    

  启动前准备工作:
    在多个项目中的web.xml文件中添加配置

<context-param>
<param-name>webAppRootKey</param-name>
<param-value>jmyb_ty</param-value>
</context-param>
<!-- <param-value>该参数值需确保唯一性</param-value> -->  

  热部署方式可以同时启动多个项目,只需要在server.xml文件中配置多个<Context></Context>标签即可;
  采用发布方式,需先多次启动将项目依次发布到webapps文件夹中,然后启动tomcat。

具体配置:
  MYECLIPSE  

  找到tomcat的安装路径:D:\ProgramFiles\apache-tomcat-7.0.68-->config文件夹-->server.xml-->在<Host></Host>标签里添加<Context></Context>标签-->
ECLIPSE
  在eclipse中,左侧视图-->Server-->对应的tomcat-->server.xml-->在<Host></Host>标签里添加<Context></Context>标签-->

举例:

<Context docBase="D:\WorkSpaces\eclipse2016\demo1\WebContent" path="/demo" reloadable="false">
</Context>

注意:

  a.<Context></Context>标签的"C"一定得大写;

  b.其中,<Context></Context>标签中可以配置数据库连接池,详情见文章tomcat连接数据库

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

相关推荐:

 

最新文章

  1. C#区分多态和重载-delphi也类似
  2. C#之 Lambda表达式
  3. 线程本地变量ThreadLocal源码解读
  4. chgrp 简明笔记
  5. JMS学习(一)基本概念
  6. jsp 页面 性别回显
  7. java中自动装箱带来的性能问题
  8. 搭建简易的c语言与python语言CGI和Apache服务器的开发环境
  9. Python——Socket编程
  10. How to remove unwant Explorer Context Menu
  11. 5.21http网页基础
  12. SQL存储过程使用参考代码
  13. 执行Docker命令报错解决办法
  14. 触摸事件UITouch的应用
  15. Google Spanner vs Amazon Aurora: Who’ll Get the Enterprise?
  16. 【beta】Scrum站立会议第6次....11.8
  17. JavaScript中文拼音排序函数
  18. QT (QSS) 编程, QSS语法概述。。setstylesheet
  19. bzoj 1257 余数之和 —— 数论分块
  20. IO模型与soketserver实现并发

热门文章

  1. Linux- systemd
  2. What is an OPC .NET Wrapper ?
  3. UI---------EventSystem
  4. windows下androidNDK环境配置
  5. 算法:图(Graph)的遍历、最小生成树和拓扑排序
  6. SSL协议具体解释
  7. 使用IP访问Mantis显示空白页的解决办法
  8. Lucene TFIDF打分公式
  9. [8] 圆面(Round)图形的生成算法
  10. 一行代码轻松实现拖动效果[JQuery]