Tomcat教程

百 科: Apache TomcatJava Servlet

相关链接: Tomcat的使用(详细流程)

Tomcat服务器下载、安装、配置环境变量教程(超详细)

JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)

Tomcat目录结构

image-20191124141804561

bin: tomcat启动关闭脚本文件。

conf: tomcat各种配置文件。其核心配置文件:

​ 1、server.xml 配置与server相关信息

​ 2、web.xml web应用(一个web应用相当于一个站点)

​ 3、tomcat-users.xml 配置tomcat相关信息(tomcat用户名 密码 权限),文件内容如下

1
2
3
4
5
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="admin-gui" />
<user username="tomcat" password="tomcat" roles="admin-gui" />
</tomcat-users>

lib: tomcat启动依赖的jar包

logs: tomcat日志

temp: tomcat运行是产生的临时文件

webapps: web应用所在的目录,即提供外界访问的web资源存放目录。

work: tomcat工作目录,主要用于存放jsp被访问后生成对应的servlet文件以及class文件。

配置

1、设置 CATALINA_HOME 环境变量:指向Tomcat的解压目录: D:\Program Files\apache-tomcat-9.0.24

2、设置 PATH 环境变量:%CATALINA_HOME%\bin

启动与关闭

Tomcat服务器占用的默认端口号是8080,若该端口被占用,Tomcat将无法启动。

必要条件: 设置JDK环境变量

方式一 .bat脚本

startup.bat 启动 Tomcat,shutdown.bat 关闭 Tomcat (或直接关闭运行窗口)。

必须设置环境变量 JAVA_HOMECATALINA_HOME 非必须,因为可以根据 .bat 脚本定位 tomcat 的 bin 目录。

所需的 JAVA 环境变量可以在系统环境变量里添加,也可以直接修改 catalina.batsetclasspath.bat 中的 JAVA_HOMEJRE_HOME 变量。

如果通过 IDE 启动Tomcat,则不需要这两个环境变量。预知详情,请查看 startup.bat、catalina.bat 和 setclasspath.bat 文件。

方式二 自定义启动脚本

编写 Tomcat启动.bat

1
2
3
4
set JAVA_HOME=%cd%\java\jdk-11-openjdk
set CATALINA_HOME=%cd%\apache-tomcat-9.0.24
set PATH=%PATH%;%JAVA_HOME%\bin;%CATALINA_HOME%\bin
cls&&catalina run

%cd%https://www.jb51.net/article/30528.htm

方式三 服务

服务启动Tomcat,服务关闭Tomcat。

**安装Tomcat服务 **

编辑 service.bat 文件

1
2
3
4
5
6
7
8
9
10
11
set "CURRENT_DIR=%cd%"
.
.
.
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%cd%" // 如果为空字符串,设置当前目录为CATALINA_HOME

set DEFAULT_SERVICE_NAME=Tomcat9 // 执行服务安装命令时,根据此名称在bin目录下查找对应的Tomcat9.exe文件

set SERVICE_NAME=%DEFAULT_SERVICE_NAME% // 服务名称。唯一、不要空格。
set DISPLAYNAME=Apache-%SERVICE_NAME% // 服务显示名称,可以与其他服务显示名称相同。

安装服务

cmd –> services.msc,没有名称为 Apache-Tomcat9 的服务。

在 tomcat 的 bin 目录下执行 service.bat install,刷新服务列表,就可以找到显示名称Apache-Tomcat9 服务名称Tomcat9 的服务。

移除服务

service.bat remove SERVICE_NAME ,使用服务名称而非显示名称。

方式四 .exe

双击 Tomcat9.exe 或 Tomcat9w.exe 启动和关闭 Tomcat,前提是已安装Tomcat服务且服务的名称为 Tomcat9。

如果不设置 Tomcat 为服务:双击 Tomcat9.exe,弹窗会立即消失,看不到任何提示;双击 Tomcat9w.exe,弹窗如下:

image-20201017141539077

服务名称 (即 service.bat 文件中的 SERVICE_NAME 变量) 必须和 Tomcat9.exe、Tomcat9w.exe 对应。

Tomcat9.exe启动

成功启动 Tomcat 后的进程列表:

image-20201017150257365

Tomcat9w.exe启动

Tomcat9.exe 是启动tomcat的,Tomcat9w.exe是管理tomcat服务的。

双击 Tomcat9w.exe,弹出可视化 Tomcat 服务的控制台如下:

image-20201017150645990

进程列表:

image-20201017150829023

成功启动 Tomcat 后的进程列表:

image-20201017151029130

区分进程名称

修改 Tomcat9.exe、Tomcat9w.exe 文件名。切记:与服务名称对应。

总结

