文章目录
- Tomcat
- [1, 概述](#1, 概述)
-
- [1.1 安装](#1.1 安装)
- [1.2 目录结构](#1.2 目录结构)
- [1.3 启动/停止](#1.3 启动/停止)
- [2, 资源部署](#2, 资源部署)
-
- [2.1 直接部署: 主要和重要的方式](#2.1 直接部署: 主要和重要的方式)
- [2.2 虚拟映射: 重要](#2.2 虚拟映射: 重要)
-
- [2.2.1 方式一:](#2.2.1 方式一:)
- [2.2.1 方式二:](#2.2.1 方式二:)
- [2.3 原理解析](#2.3 原理解析)
- [3, Tomcat组件](#3, Tomcat组件)
-
- [3.1 Connector](#3.1 Connector)
- [3.2 Engine](#3.2 Engine)
-
- [3.2.1 Host](#3.2.1 Host)
-
- [3.2.1.1 Context](#3.2.1.1 Context)
- [4, 其它: 重要](#4, 其它: 重要)
-
- [4.1 设置](#4.1 设置)
Tomcat
1, 概述
web服务器有很多种。在大多数情况下,我们会选择Tomcat。
Tomcat是一个服务器:
java- 在这这个Tomcat的服务器的概念, 指的是具有监听别的用户请求和响应用户请求功能的一个运行在电脑上的程序.
1.1 安装
Tomcat的官网: https://tomcat.apache.org/
Tomcat直接解压缩到某个盘符根目录即可,不要放置在很深的目录结构中,同时也建议不要放置在中文目录下,以防出现一些问题。(不仅仅针对Tomcat,对其他软件也是如此)
注意自己的计算机要拥有JAVA_HOME配置, 才能运行Tomcat(如果电脑上没有配置JAVA_HOME, 启动Tomcat会一闪而过)
(注意是否端口占用)
1.2 目录结构
目录结构
java- bin目录:二进制文件存放目录,启停tomcat的文件均位于该目录下 - conf目录:配置文件的存放目录 - logs目录:日志存放目录,tomcat正常启动及错误启动的日志信息均会记录在此目录中。可以作为tomcat启动失败时一个调试方式。 (面试中问题: 线上出了BUG,你是怎么解决的/定位的? 看Tomcat的日志信息, 报了什么错, 定位错误代码, 修改) // webapps目录:在tomcat中部署资源的目录 (如果我们要使用Tomcat, 只需要把 后端代码 or 前端代码 放到Tomcat的webapps下面, 然后启动Tomcat -> 这种行为称为"部署应用") (面试中问到的问题: Java项目是怎么部署和上线的? 方式1,java项目写好了->编译(class)打包(war)-> 把这个打成的war, 放到云服务中的Tomcat的webapps下面, 启动Tomcat, 结束. ) (上面面试回答的补充: 1, Tomcat -> 意味有云服务安装了JVM; 2, 安装数据库 3,买域名->dns解析 ) - lib目录:tomcat运行时依赖的jar包存放于此 - temp目录:临时文件的存放目录 - work目录:tomcat工作时的工作目录
1.3 启动/停止
启动Tomcat
java// 1, Tomcat的bin目录下点击执行startup.bat文件 // 2, Tomcat的bin目录下唤出cmd,输入startup 或者 startup.bat 执行 注意: 如果启动过程,Tomcat窗口一闪而过,那是JAVA_HOME没有配置正确
停止Tomcat
java// 1, Tomcat的bin目录下执行shutdown.bat文件 // 2, Tomcat的bin目录下唤出cmd,执行shutdown // 3, 在tomcat启动成功的窗口,按住ctrl键,多次按c键,也可以停止 (不建议)
2, 资源部署
应用 = 项目: 部署应用(应用当成一个项目 或者 一个代码模块), 部署项目
需要注意的是tomcat最小单位是应用, 一个Tomcat容器中可以包含多个应用,资源文件必须放置在应用中,应用有两个属性,应用名和应用路径
2.1 直接部署: 主要和重要的方式
创建目录部署
java// 直接在tomcat的webapps目录下新建一个目录,当tomcat运行时便会将webapps目录下这个新建目录解析成为一个应用/一个项目。 // 资源文件放置在该目录内内部, 访问时只需要通过如下路径来访问: http://主机:端口号/应用名(目录的名称)/相对应用内部的一个相对路径构成
java// 如图: 如果需要访问1.txt,那么访问的地址为http://localhost:8080/hello/1.txt
War包部署
java// 我们可以通过部署java项目的war包的形式(war包是一个Java项目经过编译压缩之后的一个压缩包格式),当Tomcat运行的时候, Tomcat会将webapps下的war包会自动解压缩成目录(原理上和上面是等价的),访问方式同上。
2.2 虚拟映射: 重要
虚拟映射, 我们可能不会直接使用. (1, 用到, 给idea配置tomcat)
所谓虚拟映射, 就是把应用部署到tomcat目录之外,通过一些虚拟的方式把这个项目映射到Tomcat的webapps目录中
2.2.1 方式一:
配置文件: conf/Catalina/localhost目录下新建一个xml文件,并配置
xml<!-- 配置映射资源的来源文件地址 --> <Context docBase="D:\appname" />
该配置项表示的含义是配置了一个叫做/app的应用(应用名为xml文件的名称),即/app, 该应用指向的路径即应用路径为D:\app2,如果希望访问该目录下某个文件,则通过如下方式来访问:
http://主机:端口号/app/app2目录内文件路径
2.2.1 方式二:
配置文件: conf/server.xml文件中
xml<!-- 在Host节点下配置Context节点 --> <!-- path代表应用名, docBase代表映射的资源位置 --> <Context path="/appName" docBase="D:\appPath" />
访问方式(同方式一): eg: http://localhost:8080/app3/12.jpg
2.3 原理解析
要明确一点的是,静态资源服务器的本质其实就是把用户在浏览器地址栏输入的一个网络路径加以解析转换成服务器主机硬盘路径。
在明确上述问题之后,那么部署资源的方式就容易理解了。tomcat中最小的单位是应用,任何一个资源文件都必须放置在应用中。
当我们使用直接部署时,假设tomcat位于D:/tomcat目录下,而后我们在webapps目录下新建一个hello目录,在该目录下存放资源文件,那么当我们访问http://localhost:8080/hello时,尝试解析/hello对应的硬盘路径为D:/tomcat/webapps/hello,而后访问http://localhost:8080/hello/1.txt时,对应的文件路径为D:/tomcat/webapps/hello/1.txt,文件恰好位于该路径,那么便可以获取到文件的输入流,随后将文件响应出去
当我们使用虚拟映射时,tomcat的存放路径依然是D:/tomcat目录下,此时我们的文件位于D:/app2目录下,紧接着我们进行了虚拟映射的配置,配置应用的名称为/app3,应用的路径为D:/app2,当输入的地址http://localhost:8080/app3时,此时关联到的硬盘路径为D:/app2目录,随后如何访问某个文件,只需要写出该文件相对D:/app2目录的一个相对路径关系即可。
3, Tomcat组件
Tomcat组件-> Tomcat的内部的构成
有点抽象(认为设计的东西, 非现实中的抽象)
Tomcat是由一系列可以配置的组件所构成。组件元素位于conf/server.xml文件中。当tomcat启动时,会读取server.xml文件里面的内容,按照xml文件的设置,生成相应的组件对象。也就是说,如果我们希望tomcat运行时的组件发生变化,只需要对server.xml文件进行修改即可。Tomcat组件中有一个比较核心的组件需要我们重点关注。
xml<?xml version="1.0" encoding="UTF-8"?> <!-- 整个Tomcat是一个Server(整一个Tomcat服务) --> <Server port="8005" shutdown="SHUTDOWN"> <!-- 一个Server可以包含多个Service(多个服务空间) --> <Service name="Catalina"> <!-- 一个Service可以有多个Connector(功能和端口不能重复):Connector监听的请求全部要触发到Engine中 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Connector port="443" protocol="HTTP/1.0" connectionTimeout="20000" redirectPort="8443" /> <!-- 一个Service 只能包含一个Engine --> <Engine name="Catalina" defaultHost="localhost"> <!-- 一个Engine可以包含多个 Host(虚拟主机) --> <!-- appBase 用来标识这个虚拟主句Host管理的文件夹(这个文件夹里面放到都是这个虚拟主机管理的项目) --> <Host name="www.baidu.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 一个Host虚拟主机里面可以包含多个Context(一个Context代表一个应用/项目) --> <!-- path:代表虚拟映射项目的名字, docBase: 指向某一个被映射的目录 --> <Context path="/app3" docBase="C:\Users\snow\Desktop\d" /> </Host> < <!-- 一个Engine可以包含多个 Host(虚拟主机) --> <Host name="www.taobao.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> </Engine> </Service> </Server>
3.1 Connector
Connector:负责接收客户端的请求以及对客户端做出响应。主要职责是负责持续不断监听某一端口号,将客户端传递过来的请求报文解析转换成request对象,同时还会提供一个response对象,将这两个对象传递给Engine。
3.2 Engine
负责接收Connector传递过来的request对象以及response对象,并进一步传递给Host
3.2.1 Host
负责接收Engine传递过来的request对象以及response对象,并挑选一个合适的Context对象进行进一步传递
3.2.1.1 Context
负责处理具体的业务逻辑。比如利用应用路径拼接请求资源路径,接下来在硬盘上查找该文件是否存在,并且写入数据到reponse中,最终Connector会读取response中的数据
4, 其它: 重要
4.1 设置
默认端口设置
当我们在访问http://www.baidu.com时,我们发现请求的地址中没有端口号,为什么没有端口号,是因为没有使用端口号吗?不是的。而是当前服务器使用的是 当前协议的默认端口号,对于http协议来说,默认端口号是80。所以如果希望你的tomcat在访问时也不携带端口号,那么需要设置你的tomcat监听80端口号即可。
xml<!-- conf/server.xml文件 --> <Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
缺省应用: 默认应用-> ROOT
观察webapps目录下的应用,有一个非常特殊,ROOT,访问该目录下的资源文件时,不能通过/ROOT/1.html来访问,需要去掉应用名。ROOT应用为tomcat的缺省应用,意思是当找不到合适的应用来处理时,会将请求交给缺省应用来处理。访问缺省应用下的资源文件时,不需要携带应用名。
java如何设置应用为缺省应用? // 方式一:在webapps目录下的应用,目录名改为ROOT (这种更合适) // 方式二:在conf/Catalina/localhost目录下配置ROOT.xml文件 (平时实际操作不建议) // 方式三: 在conf/server.xml配置 (不要让path="/ROOT" -> 定义一个项目名叫ROOT, 而不是所谓的默认应用)
欢迎页面
在某些场景下,我们发现请求的资源地址最终指向的是目录而不是一个具体的资源文件,那么访问的是哪个文件呢?实际上访问的是当前应用下的欢迎页面。
xml<!-- conf/web.xml文件中有配置 --> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
比如访问http://localhost:8080/application
java地址指向的是一个应用,而不是一个具体的资源,那么tomcat会去加载哪个页面呢?依次按照welcome-file中的设置,一个一个在当前应用下去查找文件是否存在,首先查找index.html、index.htm、index.jsp如果查找到,则结束,如果没有查找到,则进入到下一个,如果全部都没有找到,则最终返回404.
思考题:设置Tomcat: 通过ip地址就可以直接访问到某个 png图片文件,应该如何设置?