有了坚持不一定成功;但没有坚持,就注定失败。对于成功,坚持的塑造必不可少!
一、概念
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包
- WEB-INF目录:
- 项目的根目录
- java动态项目的目录结构:
6.7、IDEA开发工具与tomcat的相关配置:
- 整合Tomcat和IDEA 开发工具中
小贴士: 为什么选择 Update resources 请移步这位博主写的 idea 中Update resources和Update classes and resources、Redeploy的区别和应用场景, 这里就不多赘述了。
- 创建一个 java动态项目
- 项目运行:
完结,撒花 ~ ~ , 2020 9月份入门Tomcat,回顾知新
后续将会更新 Apache Tomcat 专栏, 深入了解 Tomcat 的底层原理,工作原理,系统构架与设计模式,敬请期待!