|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。
Tomcat研讨之组件布局
人人好,上篇先容了《Tomcat研讨之ClassLoader》,这篇我们先容组件布局
在没有任何本色性材料的条件下研讨Tomcat的内核将长短常坚苦的事变,但不管怎样另有opensource,我们最少能够跟踪Tomcat成百上千的类,为了我们能完全解开Tomcat的面纱,我们仍是要持续勉力.
经由过程UML类图不丢脸出,Core包内里最主要的一个类是ContainerBase,而这个笼统类完成了Container,Lifecycle,Pipeline,MBeanRegistration,Serializable接口,Serializable接口人人都已很熟习,我们重在研讨前几个接口,由于我们料想全部Tomcat的部分构架多是创建在这几个基本接口上.
在进进剖析之前我们先回想一下config.xml(server.xml)文件,从这个文件及apache的文档我们大致能够懂得到Tomcat微观上是有上面几个部分构成:
-Serverserver元素是JVM的出口点,全部设置文件只要一个,由于server不是容器(container),因而不克不及嵌套子组件.server在某一指定的端口监听shutdown命令.server能够包括一个或多个service实。
-Serviceservice有共享统一个Container的一个或多个Connectors构成,一样平常Service就是一个Engine,但没有明白标准请求云云.由于Service不是一个Container,因而不克不及在内里嵌套子组件(好比Loggers/Valves)。
-Connector connector就是一个Tomcat与客户真个毗连,Tomcat有两种典范的Connector:http,JK2.httpconnector监听来自Browser的毗连(一般在我们熟习的8080端口),JK2.来自其他WebServer的哀求(默许在8009端口监听)。Connector会把取得的哀求交给Engine处置。
-EngineEngine下能够设置多个假造主机VirtualHost,每一个假造主机都有一个域名当Engine取得一个哀求时,它把该哀求婚配到某个Host上,然后把该哀求交给该Host来处置Engine有一个默许假造主机,当哀求没法婚配就任何一个Host上的时分,将交给该默许Host来处置
-Hosthost代表一个假造主机,默许是localhost,host下能够部署多个webapplication,在我们实践使用中一样平常要思索成绩的对象就是host
1.org.apache.catalina.Lifecycle
通用的组件声明周期接口,一样平常Tomcat的组件都要完成这个接口(但不是必需的),这个接口是为一切组件供应不异的start和stop。次要办法有:
//增添一个监听器
publicvoidaddLifecycleListener(LifecycleListenerlistener);
/**
*这个办法应当在任何public办法被挪用前被挪用
*该办法发送一个START_EVENT事务到一切注册到
*该组件的监听器
*/
publicvoidstart()throwsLifecycleException;
/**
*这个办法应当在一切public办法被挪用以后被挪用
*该办法发送一个STOP_EVENT事务到一切注册到
*该组件的监听器
*/
publicvoidstop()throwsLifecycleException;
2.org.apache.catalina.LifecycleListener
该接口用于监听一些主要事务(包含完成了Lifecycle接口组件发生的start,stop事务)
次要办法是:
//处置监听到的事务
publicvoidlifecycleEvent(LifecycleEventevent);
3.org.apache.catalina.Container
容器是用于从客户端获得哀求(request)而且处置哀求并复兴给客户端(response)的对象。容器能够撑持(可选)pipeline,以便能在运转时按设置的按次处置哀求。
在Tomcat内里,容器在观点上存在以下及层:
Engine哀求处置出口点,能够包括多个Host和Context
Host代表一个假造主机
Context代表单个ServletContext,能够包括多个Wrappers
Wrapper代表单个Servlet,假如Servlet完成了SingleThreadModel,能够代表单个Servlet的多个实例。
容器为了完成本人的功效常常要绑定一些其他组件,这些组件的功效大概被共享,也能够被独自定制,上面是被利用的组件:
LoaderClassLoader,装载JavaClasses
Logger完成了ServletContext的log办法,用于纪录日记
Manager办理与容器绑定的session池
Realm用户平安办理
ResourcesJNDI资本会见
次要的办法:
//增添容器监听器
publicvoidaddContainerListener(ContainerListenerlistener);
//增添property监听器
publicvoidaddPropertyChangeListener(PropertyChangeListenerlistener);
/**
*处置Request,并发生响应地Response
*paramrequest处置的哀求
*paramresponse发生的response
*/
publicvoidinvoke(Requestrequest,Responseresponse)throwsIOException,ServletException;
4.org.apache.catalina.ContainerListener
容器事务监听器,注重的是start,stop是一般的性命周期事务(LiftcycleEvent)不是容器事务。次要办法:
//处置容器事务
publicvoidcontainerEvent(ContainerEventevent);
5.org.apache.catalina.Pipeline
Pipleline是Valve的汇合,当invoke办法被挪用时,它会按指定的按次挪用Valve,它老是请求有一个Valve必需处置传送的request(通常为最初一个)并发生response,不然就把request传送到下一个Valve。
一样平常一个容器仅绑定一个Pipleline实例,一样平常说来容器会把处置request的功效封装到一个容器绑定的Valve里(这个Valve应当在Pipleline最初被实行)。为了完成这个功效,Pipleline供应了setBasic()办法以包管Valve被最初实行,而其他Valve按按次被挪用。
6.org.apache.catalina.Valve
Valve是被绑定在一个Container上的哀求处置组件,一组Valve被按按次绑定在一个Pipleline上。Valve最主要的一个办法是:
/**
*一个Valve大概依照必定的按次实行上面的举措
*1.反省而且(大概)修正指定的Request和Response属性
*2.反省Request属性,天生响应的Response并前往把持权到挪用者
*3.反省Request和Reponse属性,包装这些对象并加强它们的功效,然后把它们传
到下一个组件
*4.假如响应的Response没有被发生(而且把持权也没有被前往)挪用Pipleline
上的下一个Valve(假如有)经由过程办法context.invokeNext()
*5.反省(但不修正)Response属性(挪用前面的Valve或Container发生的)
*Valve必定不克不及作上面的事变
*1.改动Request的一些属性(Changerequestpropertiesthathave
alreadybeenusedtodirecttheflowofprocessingcontrol
forthisrequest)
*2.创立一个已被创立而且已被传送的Response
*3.在挪用invokeNext()办法并前往后修正包括Response的HTTPHeader信息
*4.在invokeNext()挪用前往后在绑定Response上的输入流上作任何挪用
*@paramrequest将被处置的Request
*@paramresponse将被创立的Response
*@paramcontext被用来挪用下一个Valve的ValveContext
publicvoidinvoke(Requestrequest,Responseresponse,
ValveContextcontext)
throwsIOException,ServletException;
7.org.apache.catalina.ValveContext
一个ValveContext是如许一种机制:一个Valve能够触发下一个Valve的挪用,而不用晓得机制的内涵完成。
8.org.apache.catalina.Engine
Engine是一个容器,是Cataline的Servlet的出口点。
当公布一个毗连到WebServer的Cataline时大概不利用Engine,由于Connectior将利用WebServer的资本决意利用哪一个Context处置Request。
从属于Engine的子容器依据Engine完成的分歧多是Host或Context(单个ServletContext)。
假如利用了Engine,在Cataline的条理中它就是顶层容器,因而setParent()应改抛出IllegalArgumentException非常。从Engine上面几个办法我们能够看出其的布局:
/**
*设定Engine从属的Service
*@paramserviceTheservicethatownsthisEngine
*/
publicvoidsetService(Serviceservice);
/**
*SetthedefaulthostnameforthisEngine.
*
*@paramdefaultHostThenewdefaulthost
*/
publicvoidsetDefaultHost(StringdefaultHost);
/**
*SettheDefaultContext
*fornewwebapplications.
*
*@paramdefaultContextThenewDefaultContext
*/
publicvoidaddDefaultContext(DefaultContextdefaultContext);
9.org.apache.catalina.Host
Host是一个容器,它代表一个假造主机。
当公布一个毗连到WebServer的Cataline时大概不利用Host,由于Connectior将利用WebServer的资本决意利用哪一个Context处置Request。
Host所从属的父容器一般是Engine,从属于Host的子容器一般是Context(单个ServletContext)。
Host接口内里的办法多半都是关于修正Host属性及设定默许的Context。这里我们不再逐一枚举。
10.org.apache.catalin.Context
Context是一个容器,它代表一个ServletContext,一个CatalineEngline中的单个的WebApplication。Context所从属的父容器是Host,从属于Context的子容器是Wrapper(代表单个Servlet)。Context接口内里多半是关于WebApplication的设置的办法,我们能够参考Web.xml文件研讨内里的办法,内里多半办法都是怎样读取Web.xml文件里的资本。
11.org.apache.catalina.Wrapper
Wrapper是一个容器,它代表单个Servlet。Wrapper办理Servlet的性命周期,包含挪用init()和destory()办法。
Wrapper所从属的父容器是Context,没有从属于Wrapper的子容器,办法addChild()应当抛出IllegalArgumentException非常。
Wrapper接口内里的办法都是关于读取Servlet的属性,能够参考Web.xml文件内里关于<servlet>标签的界说。
12.org.apache.catalina.Server
Server是全部Catalina容器的出口点,能够包括多个Service和顶层资本元素。一样平常说来完成Server接口的类也应当同时完成Lifecycle接口,当start()和stop()办法被挪用的时分挪用Service响应的办法。
Server卖力在指定的端口监听毗连,当有毗连被承受的时分,Server会剖析哀求的第一行信息,假如是SHUTDOWN则stop服务。能够参考Server.xml文件关于Server的界说。
13.org.apache.catalina.Service
Service是一个或多个共享同以Container的Connectiors的汇合。
JVM能够包括一个或多个Service实例,但它们互相之间是完整自力的,它们仅共享JVM的资本。
14.org.apache.catalina.Connector
Connector是一个从客户端承受哀求(request)并天生回应(reponse)的组件。一个Connection一般实行上面的逻辑:
1)从客户端程序承受哀求
2)创立Request和Response,并把上面这些属性设置到这些对象
(1)对一切的Request,connector,protocol,protocol,response,scheme,secure,serverName,serverPort,serverPort属性必需被设置。contentLength,contentType一般也被设置。
3)对一切的HttpRequests,method,queryString,requestedSessionCookie,requestedSessionId,requestedSessionURL,requestURI,secure属性必需被设置。别的一切addXxx办法也必需被挪用以纪录cookies,headers和locales信息。
4)对一切的Responses属性connector,request,stream属性必需被设置。
对HttpResponses来讲,connector不会为它设置分外headers信息。
1.Tomcat全体架构类图
下篇将从Tomcat的各个组件动手先容Tomcat。
唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具 |
|