一、web项目文件的目录结构
在tomcat中所有的应用都是放置在CATALINA_HOME/webapps下。由于Servlet2.2之后的版本规范规定,tomcat中应用的目录结构需要满足固定的格式,这样便于规范一致性。
放置在webapps下的文件通常是两种格式:一种压缩好的项目文件,比如war包!一种是正常的文件夹。如果是war包项目文件,tomcat会在启动后自动的把它解压缩到当前目录,变成可访问的文件夹。
项目文件的目录结构如下:
/apps |------/WEB-INF |------/classes 编译的字节码文件 |------/lib 需要的类库,jar包 ------web.xml |------/META-INF ------context.xml ------普通前端页面,jsp等等
1. web.xml 文件:
这个文件比较重要,也叫做部署描述符,用于配置web应用的相关信息。比较常用的是监听器,过滤器,servlet,session管理,初始化参数等。
需要注意的是:注意相同项的配置顺序,tomcat会按照配置顺序进行执行或者加载。需要注意的地方比如过滤器,还有一些页面的加载。
2. classes文件夹:
放置编译出的.class文件,比如你定义的某个包:com.test.hello.java 经过tomcat的启动发布后,就会在响应的应用下的classes文件夹下找到com/test/hello.class文件。类似的servlet, bean, 普通的java类都会编译到此处。
3. lib 文件夹:
放置项目应用的jar包。比如使用了SSH,在项目引用了jar包,最后都会放在这里。这个文件夹下的jar文件是不会编译到classes文件夹下的。详细信息参考tomcat的类加载机制。
这个文件夹下的jar包是属于应用自己使用的。tomcat根目录下还有一个lib文件夹,这里面存放着基本的servlet和jsp需要的jar包。
有时在IDE里面开发时,会莫名其妙的报一些错误。但是这些错误并不影响最后的发布。这是因为在开发时,IDE没有找到对应的jar包,这些jar包存放在tomcat中。当应用发布时,会自动的寻找该文件夹,也就不会报错了。解决办法就是在开发时,把tomcat的lib文件夹加入到IDE的编译环境中。
4. context.xml:
常用于配置一些运行时改变的参数,这样tomcat可以定期扫描该文件,进行相应的操作。
为什么要有这个文件呢?因为其他的配置文件如server.xml都是tomcat在启动时读取的信息,运行时是不能改变的。因此把一些动态的信息在这里设定就可以运行时期动态加载了。常用的就是配置数据源JNDI,其中详细的内容会在后文介绍配置文件的时候讲解。
二、web应用的部署、发布和测试
1、部署:其实就是把开发完的代码放在tomcat中。
-
记事本开发,就直接把文件拷贝到webapps下。
-
IDE开发,则需要把tomcat集成到IDE中,并配置代码的映射路径。在IDE中直接右键tomcat--->Add and Remove...,如下图:
如果发现不能把左边的项目添加到右边,并提示错误。则检查servelt的版本。通常是由于servlet与tomcat版本不一致导致,如tomcat6 仅支持2.5之前的servlet版本,以及1.5之后的JDK版本。
2、发布:就是把应用中的代码进行编译和组织,使用户可以直接访问。tomcat负责把代码进行编译组织,最后直接把一个可访问的应用摆在用户面前。发布方法有下面两种:
-
直接在tomcat中运行:运行startup.bat或者startup.sh文件。运行方法参考:tomcat启动
-
在IDE中启动:在server视图中右键tomcat选择start或者直接点击右上角的DEBUG或者START图标
3、测试:执行发布后,就可以登录浏览器,输入:http://localhost:8080/[webapp名字] 访问应用了。
其中的端口8080,可以通过server.xml或者IDE中配置界面修改,server.xml文档中也给出了线程池和SSL的配置方式。也可以在IDE中直接双击server视图中的tomcat选项,在弹出的配置界面,修改端口号,记得保存。
三、Tomcat部署详解
部署就是把web应用开发时的文件拷贝到tomcat容器中,并对其进行编译等操作,使用户可以访问到该应用。
1. 热部署和冷部署
冷部署:把WEB部署到Tomcat下,一般是把war包放到Tomcat的webapp目录下,然后启动Tomcat,这样就完成了项目的部署。但在这种方式下,Tomcat需要关闭。当一个Tomcat下部署了多个项目时,如果有其他项目正在运行,显然不能通过冷部署的方式。
热部署是指在你修改项目BUG的时候对JSP或JAVA类进行了修改在不重启WEB服务器前提下能让修改生效。不包括对配置文件的修改。
部署项目的三种方式:
1、直接把项目web文件夹放在webapps目录下。
/helle:项目的访问路径>虚拟目录
简化部署:将项目打成一个war包,再将war包拷贝到webapps目录,tomcat会自动解压war包。
2、配置tomcatconfserver.xml
文件
在<host>
标签体中配置Context标签,如<Context docBase="D:hello" path="hehe" />
,或者如下:
<Context debug="0" docBase="D:demo1web" path="/demo1" privileged="true" reloadable="true"/>
-
debug属性与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。 也就是程序异常时写入日志文件里的详细程度。
-
docBase:项目路径,可以使用绝对路径或相对路径,相对路径是相对于webapps
-
path:访问项目的路径,如:http://127.0.0.1:8080/demo1
-
reloadable:是否自动加载新增或改变的class文件。为true时,这类文件不需要重启tomcat,其他配置文件的修改需要重启tomcat。
3、第三种方式和第二种差不多,但是不是在Server.xml文件中添加Context标签,而是在 %tomcat_home%confCatalinalocalhost中添加一个XML文件,
如:demo1.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <Context docBase="D:demo1web" reloadable="true" />
这种方式服务器会使用xml文件的名字作为path属性的名字,访问地址为:http://localhost:8080/demo1
。如果你硬写个path="demo2"的话,是没有用的,tomcat会告诉你:“我不认得”。
2. 热部署和热加载
Tomcat 各容器组件实现的功能主要有:热部署热加载、类加载机制以及 Servlet 规范的实现。
要在运行的过程中升级 Web 应用,如果你不想重启系统,实现的方式有两种,都跟类加载机制有关:
-
热加载:实现方式是 Web 容器启动一个后台线程,定期检测类文件的变化,如果有变化,就重新加载类。在这个过程中不会清空 Session ,一般用在开发环境。
-
热部署:原理类似,也是由后台线程定时检测 Web 应用的变化,但它会重新加载整个 Web 应用。这种方式会清空 Session,比热加载更加干净、彻底,一般用在生产环境。
3. 静态部署和动态部署
参考博客:https://www.cnblogs.com/xing901022/p/4463896.html
在tomcat中有多种部署方式:
-
静态部署:直接拷贝相应的web展开目录、或者war包。(展开目录:就是tomcat可以直接访问的应用目录,是未经过压缩的。相反的就是war包,是一种经过压缩的web应用文件)。
-
动态部署:通过tomcat管理器或者其他工具(如TCD,tomcat client deployer)执行部署。
如果是使用静态部署,或者使用tomcat管理器进行部署是不需要安装任何东西的。
但是如果要使用TCD进行部署,那么就需要预先安装JDK和Ant,因为TCD中内置的是Ant的任务构建脚本;然后再下载TCD的部署包。
另外,还需要了解一个概念——上下文,Context。在tomcat中,上下文就是一个web应用。在之前的tomcat版本中,上下文信息是配置在server.xml中的,现在仍然可以,但是官方并不推荐这种做法。
上下文路径主要在:1 CATALINA_HOME/conf/容器名字/主机名字/应用名字.xml2 CATALINA_HOME/webapps/应用名字/META-INF/context.xml
其中路径1中:容器名字(enginename)通常为Catalina、主机名字为localhost。相关内容可以查看server.xml中:<Engine defaultHost="localhost name="Catalina">