目录
一、Tomcat的基本介绍
1、Tomcat是什么?
- Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
- 对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。
- 际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。
- 不过,Tomcat处理静态HTML的能力不如Apache服务器。
2、Tomcat的 配置文件详解
|--------------------------|---------------------|------------------------------------------------------------------------------------------------------------------------|
| 目录名字 | 功能 ||
| bin | 存放启动和关闭 Tomcat 的脚本文件,比较常用的是 catalina.sh、startup.sh、shutdown.sh 三个文件 ||
| conf | 存放 Tomcat 服务器的各种配置文件,比较常用的是 server.xml、context.xml、tomcat-users.xml、web.xml 四个文件。 ||
| conf 子目录 注意: 配置文件对于大小写敏感 | 文件名 | 说明 |
| conf 子目录 注意: 配置文件对于大小写敏感 | server.xml | 主配置文件 全局生效 |
| conf 子目录 注意: 配置文件对于大小写敏感 | web.xml | 每个webapp只有"部署"后才能被访问,它的部署方式通常由web.xml进行定义,其存放位置为WEB-INF/目录中;此文件为所有的webapps提供默认部署相关的配置,每个web应用也可以使用专用配置文件,来覆盖全局文件 |
| conf 子目录 注意: 配置文件对于大小写敏感 | context.xml | 用于定义所有web应用均需加载的Context配置,此文件为所有的webapps提供默认配置,每个web应用也可以使用自已专用的配置,它通常由专用的配置文件context.xml来定义,其存放位置为WEB-INF/目录中,覆盖全局的文件 |
| conf 子目录 注意: 配置文件对于大小写敏感 | tomcat-users.xml | 用户认证的账号和密码文件 |
| conf 子目录 注意: 配置文件对于大小写敏感 | catalina.policy | 当使用security选项启动omcat时,用于为tomcat设置安全策略 |
| conf 子目录 注意: 配置文件对于大小写敏感 | catalina.properties | Tomcat环境变量的配置,用于设定类加载器路径,以及一些与JVM调优相关参数 |
| conf 子目录 注意: 配置文件对于大小写敏感 | logging.properties | Tomcat日志系统相关的配置,可以修改日志级别和日志路径等 |
| lib || 存放 Tomcat 服务器的 jar 包,一般不作任何改动,除非连接第三方服务, 比如 redis,那就需要添加相对应的 jar 包 |
| logs || 存放 Tomcat 日志 |
| temp || 存放 Tomcat 运行时产生的文件 |
| webapps || 存放项目资源的目录 |
| work || Tomcat 工作目录,一般清除 Tomcat 缓存的时候会使用到(升级版本时注意要删除里面的缓存) |
3、Tomcat的构成组件
Tomcat 由一系列的组件构成,其中核心的组件有三个:
3.1 Web 容器:完成 Web 服务器的功能。(https请求)
- 负责底层的HTTP协议
3.2 Servlet 容器:名字为 catalina,用于处理 Servlet 代码。(具体的任务)
- Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。
3.3 JSP 容器:用于将 JSP 动态网页翻译成 Servlet 代码
- JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java 代码。标签通常以 <% 开头,以 %> 结束。
- JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。
- JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。
- 因此 Tomcat 是 Web 应用服务器,也是一个 Servlet/JSP 容器。Tomcat 作为 Servlet 容器,负责处理客户请求,把请求传送给 Servlet,并将 Servlet 的响应传送回给客户。
4、T omcat的顶层架构
- Tomcat中最顶层的容器是Server,代表着整个服务器,一个Server可以包含至少一个Service,用于具体提供服务。
- Service主要包含两个部分:Connector和Container。Tomcat的心脏就是这两个组件,这两个组件的作用:Connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化; Conta iner用于封装和管理Servlet,以及具体处理Request请求。
- 一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接。
- 多个Connector和一个Container就形成了一个Service,有了Service就可以对外提供服务了,但是Service还要一个生存的环境,必须要有人能够给它生命、掌握其生死大权,那就非Server莫属了!所以整个Tomcat的生命周期由Server控制。另外,上述的包含关系或者说是父子关系,都可以在tomcat的conf目录下的server .xml配置文件中看出。
- server.xm1中定义<Server port="8005" shutdown="SHUTDOWN">这会让Tomcat6启动一个server实例(即一个JVM),它监听在8005端口以接收"SHUTDOWN"命令,如果接收到了就会关闭Tomcat。各Server的定义不能使用同一个端口,这意味着如果在同一个物理机上启动了多个Server实例,必须配置它们使用不同的端口。
5、 Tomcat的核心功能
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。
- Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。
- Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用 Servlet 相关逻辑。
- Service:对外提供的 Web 服务
Container 结构分析:
每个 Service 会包含一个 Container 容器。在 Container 内部包含了 4 个子容器:
4个子容器的作用分别是:
- Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine;
- Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点;
- Context:代表一个 Web 应用,包含多个 Servlet 封装器;
- Wrapper:封装器,容器的最底层。每一 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。
容器 由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 封装器。
6、Tomcat的请求过程
- 用户在浏览器中输入该网址,请求被发送到本机端口8080,被在那里监听的Coyote HTTP/1.1 Connector获得;
- Connector把该请求交给它所在的Service的Engine (Container) 来处理,并等待Engine的回应;
- Engine获得请求localhost/test/index.jsp,匹配所有的虚拟主机Host;
- Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机),名为localhostHost获得请求/test/index.jsp,匹配它所拥有的所有Context。Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理);
- path="/test"的Context获得请求/ index. jsp,在它的mapping table中寻找出对应的Servlet。Context 匹配到URLPattern为* .jsp的Servlet,对应于JspServlet类;
- 构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet()或doPost(),执行业务逻辑、数据存储等
- Context把执行完之后的HttpServletResponse对象返回给Host; .
- Host把HttpServletResponse对象返回给Engine;
- Engine把HttpServletResponse对象返回Connector;
- Connector把HttpServletResponse对象返回给客户Browser