Tomcat来源
我们为什么能通过Web服务器映射的URL访问资源?肯定需要写程序处理请求,主要3个过程:
- 接收请求
- 处理请求
- 响应请求
任何一个应用程序,必然包括这三个步骤。其中接收请求和响应请求是共性功能,且没有差异性。访问淘宝和访问京东,都是接收http://www.xxx.com/brandNo=1,响应给浏览器的都是JSON数据。于是,大家就把接收和响应两个步骤抽取成Web服务器,也就是Tomcat:
但处理请求的逻辑是不同的。没关系,抽取出来做成Servlet,交给程序员自己编写。当然,随着后期互联网发展,出现了三层架构,所以一些逻辑就从Servlet抽取出来,分担到Service和Dao。
Tocat基本概念
Tomcat服务器 = Web服务器 + Servlet/JSP容器(Web容器)。
Web服务器的作用是接收客户端的请求,给客户端作出响应。但是很明显,服务器不止静态资源呀,所以客户端发起请求后,如果是动态资源,Web服务器不可能直接把它响应回去(比如JSP),因为浏览器只认识静态资源。所以对于JavaWeb程序而言,还需要JSP/Servlet容器,JSP/Servlet容器的基本功能是把动态资源转换成静态资源。
我们用Java开发的Web应用只是一个半成品,类似于一个插件。
Tomcat架构
tomcat目录结构
tomcat架构
结合Tomcat的一个配置文件(Server.xml)来看:
简略解释一下xml里的配置:
- Server.xml文件中的配置结构和Tomcat的架构是一一对应的。根目录是<Server>,代表服务器,<Server>下面有且仅有1个<Service>,代表服务。
- <Service>下有两个<Connector>,代表连接(需要的话可以再加)。
其实这个Connector就是我们在上面讨论百度服务器时画过的端口。大家可以看到Tomcat默认配置了两个端口,一个是HTTP/1.1协议的,一个是AJP/1.3协议(我也不知道是啥)。前者专门处理HTTP请求。 - 当我们在浏览器输入"http://localhost:8080/demo/index.html"时,浏览器是以HTTP协议发送的,当这个请求到了服务器后,会被识别为HTTP类型,于是服务器就找来专门处理HTTP的Connector,它的默认端口正是上门Server.xml配置的8080。
- 与Connector平级的还有个<Engine>(Tomcat引擎),也就是说<Service>有两个孩子,小儿子是<Connector>,大儿子是<Engine>。Connector的作用说穿了就是监听端口,如果用户访问地址是“localhost:8080/xx/xx”,那就由监听8080端口的Connector负责,如果是"https://www.baidu.com",那么就是443端口处理。其实Connector也不处理实际业务,它只是个孩子。但它会负责把客人(请求)带到哥哥Engine那,然后Engine会处理。
- <Engine>下面有个Host,代表主机。
配置介绍到这里,要先停一下,讲个故事:
从前有个国家,叫The United States of Tomcat。
国王Service是个爱猫的人,家庭和谐美满。他立了一个太子,叫做Engine。
另外还有还几个很小的儿子,不过都是亲王(Connector),未来可能还要再生几个Connector。
由于Tomcat国实在太小了,全城上下就几个人,所以亲王Connector们被派去守城门。
为了让太子得到锻炼,早日继承衣钵,国王Service告诉亲王儿子们:他国使者若来拜访,你们就带他去你们哥哥Engine那去,他会处理一切。
Engine贵为太子,有好几处府邸,比如HOST1,HOST2,未来可能再建几座府邸(新建虚拟主机),但是Engine说了,我一般都在localhost待着,来这找我便可。
每一座府邸里,都有好几个厢房(Context:我们开发的Web应用)。Engine会根据来访使者的通关文牒(localhost:8080/myWeb/index.html)安排他们去哪个房间(myWeb),拿什么礼品(index.html)。
最后结合文件目录再看一次Tomcat架构:
URL三种访问方式
我新建一个动态web工程,只是写了一个HTML,没有编写Servlet,甚至一句Java代码都没写。但是启动Tomcat后我却可以通过浏览器访问到刚才编写的index.html,这是为何?
我们知道,对于像Tomcat这样的Servlet容器来说,任何一个请求的背后肯定有个Servlet在默默处理:
所以这次也不例外,肯定也有对应的Servlet处理了本次请求。既然不是我们写的,那只能是Tomcat提供的。查看Tomcat下的conf目录,除了我们熟悉的Server.xml,还有个web.xml。
localhost:8080/demo/AServlet:很明显,我们手动写了一个AServlet处理它
localhost:8080/demo/haha.html:虽然我们没写,但是Tomcat自己准备了DefaultServlet
localhost:8080/demo/index.jsp:Tomcat使用了JspServlet来处理
DefaultServlet的作用:最低级匹配,当没有对应的Servlet处理当前请求时,才轮到它处理。要么找到并响应请求的资源,要么给出404页面。
JspServlet的作用:根据请求路径找到JSP,将它“翻译成”Servlet
总结一下Tomcat处理请求的几种方式:
Tomcat配置
1.下载、安装、卸载与启动
【下载】tomcat官方网站(mac下载 zip 和 tar.gz 都行)
【安装】下载完成后解压到目录即可(建议目录不要有中文,放在~/Library下)
【卸载】如果要卸载直接删除文件夹即可
【配置】
(1).对目录进行权限设置:
打开终端输入 sudo chmod 755 /Library/apache-tomcat-8.5.50/bin/startup.sh
回车,设置文件的读写执行权限;(这里需要输入管理员密码)
(2).启动Tomcat
找到startup.sh文件,把文件拖入到终端中回车启动
在浏览器中输入 http://localhost:8080/ 启动成功
【关闭】
在bin目录下有个shutdown.sh文件
/Library/apache-tomcat-8.5.50/bin/shutdown.sh
2.tomcat配置
1.项目部署的方式
-
直接将项目放到webapps目录下即可。
- /hello:项目的访问路径-->虚拟目录
- 简化部署:将项目打成一个war包,再将war包放置到webapps目录下。war包会自动解压缩。
-
配置conf/server.xml文件
- 在<Host>标签体中配置
<Context docBase="D:\hello" path="/hehe" />
docBase:项目存放的路径
path:虚拟目录
- 在<Host>标签体中配置
-
在conf\Catalina\localhost创建任意名称的xml文件。【推荐】
- 在文件中编写<Context docBase="D:\hello" />
虚拟目录:xml文件的名称
- 在文件中编写<Context docBase="D:\hello" />
2.动态项目目录结构
java动态项目的目录结构
-- 项目的根目录
-- WEB-INF目录:
-- web.xml:web项目的核心配置文件
-- classes目录:放置字节码文件的目录
-- lib目录:放置依赖的jar包
3.IDEA中的配置
在IDEA 【RUN】【Edit Configurations】【Tomcat Server】【Local】【Application server】进行配置,把tomcat所在的目录配置进去
【热部署】如下设置可以在更新资源的时候重启服务,也可以选择Update class and resourses,在java代码被修改的时候也可以重启服务。
【创建新项目】
如下设置即可
【要更改访问路径的根目录】
4.IDEA与tomcat的相关配置
1.IDEA会为每一个tomcat部署的项目单独建立一份配置文件
查看控制台的log:Using CATALINA_BASE:
"/Users/wengyifan/Library/Caches/IntelliJIdea2018.1/tomcat/Tomcat_8_5_50_tomcat案例项目"
2.工作空间项目 和 tomcat部署的web项目
- tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
- WEB-INF目录下的资源不能被浏览器直接访问。
3.断点调试:使用"小虫子"启动 dubug 启动