Tomcat(汤姆猫)就是一个典型的Web应用服务器软件,通过运行Tomcat服务器,我们就可以快速部署我们的Web项目,并交由Tomcat进行管理,我们只需要直接通过浏览器访问我们的项目即可。

下载地址 :https://tomcat.apache.org/download-10.cgi

环境变量配置

JRE_HOME,填写JDK的安装目录+/jre,比如Zulujdk默认就是:C:\Program Files\Zulu\zulu-8\jre

设置完成后,我们进入tomcat文件夹bin目录下,并在当前位置打开CMD窗口,将startup.bat拖入窗口按回车运行,如果环境变量配置有误,会提示,若没问题,服务器则正常启动。

在浏览器中访问:http://localhost:8080/,Tomcat服务器默认是使用8080端口(可以在配置文件中修改),访问成功说明我们的Tomcat环境已经部署成功了。

目录

整个Tomcat目录下,我们已经认识了bin目录(所有可执行文件,包括启动和关闭服务器的脚本)以及conf目录(服务器配置文件目录),那么我们接着来看其他的文件夹:

  • lib目录:Tomcat服务端运行的一些依赖,不用关心。
  • logs目录:所有的日志信息都在这里。
  • temp目录:存放运行时产生的一些临时文件,不用关心。
  • work目录:工作目录,Tomcat会将jsp文件转换为java文件(我们后面会讲到,这里暂时不提及)
  • webapp目录:所有的Web项目都在这里,每个文件夹都是一个Web应用程序:

我们发现,官方已经给我们预设了一些项目了,访问后默认使用的项目为ROOT项目,也就是我们默认打开的网站。

我们也可以访问或是docs项目,只需要在后面填写路径即可:(这个是Tomcat的一些文档)http://localhost:8080/docs/

关闭服务器就直接关闭窗口即可。

修改 Tomcat 编码

打开conf文件夹,找到logging.properties文件,这就是日志的配置文件(我们在前面已经给大家讲解过了)将ConsoleHandler的默认编码格式修改为GBK编码格式:

java.util.logging.ConsoleHandler.encoding = GBK

IDEA 配置 Tomcat

在File中选择Settings,然后在“Build,Execution,Deployment”中选择“Application Servers”,点击“+”,就可以看到Tomcat Server了。

添加 Web 项目

先建立一个空的,然后右键根目录添加框架:

选择 WebApplication 即可。

新建 Maven 的 JavaEE Web 项目

需要注意的是,Tomcat10以上的版本比较新,Servlet API包名发生了一些变化,因此我们需要修改一下依赖:

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>

原因:JavaEE

Tomcat 类加载机制

Tomcat本身也是一个Java程序,它要做的是去动态加载我们编写的Web应用程序中的类,实现了几种类加载器 :

  • Common ClassLoader:Tomcat最基本的类加载器,加载路径中的class可以被Tomcat容器本身以及各个Web应用程序访问。
  • Catalina ClassLoader:Tomcat容器私有的类加载器,加载路径中的class对于Web应用程序不可见。
  • Shared ClassLoader:各个Web应用程序共享的类加载器,加载路径中的class对于所有Web应用程序可见,但是对于Tomcat容器不可见。
  • Webapp ClassLoader:各个Web应用程序私有的类加载器,加载路径中的class只对当前Web应用程序可见,每个Web应用程序都有一个自己的类加载器,此加载器可能存在多个实例。
  • JasperLoader:JSP类加载器,每个JSP文件都有一个自己的类加载器,也就是说,此加载器可能会存在多个实例。

这些类加载器就实现了不同应用程序之间的隔离,并且让共同使用的依赖可以只加载一次等等功能。但这样的类加载机制似乎破坏了 JDK 的双亲委派机制,比如 Webapp ClassLoader 只加载自己的 Class 文件,没有将类给父加载器加载,意味着我们可以创建和JDK同包同名的类?

实际上,WebAppClassLoader的加载机制是这样的:WebAppClassLoader 加载类的时候,绕开了 AppClassLoader,直接先使用 ExtClassLoader 来加载类。这样的话,如果定义了同包同名的类,就不会被加载,而如果是自己定义 的类,由于该类并不是JDK内部或是扩展类,所有不会被加载,而是再次回到WebAppClassLoader进行加载,如果还失败,再使用AppClassloader进行加载。