Tomcat学习笔记(史上最全tomcat学习笔记)
tomcat介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。
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服务器。
Web基础
c/s与b/s架构
- C/S ,Client/Server,就是客户端与服务器,顾名思义,用户需要安装相应的客户端才能运行,典型的如QQ,微信。
优点:减轻服务端的处理压力,运算速度快,对客户端响应快
缺点:版本升级成本高,每次升级必须先卸载老版本在升级
- B/S,Browser/Server,浏览器/服务器,本质上来说也是cs架构,只不过client变成了browser而已。
优点:不存在客户端升级问题,只需要升级服务端程序即可。
缺点:具体业务的处理压力,全部加载了服务端,导致服务端程序运算速度降低,响应速度降低,用户体验差。
web中的三大协议四大角色
- 三大协议
HTTP协议
Servlet协议
JDBC协议
- 四大角色
浏览器
web服务器
服务器端程序
db(数据库)
Tomcat下载
请根据自己需求和电脑系统下载相应版本,建议Source Code Distributions源码也下载,方便后续研究
Tomcat的运行环境与配置
tomcat需要安装jdk和jre,对于tomcat5及以前的版本,要求必须安装jdk,而tomcat6及以后的版本只需要安装jre。这里怎么安装jdk和jre就不讲了。
只需要在系统环境变量中设置JAVA_HOME后,将其java的bin目录添加到path变量即可。
Tomcat的启动与访问
- 打开bin目录下的startup.bat即可启动,打开shutdown.bat即可关闭
如果java环境变量没有正确配置,则可能出现闪退情况,请按要求正确配置java环境变量即可
如遇控制台中文乱码情况,9版本以下的在tomcat中conf里面的server.xml,在Connector中加上
URIEncoding="UTF-8"
还是不行的在tomcat的bin目录下的catalina.bat加如下一条语句
set JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxPermSize=1024m -Dfile.encoding=UTF-8
- 通过浏览器访问http://localhost:8080,若访问成功,则表明tomcat启动成功。
项目结构
项目文件所在目录直接放项目资源文件
-
WEB-INF
classes中放servlet编译好的字节码文件
lib放中放使用的jar包
web.xml是配置文件,定义请求url和所访问的内容与Servlet间的映射关系,可以指定欢迎页面等
实战手工创建和打包第一个web工程
首先准备好自己的web工程,我这里使用的是之前写的代码,传送门
然后将整个项目文件放在webapps目录下
启动tomcat服务器,通过浏览器正常访问
将webapps中项目删除,控制台中进入项目目录
输入命令
jar -cvf d:\xxx\xxx.war .
- cvg是命令参数,表示生成一个文档、显示生成过程、指定生成的文件名,xxx为打包后要存放的路径和打包后的文件名,根据自己需求修改,注意,最后需输入一个空格在加一个'.',代表打包该目录下所有文件。
解读tomcat核心源码
-
Tomcat的核心配置
- tomcat的核心配置都在conf\server.xml文件中,其核心结构示意图如下图所示:
- 一个server服务器可以有多个service服务,每个服务都是由engine引擎提供的,每个引擎中可以多台主机或者虚拟主机,如localhost和virtual host,localhost中又可以包含多个context应用,engine引擎通过connector连接器使得浏览器可以访问服务器。
-
Service.xml内容的解读
- 源码图
从源码图的代码结构中正好印证了上图的tomcat核心结构图,这里只有一个service服务,name为Catalina,
有两个connector,第一个端口为8080,协议是HTTP/1.1,20000ms的延迟,重定向端口为8443,uri编码为utf-8,所以这也就是为什么是开头所说的通过浏览器访问http://localhost:8080的原因了,所以当8080端口被占用时,可以在此修改端口(注意,当应用上线时,必须将端口号 改为80,因为浏览器发出的HTTP请求的默认端口为80端口);第二个connector较为简单,就不分析了。
同时,这个server服务器里有一个engine引擎,name为Catalina,默认端口就是localhost。
接下来是非常重要的地方,请看下图,我们看到engine里面有一个host主机,name为localhost,appBase为webapps,看到这里我想大家也就明白了为什么之前要把项目文件放在webapps中了,再往下看,unpackWARs为true,这个属性的意思是自动解压war包,autoDeploy为true代表着当开启tomcat服务器项目就会自动部署上线,所以在这里可以根据实际生产需求去改变它。
创建虚拟目录
方法一:配置service.xml文件
- 根据tomcat核心结构图,我们知道,只需要在host主机中添加一个context应用,指定他的path和docBase即可。
<Context path="/xxx", docBase="x:/xx/xx"/>
path:当前主机域名访问该应用的uri
docBase:当前应用目录所在的真实路径
弊端:若采用修改service.xml方法创建虚拟目录,则每次修改都要重新启动tomcat服务器,对正在运行的项目会造成不可估量的影响。
方法二: 在localhost中添加配置
- 每当我们启动tomcat时,他会默认的在我们的conf目录下生成一个名为Catalina的引擎,里面有名为localhost的主机,我们只需要在localhost中添加相关配置文件即可。
- 需要注意的是, 添加的配置文件名字即为path,所以不需要再额外指定path路径,只需要指定docBase即可。最后只需要在浏览器中输入http://localhost:8080/xxx即可访问。
<Context, docBase="x:/xx/xx"/>
- 使用该方法的优点是他会自动部署用户配置的文件,不需要重启tomcat服务器。
创建虚拟主机
域名解析服务DNS
DNS,Domain Name Service,域名解析服务,就是将域名与ip进行映射的服务,而提供这种服务的服务器叫做DNS服务器。
之所以我们能通过域名localhost访问本机,是因为windows本身也可以作为DNS服务器,我们能通过http://localhost:8080/访问本机,正是因为在C:\Windows\System32\drivers\etc目录下的hosts文件中配置了域名和ip地址,请看:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
虚拟主机的创建
- 所以,创建虚拟主机,我们只需要在service.xml配置文件engine里面新增加一个host主机即可。
<Engine name="Catalina" defaultHost="localhost">
<Host name="virtualHost" appBase="newWebapps"
unpackWARs="true" autoDeploy="true">
</Host>
......
</Engine>
name:代表当前主机的域名,这里我们将它取为virtualHost,
appBase:代表该域名下的应用存放在哪个目录,这里我指定为newWebapps
修改完service.xml配置文件后,重启tomcat服务器
修改本地主机hosts文件后如下图(注意不要在前面加#):
在浏览器中输入http://virtualHost:8080/xxx (xxx为你的项目文件,放在newWebapps中)
浏览器会先对本机上hosts文件进行DNS解析,如果没有找到,则去网络服务商(联通、电信)公司提供的DNS服务器上寻找该域名,如果还没有找到则会去更高级的DNS服务器上寻找,直到找到该域名为止;如果找不到,则浏览器会提示“域名解析错误“
思考,此时hosts文件中ip:127.0.0.1映射多个域名,当我们在浏览器中输入127.0.0.1:8080时,他会返回谁呢?
其实这跟我们service.xml中的配置相关。
请看这句代码:
<Engine name="Catalina" defaultHost="localhost">
- 很显然这里引擎指定了默认主机为localhost,所以当你输入127.0.0.1:8080时,浏览器会默认返回主机为localhost中的contex应用内容。
ManagerApp
- 当我们的项目非常多的时候,我们不可能一个一个的在浏览器地址栏输入项目名称去访问,这样会很麻烦,这时候就需要用到ManagerApp来把所有项目列出来了。
第一步访问http://localhost:8080/,点击managerApp
第二步输入用户名密码。用户名密码需要在 conf/tomcat-users.xml 中设置,添加以下代码即可。
<role rolename="manager-gui"/>
<user username="tomcat" password="s3cret" roles="manager-gui"/>
- 其中不要修改
<role rolename="manager-gui"/>
- 只需要修改username和password即可。
<user username="tomcat" password="s3cret" roles="manager-gui"/>
- 最后重启tomcat,登录,即可看到当前localhost下所有的应用内容。