快速入门这一篇就够了!Apache Tomcat 简单理解其原理以及使用

有了坚持不一定成功;但没有坚持,就注定失败。对于成功,坚持的塑造必不可少!

在这里插入图片描述

一、概念

Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。
在这里插入图片描述

二、原理

Tomcat结构图:
在这里插入图片描述

Tomcat主要组件:服务器Server,服务Service,连接器Connector、容器Container, 连接器Connector和容器Container是Tomcat的核心

一个Container容器和一个或多个Connector组合在一起,加上其他一些支持的组件共同组成一个Service服务,有了Service服务便可以对外提供能力了,但是Service服务的生存需要一个环境,这个环境便是Server,Server组件为Service服务的正常使用提供了生存环境,Server组件可以同时管理一个或多个Service服务。

  • 两大组件:

1、Connector组件

Connector组件是Tomcat中的两个核心组件之一,他的主要任务是负责接收浏览器发过来的TCP连接请求,创建一个Request和Response对象分别用于和请求端交换数据。然后会产生一个线程来处理这个请求并把产生的Request和Response对象传给处理这个请求的线程,处理这个请求的线程就是Container组件要做的事了。

2、Container组件

在这里插入图片描述

Container是容器的父接口,该容器的设计用的是典型的责任链的设计模式,它由四个自容器组件构成,分别是Engine、Host、Context、Wrapper。这四个组件是负责关系,存在包含关系。通常一个Servlet class对应一个Wrapper,如果有多个Servlet定义多个Wrapper,如果有多个Wrapper就要定义一个更高的Container,如Context。
Context 还可以定义在父容器 Host 中,Host 不是必须的,但是要运行 war 程序,就必须要 Host,因为 war 中必有 web.xml 文件,这个文件的解析就需要 Host 了,如果要有多个 Host 就要定义一个 top 容器 Engine 了。而 Engine 没有父容器了,一个 Engine 代表一个完整的 Servlet 引擎。

小贴士:war 程序就是一个web应用程序,具体可看: war文件—Web项目部署

Engine 容器 Engine 容器比较简单,它只定义了一些基本的关联关系
Host 容器 Host 是 Engine 的子容器,一个 Host 在 Engine 中代表一个虚拟主机,这个虚拟主机的作用就是运行多个应用,它负责安装和展开这些应用,并且标识这个应用以便能够区分它们。它的子容器通常是 Context,它除了关联子容器外,还有就是保存一个主机应该有的信息。
Context 容器 Context 代表 Servlet 的 Context,它具备了 Servlet 运行的基本环境,理论上只要有 Context 就能运行 Servlet 了。简单的 Tomcat 可以没有 Engine 和 Host。Context 最重要的功能就是管理它里面的 Servlet 实例,Servlet 实例在 Context 中是以 Wrapper 出现的,还有一点就是 Context 如何才能找到正确的 Servlet 来执行它呢? Tomcat5 以前是通过一个 Mapper 类来管理的,Tomcat 5 以后这个功能被移到了 request 中,在前面的时序图中就可以发现获取子容器都是通过 request 来分配的。
Wrapper 容器 Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。 Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

其他组件: 安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。

具体两大组件介绍请移步:


三、Tomcat目录

|—bin Tomcat:存放启动和关闭tomcat脚本;
|—conf Tomcat:存放不同的配置文件(server.xml和web.xml);
|—doc:存放Tomcat文档;
|—lib/japser/common:存放Tomcat运行需要的库文件(JARS);
|—logs:存放Tomcat执行时的LOG文件;
|—src:存放Tomcat的源代码;
|—webapps:Tomcat的主要Web发布目录(包括应用程序示例);
|—work:存放jsp编译后产生的class文件;


四、Tomcat类加载

在这里插入图片描述

