Tomcat的结构和对请求的处理

Tomcat的结构和对请求的处理

Writenby 蒋彪@东京

2012/7/3

1. 问题

起因是今天帮一个小朋友装开发环境。

工程是javaEE的,基于maven管理依赖,开发工具是eclipsetomcat

工程怎么搞都启动出错,最后发现是该工程的web.xml中定义了自己的defaultservletjspservlet

tomcat启动的时候,会首先读取conf/web.xml下的定义,两者之间肯定要有一个被comment掉。

tomcat玩了这么多年,有必要把东西理一遍。

2. Tomcat的大结构

tomcat启动之后,将作为一个运行于JVM上的进程存在。

tomcat从层次上,最外围是server本身。

然后server里可以有多个service。每个service可以监听几个不同的端口号。

接下来,每个service里有多个connector。不同的connector监听不同的端口好,使用不同的通信协议。多个connector连接同一个containercontainer管辖多个webapp

所有的这一切都定义在server.xml中。

<!—最高节点 8005端口是shudown shell用端口号-->
<Server port="8005" shutdown="SHUTDOWN">
//JNDI全局资源
<GlobalNamingResources>
//service,可以有多个
<Service name="Catalina">
//connector 我们一般都是用8080端口的http请求
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
//每个connector都可以定义自己的线程池
<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" />
//处理请求的容器
<Engine defaultHost="localhost" name="Catalina">
//cluster配置
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
//虚拟主机,可以定义多个虚拟主机。比如www.aaa.com,www.bbb.com,全部映射到同一个容器中。(用于实现SSO)
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false">
//具体的context,用来指明webapp的路径
<Context docBase="xxx" path="/xxx" reloadable="true" source="xxx"/>


作为tomcat的启动而言,一般来说

根据conf/server.xml启动所有必要组建

加载conf/web.xml中所有配置

依次加载所有webapp中的web.xml

3. Tomcat中请求的处理

假设来自客户的请求为:http://www.xxx.com/test/index.jsp

a. 请求被发送到该物理机器的默认端口80,被在那里侦听的Coyote HTTP/1.1 Connector获得 (没有考虑apache)

b. Connector封装http请求,并且从线程池中唤醒一个线程,将任务调度给该线程

  1. 被唤醒线程在Engine中寻找www.xxx.com匹配的虚拟主机
  2. 被找到的Host获得请求/test/index.jsp,匹配它所拥有的所有Context
  3. Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
  4. path="/test"的Context获得请求/index.jsp
  5. Context开始解析http请求,首先由filter处理,再次交给servlet

现行的Web框架都是由filter拦截

顺便提一下,这也就是为什么很多人说servlet不是线程安全的。

  1. Context把执行完了之后的HttpServletResponse对象返回给Host
  2. Host把HttpServletResponse对象返回给Engine
  3. Engine把HttpServletResponse对象返回给Connector
  4. Connector把HttpServletResponse对象返回给客户browser
  5. 线程重回wait状态

#以上#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值