服务启动和控制台启动 (Tomcat9w.exe) 的服务列表状态是一致的,一个启动可以用另一个关闭。

无论使用何种方式启动,shutdown.bat 都可以关闭。

设置端口号

HTTP协议默认端口号为80。如果服务器端口号为80,则URL中的端口号可以忽略,否则必须使用冒号加端口号指明。大部分的Web服务器都是80端口,例如新浪网。在浏览器中输入http://www.sina.com.cn与http://www.sina.com.cn:80的效果是一样的。

Tomcat默认端口号为8080,而非80,因此在URL中必须指明端口。

1
2
<!-- protocol="HTTP/1.1" 表示Tomcat使用何种网络协议来接受和处理client端请求 -->
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

端口号可随意修改,若端口被占用就启动失败。

端口号最大 65535 : TCP/UDP端口列表

设置临时域名

访问Tomcat服务器的方式有:

1、使用域名localhost访问。仅限于本机上,例如:http:localhost:8080.

2、使用IP地址127.0.0.1访问。仅限于本机上,例如http://127.0.0.1:8080。本IP为保留IP,代表本机。

3、使用机器名称访问。仅限于本机上或者局域网内。例如:http:// HelloweenPad:8080

4、使用本机IP访问。例如:http://123.112.62.231:8080。

5、如果有域名指向该服务器,可以使用域名访问,例如:http://www. Helloweenvsfei.com

除了上面的方式之外,Windows还提供一种机制,为机器设置临时域名。打开C:\Windows\System32\drivers\etc文件夹,编辑hosts文本。在文件的最后添加一个IP地址与对应的主机名称。如图,两个主机名称指向了本机IP,即可使用http://www.zhaolq.com:8080与http://www.zhaolq.com.cn:8080在本机器上访问Tomcat服务器了。

image-20201017155713381

提示:不建议修改host文件。仅用于用某域名来测试本机上的Web程序。

设置虚拟主机

Tomcat中可以设置虚拟主机,即多个不同域名的网站共存于一个Tomcat中。方法是修改 apache-tomcat-7.0.50\conf\server.xml。一个<Host>代表一个虚拟主机、一个域名,例如:

1
2
3
4
<Engine name="Catalina" defaultHost="localhost">
<Host name="www.baidu.com" appBase="webapps/localhost" unpackWARs="true" autoDeploy="true">
<Host name="www.google.com" appBase="webapps/google" unpackWARs="true" autoDeploy="true">
</Engine>

Tomcat会根据访问的域名不同,自动映射到不同的网站目录中。Server.xml是Tomcat最主要的配置文件,绝大多数的配置都在本文件中,具体配置见官网或 Tomcat webapps 下的文档。

image-20201017160216585

虚拟主机:一台物理机上搭建多个web站点,每个web站点独立运行,互不干扰,这些站点就是”虚拟主机”。

虚拟主机的两种实现方式如下。

基于主机名的虚拟主机

多个域名解析到同一个IP地址,在WEB服务器里添加多个站点,每个站点设定一个主机名。HTTP协议请求里包含了主机名信息,当WEB服务器收到访问请求时,就可以根据不同的主机名来访问不同的网站。

步骤:

a、配置域名与Ip的映射管理(对于本地局域网我们使用在host文件中添加;对于大型网络或者外网网络则需要配置DNS服务器中Ip地址与域名的映射关系)

在C:\Windows\System32\drivers\etc\hosts文件末尾添加:

127.0.0.1 www.zhaolq1.com

127.0.0.1 www.zhaolq2.com

b、配置server.xml

1
2
3
<Host name="www.zhaolq1.com" appBase="D:\app1" unpackWARs="true" autoDeploy="true"></Host>

<Host name="www.zhaolq2.com" appBase="D:\app2" unpackWARs="true" autoDeploy="true"></Host>

将apache-tomcat-9.0.24\webapps下的全部文件分别copy到 app1和app2文件夹下。

有时间研究一下<host>标签及其子标签中的元素。

c、测试

http://www.zhaolq1.com:8080/ 或者:zhaolq1.com:8080

http://www.zhaolq2.com:8080/ 或者:zhaolq2.com:8080

基于端口号的虚拟主机

一个IP地址,通过不同端口访问不同网站。

在server.xml 中 设置两个service组件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>

<!-- 原Service组件 -->
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>

<!-- 添加的Service组件 -->
<Service name="Catalina1">
<Connector port="6666" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina1" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
</Realm>
<Host name="www.zhaolanqi.com" appBase="D:\app1" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>

<!-- 添加的Service组件 -->
<Service name="Catalina2">
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina2" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
</Realm>
<Host name="www.zhaolanqi.com" appBase="D:\app2" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
</Engine>
</Service>

</Server>