nullTomcat源码
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
Tomcat源码分析如何构建一个web应用服务器Tomcat源码分析Tomcat整体架构1创建一个简单的Http Server2核心组件介绍:Connector , Container3其它组件介绍:Lifecycle etc4Tomcat用到的
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
模式5Tomcat源码分析Tomcat整体架构Tomcat整体架构Tomcat源码分析Tomcat整体架构1创建一个简单的Http Server2核心组件介绍:Connector , Container3其它组件介绍:Lifecycle etc4Tomcat用到的设计模式5Tomcat源码分析A Simple Http ServerA Simple Http Server
问题:通过浏览器请求一个html文件
输入:http://127.0.0.1:8080/A.html
A Simple Http ServerA Simple Http ServerA Simple Http ServerA Simple Http Server过程:
HttpServer:创建一个ServerSocket用来监听http的请求。
Request:将请求封装为Request对象,Request对象对http请求进行解析,提供getUrl方法来获取客户请求的文件名称(A.html)
Response:根据request中的文件路径去本地目录下读取A.html,将文件内容返回给请求的浏览器。
Http Reqeust 报文Http Reqeust 报文GET /servlet/SHost: 127.0.0.1:8080
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: zh-CN,zh;q=0.8
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3howDateServlet HTTP/1.1
A Simple Sevlet ServerA Simple Sevlet Server
问题:通过浏览器请求一个servlet,servlet返回当前时间
输入:http://127.0.0.1:8080/ShowDateServlet
A Simple Sevlet ServerA Simple Sevlet ServerA Simple Sevlet ServerA Simple Sevlet Server过程:
ShowDateServlet:实现javax.servlet.Servlet,重写service方法
Request:实现javax.servlet.ServletRequest
Response:实现javax.servlet.ServletResponse
ServletProcessor:根据请求的servlet名称,通过反射获得servlet的类,实例化后调用service方法。
StaticResourceProcessor:获取静态资源
HttpServer:创建一个ServerSocket用来监听http的请求。获得http请求创建Reqeust和Response,根据请求的路径来选择Processor进行处理。
Tomcat源码分析Tomcat整体架构1创建一个简单的Http Server2核心组件介绍:Connector , Container3其它组件介绍:Lifecycle etc4Tomcat用到的设计模式5Tomcat源码分析核心组件介绍Simple Connector and Container1Tomcat Default Connector2Tomcat Container345核心组件介绍Tomcat StandardWrapperTomcat StandardContextSimple Connector And ContainerSimple Connector And Container
问题:抽象,模块化。
Connector:负责接收客户端的请求。
Container:处理并响应请求。
Simple Connector And ContainerSimple Connector And ContainerSimple Connector And ContainerSimple Connector And Container过程:
SimpleConnector:长驻线程。启动ServerSocke监听http请求,获得请求后创建HttpProcessor,并触发proccess方法
HttpProcessor:接受socket,并创建Request和Response,调用connector中已经注入的container,并调用其invoke方法
SimpleContainer:invoke方法被触发,根据Request的请求路径加载sevlet并触发sevlet的service方法,或者加载静态文件。返回给浏览器。
Bootstrap:启动类,创建Connector和Container,将Container注入到Connector中,启动Connector。
Connector and ConnectorConnector and Connector核心组件介绍Simple Connector and Container1Tomcat Default Connector2Tomcat Container345核心组件介绍Tomcat StandardWrapperTomcat StandardContextTomcat Default ConnectorTomcat Default Connector
问题:如何实现多线程处理客户请求?
Tomcat Default ConnectorTomcat Default Connector
接口: org.apache.catalina. Connector
核心方法:
getContainer
setContainer(Container)
createRequest
createResponse
Initialize
Tomcat Default ConnectorTomcat Default ConnectorTomcat Default ConnectorTomcat Default ConnectorTomcat Default ConnectorTomcat Default ConnectorHttpConnector:实现 org.apache.catalina. Connector
过程:
HttpConnector创建多个HttpProcessor。
HttpConnector创建一个类型为Vector的属性created,目的是缓存创建的HttpProcessor。
HttpConnector创建一个类型为Stack的属性processors,目的是缓存空闲的HttpProcessor。
HttpConnector接受到每个客户端请求,从processors中获取一个空闲的HttpProcessor,将请求分配给此HttpProcessor,如果没有空闲的HttpProcessor则根据最大线程数限制,来创建新的HttpProcessor或者等待出现回收的HttpProcessor。
HttpProcessor触发HttpConnector关联的Container去处理请求。完成处理后进行自身回收,重新进入HttpConnector的Stack
核心组件介绍Simple Connector and Container1Tomcat Default Connector2Tomcat Container345核心组件介绍Tomcat StandardWrapperTomcat StandardContextTomcat ContainerTomcat Container
问题:如何让Container层级化?
Tomcat ContainerTomcat Container接口: org.apache.catalina.Container
核心方法:
invoke(Request, Response)
setParent(Container)
getParent():Container
addChild(Container)
removeChild(Container)
map(Request):Container
WapperWapperWapper:将一个Sevlet抽象为Wapper
ContextContextContext:将一个web工程抽象为ContextHostHostHost:将一个Tomcat虚拟机抽象为HostEngineEngineEngine:实现多个虚拟Host共享一个ConnectorTomcat ContainerTomcat Container
核心组件介绍Simple Connector and Container1Tomcat Default Connector2Tomcat Container345核心组件介绍Tomcat StandardWrapperTomcat StandardContextTomcat StandardWrapperTomcat StandardWrapperTomcat StandardWrapperTomcat StandardWrapperTomcat StandardWrapperTomcat StandardWrapper
问题:如何实现servlet的线程安全?
Tomcat StandardWrapperTomcat StandardWrapper
Servlet实现javax.servlet.SingleThreadModel
Servlet instance =
;
if ((servlet implementing SingleThreadModel)
{
synchronized (instance)
{
instance.service(request, response);
}
}
else
{
instance.service(request, response);
}
Tomcat StandardWrapperTomcat StandardWrapper
将servlet实例注入到instancePool对象池
private Stack instancePool ;
private int maxInstances = 20;
private int nInstances = 0;
synchronized (instancePool)
{
if (nInstances < maxInstances) {
instancePool.push(loadServlet());
nInstances++;
}else{
instancePool.wait();
}
}
核心组件介绍Simple Connector and Container1Tomcat Default Connector2Tomcat Container345核心组件介绍Tomcat StandardWrapperTomcat StandardContextTomcat StandardContextTomcat StandardContextTomcat StandardContextTomcat StandardContextTomcat源码分析Tomcat整体架构1创建一个简单的Http Server2核心组件介绍:Connector , Container3其它组件介绍:Lifecycle etc4Tomcat用到的设计模式5Tomcat源码分析LifecycleLifecycle
问题:
1.管理组件的生命周期,启动和停止Tomcat中的组件
2.获得指定组件启停的事件(例如创建一个消息发送类,当connector停止的时候,要发信息给管理者)
LifecycleLifecycle
Lifecycle组成:
Lifecycle:定义组件生命的接口
LifecycleEvent:封装事件数据
LifecycleListener:定义监听者的接口
LifecycleSupport:封装所有监听者
LifecycleException:异常
LifecycleLifecycleLifecycle:
start():启动生命周期
stop():停止生命周期
addLifecycleListener(listener)
removeLifecycleListener(listener)
findLifecycleListeners():LifecycleListener[]
String START_EVENT = “start“:事件类型
String STOP_EVENT = “stop”:事件类型LifecycleLifecycleLifecycleEvent:
属性:
String type:事件类型
Object data:事件关联的数据
Lifecycle lifecycle:生命本身
方法:
LifecycleEvent(Lifecycle lifecycle, String type, Object data)
getType()
getData()
getLifecycle()
LifecycleLifecycle
LifecycleListener:
lifecycleEvent(LifecycleEvent event):当所监听的生命组件发生事件时候会触发本方法。LifecycleLifecycleLifecycleSupport:
属性:
LifecycleListener listeners[] :包含listener
Lifecycle lifecycle:生命本身
方法:
addLifecycleListener(LifecycleListener listener)
findLifecycleListeners(): LifecycleListener[]
removeLifecycleListener(LifecycleListener listener)
fireLifecycleEvent(String type, Object data):触发所包含的所有listnerLifecycleLifecyclenullClass Triger implemt Lifecycl
{
List listerList;
addListener(Listener listener)
{
Listener.add(listener);
}
Run()
{
While(true)
{
For(Listener ls:listerList)
{
Ls.lifecycEven();
}
Wait(50000);
}
}
}Tomcat整体架构Tomcat整体架构Server and ServiceServer and Serviceconfig/server.xmlconfig/server.xml
Tomcat源码分析Tomcat整体架构1创建一个简单的Http Server2核心组件介绍:Connector , Container3其它组件介绍:Lifecycle etc4Tomcat用到的设计模式5Tomcat源码分析Tomcat用到的设计模式Tomcat用到的设计模式
观察者设计模式
门面设计模式
责任链设计模式
观察者设计模式观察者设计模式门面设计模式门面设计模式责任链设计模式责任链设计模式nullQ&A