Bootstrap($ JAVA_HOME/jre/lib/ext/.jar)
System($ CLASSPATH/
.class和指定的jar)
Common($ CATALINA_HOME/common 下的classes,lib,endores三个子目录)
Catalina ($ CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)
&Shared($ CATALINA_HOME/shared/下的classes和lib目录以及$ CATALINA_HOME/lib目录)仅对Web应用程序可见,对Tomcat不可见WebApp($ WEBAPP/Web-INF/仅对该WEB应用可见classes/.classlib/*.jar)

加载类和资源的顺序为:

1、/Web-INF/classes
2、/Web-INF/lib/.jar
3、Bootstrap
4、System
5、$ CATALINA_HOME/common/classes
6、$ CATALINA_HOME/common/endores/
.jar
7、$ CATALINA_HOME/common/lib/.jar
8、$ CATALINA_HOME/shared/classes
9、$ CATALINA_HOME/shared/lib/
.jar


五、HTTP请求Tomcat内部处理过程

在这里插入图片描述在这里插入图片描述

Tomcat Server处理一个HTTP请求的过程

1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的 HTTP/1.1 Connector 获得。
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应。
3、Engine获得请求 localhost/test/index.jsp,匹配所有的虚拟主机Host。
4、Engine匹配到名为 localhost 的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhost的Host获得请求/test/index.jsp,匹配它所拥有的所有的Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为“ ”的Context去处理)。
5、path=“/test”的Context获得请求/index.jsp,在它的mapping table中寻找出对应的Servlet。Context匹配到URL PATTERN为*.jsp的Servlet,对应于JspServlet类。
6、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的 doGet()或doPost().执行业务逻辑、数据存储等程序。
7、Context把执行完之后的HttpServletResponse对象返回给Host。
8、Host把HttpServletResponse对象返回给Engine。
9、Engine把HttpServletResponse对象返回Connector。
10、Connector把HttpServletResponse对象返回给客户Browser。

此处借鉴: Tomcat(一):简介


六、Tomcat 的使用

6.1、 启动Tomcat
在这里插入图片描述


6.2、在浏览器地址栏中输入:http://localhost:8080 或者 http://本地ip:8080,如果看到如下页面,证明启动成功

在这里插入图片描述


6.3、关于 Tomcat 无法正常启动几种常见原因:

  • 问题一:环境变量
    1、检查jdk
    验证jdk的配置,在运行-cmd中输入 java -version
    即表示安装成功。
    在这里插入图片描述
    如果jdk没有问题,还需要配置两个环境变量。找到 jdk 和 jre 的路径,配置JAVA_HOME 和 JRE_HOME,变量值为jdk的安装路径。

    如果不清楚是否配置成功,可使用命令来检查。如下图,提示JRE_HOME变量没有配置成功。

    在tomcat bin目录下运行 cmd 输入 startup 进行检测
    在这里插入图片描述
    2、配置Tomcat环境变量

    需要新建的变量名为:CATALINA_BASE和CATALINA_HOME。

    1)若Tomcat为需要安装的版本,假定安装路径为 C:\tomcat.
    CATALINA_BASE:C:\tomcat
    CATALINA_HOME:C:\tomcat
    修改Path,在其变量值中添加 %CATALINA_HOME%\lib;%CATALINA_HOME%\bin。

    2)若为免安装的版本,直接写解压后的路径即可
    CATALINA_BASE:E:\apache-tomcat-8.5.31-windows-64位
    CATALINA_HOME:E:\apache-tomcat-8.5.31-windows-64位

  • 问题一:端口占用

    修改端口即可


6.4、 配置Tomcat的端口

tomcat默认的端口是8080(访问端口)

http 的默认端口是80,如果访问的时候输入http://www.baidu.com相当于http://www.baidu.com:80。当真正在项目上线之后,通常采用80,修改方法如下:

1)找到tomcat目录/conf/server.xml

在这里插入图片描述
2)修改port的值,将port端口的值修改为80

在这里插入图片描述
3)然后在浏览器中输入 http://localhost:80 或 http://本地ip 访问测试

在这里插入图片描述
配置没问题,访问成功。

小技巧: 使用 catalina run 命令来 启动 Tomcat(在Tomcat 的 bin 目录 中打开 cmd 输入命令)

在这里插入图片描述

好处: 当Tomcat启动失败的时候,会有一闪而过的情况,当我们使用 catalina run 这个命令启动Tomcat的时候,出现错误,我们可以清楚的看到tomcat失败的原因,不会一闪而过,更方便找出错误。


6.5、 Tomcat服务关闭:

第一种:Ctrl+C键 关闭 Tomcat服务器
第二种:点击Tomcat窗口的右上角关闭按钮 (暴力停止服务器,常用😂😂)
第三种:找到tomcat目录/bin/shutdown.bat文件,双击执行关闭Tomcat


6.6、Tomcat项目部署方式:

  • 第一种: 在conf/server.xml文件的host元素中配置,例如:
    在这里插入图片描述
    配置好之后,重启服务器即可。谨慎更改 , 配置错误,会导致tomcat里存放的其它网站瘫痪。

  • 第二种: 将网站目录复制到tomcat/webapps目录(常用)
    在这里插入图片描述
    在这里插入图片描述

  • 第三种: conf\Catalina\localhost 创建任意名称的xml文件。在文件中编写 <Context docBase="D:\hello" />

在这里插入图片描述
在这里插入图片描述

  • 第四种: 把网站目录压缩成war包部署到tomcat中
    在这里插入图片描述

    启动服务自动解压
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 第五种: webapps目录下/ROOT工程的访问

当我们在浏览器中直接输入http://ip地址:端口号 那么 默认访问的是Tomcat目录 /webapps/ROOT 目录 , 如果webapps下面有一个ROOT的项目。那么在访问的时候,直接可以省略项目的名字/ 表示找到root目录

在这里插入图片描述

  • 第六种: 动态项目
    • java动态项目的目录结构:
      • 项目的根目录
        • WEB-INF目录:
          • web.xml:web项目的核心配置文件
          • classes目录:放置字节码文件的目录
          • lib目录:放置依赖的jar包

6.7、IDEA开发工具与tomcat的相关配置:

  • 整合Tomcat和IDEA 开发工具中
    在这里插入图片描述

小贴士: 为什么选择 Update resources 请移步这位博主写的 idea 中Update resources和Update classes and resources、Redeploy的区别和应用场景, 这里就不多赘述了。

在这里插入图片描述


  • 创建一个 java动态项目

在这里插入图片描述

  • 项目运行:

在这里插入图片描述


在这里插入图片描述

完结,撒花 ~ ~ , 2020 9月份入门Tomcat,回顾知新


后续将会更新 Apache Tomcat 专栏, 深入了解 Tomcat 的底层原理,工作原理,系统构架与设计模式,敬请期待!

在这里插入图片描述