重温web服务器--细说Tomcat服务器
从大学开始接触java web的开发时就开始使用tomcat部署web项目,对它的理解仅仅停留在"这是个开源免费的servlet容器"的阶段,后来也接触了一些tomcat的体系,原理等方面的知识,也是半知半解,最近又开始看这方面的东西,截止到写这篇博文,我也不没有完全理解它,但一些比较基础的东西总算有些眉目了,读源码不易,且行且珍惜,这里写篇笔记整理下.
Tomcat体系结构
先盗张图:
可以看到,Tomcat有一个最顶层的容器,也就是server容器,它最大,在server容器中,可以有多个service,由service来提供服务,所以service不能没有,至少得有一个.
在service中,主要包含两个组件,Connector和Container.Container上图中没有标出,其实就是包含了Engine的部分.
Tomcat可以提供多种协议的请求,http协议就是其中一种,这里以http请求为例,一个http请求发到服务器时,由Connector来接收并进行转换,Connector就是用来处理连接相关工作的组件,比如可以进行Socket与request,response之间的转换,container是一个包含了servlet等众多资源的库,它接受Connector传过来的request请求,解析出请求的资源,返回给Container,所以Connector和Container一个主外一个主内,两人共同建立起美满的家庭.
当然上述比喻是不严谨的,因为一个Service中只有一个Container,但却可以有多个Connector,下面一段代码来自Tomcat目录下conf下的server.xml:
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
</Service>
可以看到,默认的Tomcat服务配置文件有两个Connector,一个负责监听8080端口,一个负责监听8009端口,前者我们很熟悉了,它用来监听来自于浏览器的http请求,然后会new出一个线程来把请求传给Engine,而后者则是用来监听其他类型的servlet/jsp请求,叫AJP协议(我也没听说过).
Container体系结构
继续盗图,Container的体系结构:
Container是tomcat中容器的接口,我们最熟悉的Servlet就封装在Container的子接口Wrapper中.看一下Server.xml中的配置:
<Service name="Catalina">
<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 "%r" %s %b" />
</Host>
</Engine>
</Service>
Container有四个子容器,根据图示以及xml配置就可以看出来他们是逐层包含的关系.
每个service中只有一个Engine,Engine中可以由多个Host,每个Host可以有多个Context,每个Context中可以有多个Wrapper,而每一个Wrapper里面就封装着一个Servlet.
下面分别简单总结几个容器:
Engine:顾名思义,引擎,它用来管理多个站点,也就是Host.
Host:表示一个站点,也可以叫做虚拟主机,在上面xml配置中,可以看到Tomcat默认配置了一个名为localhost的虚拟主机,我们部署,运行项目时,就默认进入这个站点,Tomcat回去webapps目录下去定位请求的web项目资源.
Context:意思是上下文,它表示一个应用程序,也就是我们开发的一个web项目,一个web项目就可以理解为一个Context.
Wrapper:每个Wrapper封装一个servlet.
默认配置下的webapps下的每一目录都是一个应用,其中有一个ROOT目录代表主应用,整个webapps表示一个站点(Host),当我们检测tomcat是否启动成功时一般都会打开http://localhost:8080/,这时候如果出现tomcat的官方站点就表示启动成功,其实这时候访问的就是ROOT应用下的资源,主应用就是直接使用域名访问就可以,假设webapps下还有一个helloword目录,如果你想访问helloword目录下的资源,就需要输入http://localhost:8080/helloword/.
conf目录下的配置文件server.xml
<Server port="8005" shutdown="SHUTDOWN">
<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 "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
在server.xml 中首先配置了一个server,在8005端口监听关闭命令"shutdown".
Server里定义了一个名为Catania的Service,Service里定义了两个Connector,一个是HTTP协议,一个是AJP协议,此外还定义了一个名为Catalina的Engine,Engine里定义了一个名为localhost的Host.
Host中name属性表示域名,所以这个默认Host可以用localhost来访问,appBase属性指定了站点的位置,这里就是webapps目录,这里还有很多属性,详细介绍,可以参考这篇博文:http://www.blogjava.net/baoyaer/articles/107278.html
Container体系结构
没盗到图,自己画一张:
Connector是用来接收请求并把请求封装成Request和Response来进行具体的业务处理的,底层使用的Socket连接.
Connector实现了TCP/IP协议和HTTP协议,他会把Request和Response按照HTTP协议来进行封装,封装完之后交给Container来进行处理,待Container处理完之后,再返回回来,Connector使用Socket将返回结果返回给浏览器,完成整个处理请求.
下面简单介绍Connector中的几个重要组件
ProtocolHandler:处理不同连接类型的请求,比如普通Socket请求和NioSocket请求.
Endpoint:处理底层Socket的网络连接.实现的是TCP/IP协议.
Processor:将Endpoint接收到的Socket请求封装成Request,实现的HTTP协议.
Adapter: 将Request请求适配给Container来处理.
整个Tomcat服务器其实就是java编写的一个应用,我尝试着读了一些源码,但资历尚浅,读的很艰难,一些代码上的实现方式和原理也不懂,只能大概理解一些类的功能,所以这里只是简单总结一些比较肤浅的知识,以后,有决心和毅力再去研读.共勉.
参考资料:
重温web服务器--细说Tomcat服务器的更多相关文章
- 部署Eclipse中的Web项目到Tomcat服务器运行
用Eclipse开发Web项目时,可以通过Tomcat服务器运行Web项目,此时Web项目被部署在[WorkSpace]\.metadata\.plugins\org.eclipse.wst.serv ...
- Web容器(tomcat服务器)处理JSP文件请求的三个阶段
Web容器(tomcat服务器)处理JSP文件请求的三个阶段 翻译:编写好的jsp文件被web容器中的jsp引擎转换成java源码. 编译:翻译成java源码的jsp文件会被编译成可被计算机执行的字节 ...
- Apache服务器和tomcat服务器有什么区别(转)
Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器. A ...
- Apache服务器和tomcat服务器有什么区别?
Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的 Web服务器运行.Apache是Web服务器而Tomcat是Java应用服务器. ...
- Eclipse部署Maven web项目到tomcat服务器时,没有将lib下的jar复制过去的解决办法
我们在做web开发是,经常都要在eclipse中搭建web服务器,并将开发中的web项目部署到web服务器进行调试,在此,我选择的是tomcat服务器.之前部署web项目到tomcat进行启动调试都很 ...
- 使用Maven自动部署Java Web应用到Tomcat服务器
学习如何使用Maven,我推荐一本工具书,<maven the definitive guide>.在这本工具书手中,详细介绍了maven的使用思想,并且提供了从基本到复杂的具体项目应用. ...
- [Java Web] 6、Tomcat服务器的安装及配置以及JSP技术笔记
目录 1.Web容器简介 2.Tomcat粗介及配置粗讲 3.Tomcat服务器配置 3-1.修改端口号 3-2.配置虚拟目录 3-3.配置首页 4.JSP执行流程 5.JSP粗略了解 1 ...
- 通过开发工具发布web应用到tomcat服务器中--对于小白,大神可以忽略不看,勿喷,谢谢
需要的工具 MyEclipse和TomCat 本人用的是MyEclipse2014和TomCat7 TomCat结构图 第一步:在MyEclipse中配置TomCat 如图所示: 第二步:创建Web项 ...
- java基础76 web服务器之Tomcat服务器
(注:本文是以“压缩版Tomcat”为例,展开描述的) 一.Tomcat服务器的介绍 1.服务器 1.1.服务器的种类 从物理上讲:服务器就是一台pc机器.至少8核/8G以上.内存至少用T来计算.宽带 ...
随机推荐
- phpMyAdmin view_create.php 跨站脚本漏洞
漏洞名称: phpMyAdmin view_create.php 跨站脚本漏洞 CNNVD编号: CNNVD-201307-066 发布时间: 2013-07-05 更新时间: 2013-07-05 ...
- [Poetize I]黑魔法师之门
描述 Description applepi被囚禁的地点只有一扇门,当地 人称它为“黑魔法师之门”.这扇门上画着一张无向无权图,而打开这扇门的密码就是图中[每个点的度数大于零且都是偶数]的子图的个数对 ...
- Final对象
常量指不能改变的量. 在Java中用final标志,声明方式和变量类似: final double PI = 3.1415927; 虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量. ...
- Redis源码阅读笔记(1)——简单动态字符串sds实现原理
首先,sds即simple dynamic string,redis实现这个的时候使用了一个技巧,并且C99将其收录为标准,即柔性数组成员(flexible array member),参考资料见这里 ...
- 自己做的网页页面导航浏览JS/JQuery
需求: 当页面是由一个巨大的表格构成时,浏览器自动会出现纵向和横向滚动条,这时用户浏览页面会出现很蛋疼的感受,那就是恶心的横向滚动条! 为了减缓这种蛋疼的感觉,我尝试做了这个导航器(不知道如何称呼), ...
- Java中的数据类型及相互转换方法
本文主要讲解两个部分: 一.Java中的数据类型有哪些? 二.数字类型和字符串类型相互转换的方法? 一.Java中的数据类型有哪些: Java中的数据类型有:基本数据类型和引用数据类型: 基本数据类型 ...
- Selenium firefox 版本问题
问题:Unable to connect to host 127.0.0.1 on port 7055 after 45000 ms 原因: selenium-server-standalone-x. ...
- python-从redis数据库中读数据
读string,list,set,sort_set,hash类型的数据 import redis class DataBase: def __init__(self, host, port): sel ...
- Unable to locate the Javac Compiler 解决办法
在使用eclipse对maven项目进行编译打包(Run As->Maven install)时,报以下错误:[ERROR] Failed to execute goal org.apache. ...
- ExtJS4.2学习(6)——基础知识之proxy篇
本次讨论下数据代理,其实个人第一次听到这个短语的时候,并不是特别的适应,在英语中的含义是proxy,其实如若大家也觉得不适应的话,就直接称呼proxy吧. 在ExtJS中,proxy是进行数据读写的主 ...