1. 基本概念
概念: Tomcat是Apache软件基金会的Jakarta项目中的一个核心项目产品,是一个开源的,运行时占用的系统资源很小的轻量级Web容器:
- 目录结构:
bin
:存放windows或Linux平台上启动和关闭Tomcat的脚本文件。conf
:存放Tomcat容器的各种全局配置文件,其中最重要的是server.xml
和web.xml
。lib
:存放Tomcat执行时的一些jar包文件。logs
:存放Tomcat执行时的日志文件。temp
:存放Tomcat的临时文件。webapps
:Tomcat的主要Web发布目录。work
:存放JSP编译后产生的class文件。
- 启动Tomcat:点击
bin/startup.bat
文件:- tomcat9版本启动日志会有中文乱码问题,建议将
conf\logging.properties
中的java.util.logging.ConsoleHandler.encoding
修改为GBK
,兼容控制台。
- tomcat9版本启动日志会有中文乱码问题,建议将
- 关闭Tomcat:点击
bin/shutdown.bat
文件。 - 端口占用问题:使用CMD命令行解决:
netstat -ano | findstr 8080
:查看占用8080
端口的进程的PID(最后一列)。tasklist | findstr PID
:通过PID查询进程信息。taskkill /f /t /pid PID
:通过PID强制关闭进程(/f
),及其子进程(/t
)。
服务器其实是web容器和EJB程序的总称,但Tomcat没有EJB,所以只能勉强算一个服务器。
2. IDEA整合
流程: 利用IDEA创建动态WEB项目并整合Tomcat:
- 点击
File
-New
-New Project
-Java Enterprise
创建企业版Java项目。 - 在
Application Server
后方点击New
-Tomcat Server
添加Tomcat
。 - 勾选
Web Application(4.0)
,填写工程名和位置,点击ok
完成WEB项目创建。 - 将
index.jsp
替换成index.html
,填入Hello World...
文本。 - 点击右上角
Edit Configurations...
,选择Tomcat Server/Tomcat
:- 若没有,点击
+
-Tomcat Server
-Local
进行添加。
- 若没有,点击
- 切换到
Deployment
选项卡,点击+
-Artifact...
部署项目。- 建议在底部
Application context
中修改项目发布名,开头的/
不能省略。
- 建议在底部
- 切换到
Server
选项卡进行Tomcat配置:- 勾选
After launch
:Tomcat启动后自动以指定浏览器访问指定的URL。 - 勾选
with JavaScript debugger
:浏览器自动使用开发者模式进行访问。 - 选择
On "Update" action
为Update classes and resources
以开启热部署。 - 选择
On frame deactivation
为Update classes and resources
以开启热部署。
- 勾选
- 点击
ok
,完成部署,使用debug方式启动Tomcat。
热部署生效的前提是使用Debug方式启动Tomcat,且项目部署的方式是
Artifact...
。
源码: /tomcat9/
- web:
index.html
3. 配置文件
概念: 配置文件的意义,是组织各个业务层模块,conf/server.xml
是Tomcat最重要的配置文件,其中的每一个标签都对应了Tomcat中的一个组件,负责对Tomcat中各个组件的控制:
<Server>
:配置文件的根标签,代表整个Tomcat容器,负责维护子标签<Service>
的生命周期,只能存在一个:port="8005"
:设置<Server>
的端口号为8005
,若设置为-1
表示禁用。shutdown="SHUTDOWN"
:表示允许通过shutdown 8005
指令来关闭Tomcat容器。
<Listener>
:<Server>
的子标签,负责监听Tomcat生命周期事件,可以存在多个,不允许内嵌其他组件:className="...VersionLoggerListener"
:Tomcat启动时,记录启动日志信息,该监听器必须是第一个。className="...AprLifecycleListener"
:Tomcat启动时,检查APR库(Apache可移植运行库),若存在则加载。className="...JreMemoryLeakPreventionListener"
:与类加载器导致的内存泄露有关。className="...GlobalResourcesLifecycleListener"
:初始化<GlobalNamingResources>
标签中定义的全局JNDI资源。className="...ThreadLocalLeakPreventionListener"
:当Web应用因thread-local导致的内存泄露而要停止时,该监听器会触发线程池中线程的更新。className="...JasperListener"
:Web应用启动前初始化Jasper(JSP引擎,将JSP解析成java,编译成class供JVM使用)。
<GlobalNamingResources>
:<Server>
的子标签,配合子标签<Resource>
读取某个配置文件信息以定义全局资源,本例中读取了conf/tomcat-users.xml
文件的信息。<Service>
:<Server>
的子标签,负责对外提供服务,是请求和响应的接头人,可以存在多个以监听不同的端口:name="Catalina"
:组件名。
<Connector>
:<Service>
的子标签,负责从客户端接收连接请求,创建request
和response
对象,分配线程让<Engine>
来处理,然后接收响应结果并返回给客户端,可以存在多个:port
:设置连接端口号,即允许客户端通过什么端口号连接到Tomcat,默认8080
。protocol
:设置请求协议,可选HTTP/1.1
或者AJP/1.3
(AJP协议概念见引用)。connectionTimeout="20000"
:设置连接的超时时间为20秒。redirectPort="8443"
:当protocol规定了协议为https
,而实际请求是http
时,重定向至端口号为8443
的<Connector>
。
<Engine>
:<Service>
的子标签,负责从某些<Connector>
中接收request
,处理,然后返回response
给<Connector>
,只能存在一个:name="Catalina"
:组件名,用于用于日志和错误信息。defaultHost="localhost"
:默认绑定的HOST地址为本机,此值需要与某个<Host>
的name
绑定。
<Realm>
:<Engine>
的子标签,提供了一种用户密码与web应用的映射关系,从而达到角色安全管理的作用:className
:安全管理的某种实现类。resourceName
:这个实现是在<GlobalNamingResources>
中配置的。
<Host>
:<Engine>
的子标签,负责为Tomcat设置域名,至少包含一个以绑定<Engine>
的defaultHost
属性:unpackWARs
:为true
表示tomcat则会将war包项目解压成文件夹后运行,为false
表示tomcat直接运行war包项目。autoDeploy
:为true
表示tomcat在运行时定期检查新的Web应用或Web应用的更新,然后自动部署,为false
时表示不进行自动部署。deployOnStartup
:为true
表示Tomcat在启动时检查Web应用的更新,且检测到的所有Web应用都视作新应用,然后自动部署,为false
时不进行启动检测。appBase
:指定Web应用所在的目录,默认值是webapps
,是一个Tomcat根目录的相对路径。xmlBase
:指定Web应用的XML配置文件所在的目录,默认为conf/<engine_name>/<host_name>
中。
<Valve>
:请求处理链上的一个组件,可以和<Engine>
,<Host>
或<Context>
关联:className
:设置Valve类型为AccessLogValve
,负责记录日志。directory
:设置日志存储的位置,是一个Tomcat根目录的相对路径。prefix
:设置日志文件的前缀为localhost_access_log
。suffix
:设置日志文件的后缀为.txt
。pattern
:指定记录日志的格式为%h %l %u %t "%r" %s %b
。%h
:远程主机名或IP地址。%l
:远程逻辑用户名,一律是"-",可以忽略。%u
:授权的远程用户名,如果没有,则是"-"。%t
:访问的时间。%r
:请求的第一行,即请求方法(get/post等),uri及协议。%s
:响应状态,200,404等等。%b
:响应的数据量,不包括请求头,如果为0,则是"-"。
<Context>
:代表包裹内容,即一个Web应用,每个Web应用基于WAR文件,或WAR文件解压后对应的目录,一个<Host>
中可以存在多个,server.xml
默认配置文件中并没有出现Context元素的配置,因为Tomcat开启了自动部署,Web应用没有在server.xml
中配置静态部署,而是由Tomcat通过特定的规则自动部署:docBase
:设置Web应用的真实物理路径,在自动部署场景下,若docBase
指定的WAR包或应用目录已在docBase
中,则不需要设置,因为Tomcat会自动扫描appBase
包,指定了反而会造成问题。path
:设置Web应用的访问入口,/
开头,自动部署场景下,默认为WAR文件名或应用目录名。reloadable
:值为true
时会监听WEB-INF/classes
和WEB-INF/lib
目录下class文件,一旦改动会触发Web应用的重新加载,默认值为false
。
AJP协议:负责和其他的HTTP服务器(如Apache)建立连接,在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器,之所以使用Tomcat和其他服务器集成,是因为虽然Tomcat可以用作Servlet/JSP容器,但是对静态资源的处理速度较慢,不如Apache和IIS等HTTP服务器,因此常常将Tomcat与Apache等集成,前者作Servlet容器,后者处理静态资源,而AJP协议便负责Tomcat和Apache的连接。
4. 虚拟路径
概念: 若不想每次重启tomcat都删除其中的静态资源,则可以将静态资源上传到tomcat之外的其他位置,如 F:\upload\picture
,然后为这个路径配置一个虚拟路径,如 /upload
,以便浏览器访问:
- 本地配置虚拟路径: 找到
conf/server.xml
中的<Host>
首行位置:- 填写
<Context path="/upload" docBase="F:\upload\picture"></Context>
。 path
属性用来设置URL虚拟路径,以/
开头,且不建议设置多层结构。docBase
属性用来设置真实路径,要求必须真实存在,否则tomcat启动报空指针。- 点击右上角
Edit Configurations...
勾选Deploy applications configured in Tomcat instance
,否则server.xml
的改动对IDEA中的Tomcat服务不生效。 - 浏览器测试
http://localhost:8080/upload/123.jpg
,路径不要添加项目工程名。
- 填写
- IDEA配置虚拟路径:
- 点击右上角
Edit Configurations...
并进入Deployment
选项卡。 - 点击
+
-External Source...
,选择F:\upload\picture
文件夹。 - 在下
Application context
栏中输入虚拟路径/upload
并启动Tomcat。 - 在首页中使用
<a href="/upload/123.jpg">测试</a>
来测试,不要添加项目工程名。
- 点击右上角
Eclipse配置
- Eclipse配置了tomcat之后,会在项目中生成一个server的项目,里面是你的tomcat,每次启动tomcat,那里面的server.xml会覆盖你本地tomcat的server.xml,所以那里也要设置一下。
腾讯云服务器
概念: 0元试用腾讯云服务器
流程:
- cmd -> mstsc
- 公网IP:118.89.238.23
- 账号:Administrator
- 密码:Tma
- 显示选项 - 本地资源 - 详细信息 - 驱动器 - C盘,将主电脑的C盘共享到云服务器(支持双向实时更新共享内容)。
- 开始菜单 - 管理工具 - 高级安全Windows防火墙 - Windows防火墙属性 - 公用配置文件 - 入站连接选择允许。
- 云服务器中安装JDK、配置环境变量。
- 云服务器中安装TOMCAT。
- 将TOMCAT的startup.bat、shutdown.bat、和webapps文件夹发送快捷方式到桌面。
- 将IDEA项目中,out\artifacts\中的项目拷贝到webapps文件夹中。 10.任意地点访问 https:\118.89.238.23:8080\项目发布名