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\项目发布名