??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲综合亚洲国产尤物,成人亚洲性情网站WWW在线观看,亚洲免费一级视频http://www.tkk7.com/sutao/articles/162796.html苏醄苏醄Sat, 24 Nov 2007 02:48:00 GMThttp://www.tkk7.com/sutao/articles/162796.htmlhttp://www.tkk7.com/sutao/comments/162796.htmlhttp://www.tkk7.com/sutao/articles/162796.html#Feedback0http://www.tkk7.com/sutao/comments/commentRss/162796.htmlhttp://www.tkk7.com/sutao/services/trackbacks/162796.html很早听说tomcat6使用nio了,q几天突然想C个问题,使用nio代替传统的bioQThreadLocal岂不是会存在冲突Q?
  
  
  
  首先Q何谓nioQ?
  
  如果读者有socket的编E基Q应该会接触q堵塞socket和非堵塞socketQ堵塞socket是在accept、read、write{IO操作的的时候,如果没有可用W合条g的资源,不马上返回,一直等待直到有资源为止。而非堵塞socket则是在执行select的时候,当没有资源的时候堵塞,当有W合资源的时候,q回一个信P然后E序可以执行accept、read、write{操作,q个时候,q些操作是马上完成,q且马上q回。而windows的winsock则有所不同Q可以绑定到一个EventHandle里,也可以绑定到一个HWND里,当有资源到达Ӟ发出事gQ这时执行的io操作也是马上完成、马上返回的。一般来_如果使用堵塞socketQ通常我们时开一个线Eaccept socketQ当有socket链接的时候,开一个单独的U程处理q个socketQ如果用非堵塞socketQ通常是只有一个线E,一开始是select状态,当有信号的时候马上处理,然后l箋select状态?
  
  按照大多Ch的说法,堵塞socket比非堵塞socket的性能要好。不q也有小部分人ƈ不是q样认ؓ的,例如Indy目QDelphi一个比较出色的|络包)Q它?yu)是使用多线E+堵塞socket模式的。另外,堵塞socket比非堵塞socketҎ(gu)理解Q符合一般h的思维Q编E相Ҏ(gu)较容易?
  
  nio其实也是cM上面的情c在JDK1.4Qsun公司大范围提升Java的性能Q其中NIO是其中一VJava的IO操作集中在java.ioq个包中Q是Z的dAPIQ即BIOQBlock IOQ。对于大多数应用来说Q这LAPI使用很方便,然而,一些对性能要求较高的应用,其是服务端应用Q往往需要一个更为有效的方式来处理IO。从JDK 1.4PNIO API作ؓ一个基于缓冲区Qƈ能提供非dO操作的APIQ即NIOQnon-blocking IOQ被引入?
  
  BIO与NIO一个比较重要的不同Q是我们使用BIO的时候往往会引入多U程Q每个连接一个单独的U程Q而NIO则是使用单线E或者只使用量的多U程Q每个连接共用一个线E?
  
  
  
  q个时候,问题出来了Q我们非常多的java应用是用ThreadLocal的,例如JSF的FaceContext、Hibernate的session理、Struts2的Context的管理等{,几乎所有框枉或多或少地应用ThreadLocal。如果存在冲H,那岂不惊天动圎ͼ
  
  后来l于在Tomcat6的文档(http://tomcat.apache.org/tomcat-6.0-doc/aio.htmlQ找到答案。根据上面说明,应该Tomcat6应用nio只是用在处理发送、接收信息的时候用刎ͼ也就是说Qtomcat6q是传统的多U程ServletQ我M下面两个图来列出区别Q?
  
  
  
  tomcat5Q客Lq接到达 -> 传统的SeverSocket.accept接收q接 -> 从线E池取出一个线E?-> 在该U程d文本q且解析HTTP协议 -> 在该U程生成ServletRequest、ServletResponseQ取求的Servlet -> 在该U程执行q个Servlet -> 在该U程把ServletResponse的内容发送到客户端连?-> 关闭q接?
  
  我以前理解的使用nio后的tomcat6Q客Lq接到达 -> nio接收q接 -> nio使用轮询方式d文本q且解析HTTP协议Q单U程Q?-> 生成ServletRequest、ServletResponseQ取求的Servlet -> 直接在本U程执行q个Servlet -> 把ServletResponse的内容发送到客户端连?-> 关闭q接?
  
  实际的tomcat6Q客Lq接到达 -> nio接收q接 -> nio使用轮询方式d文本q且解析HTTP协议Q单U程Q?-> 生成ServletRequest、ServletResponseQ取求的Servlet -> 从线E池取出U程Qƈ在该U程执行q个Servlet -> 把ServletResponse的内容发送到客户端连?-> 关闭q接?
  
  
  
  从上囑֏以看出,BIO与NIO的不同,也导致进入客L处理U程的时L所不同Qtomcat5在接受连接后马上q入客户端线E,在客LU程里解析HTTP协议Q而tomcat6则是解析完HTTP协议后才q入多线E,另外Qtomcat6也比5早脱dLU程的环境?
  
  实际的tomcat6与我之前猜想的差别主要集中在如何处理servlet的问题上。实际上即抛开ThreadLocal的问题,我之前理解tomcat6只用一个线E处理的x其实是行不同的。大安有经验:servlet是基于BIO的,执行期间会存在堵塞的Q例如读取文件、数据库操作{等。tomcat6使用了nioQ但不可能要求servlet里面要用nioQ而一旦存在堵塞,效率自然会锐降?
  
  
  
  
  所以,最l的l论当然是tomcat6的servlet里面QThreadLocal照样可以使用Q不存在冲突?
  

苏醄 2007-11-24 10:48 发表评论
]]>
TOMCAT框架分析(消息处理)http://www.tkk7.com/sutao/articles/143620.html苏醄苏醄Sat, 08 Sep 2007 08:38:00 GMThttp://www.tkk7.com/sutao/articles/143620.htmlhttp://www.tkk7.com/sutao/comments/143620.htmlhttp://www.tkk7.com/sutao/articles/143620.html#Feedback0http://www.tkk7.com/sutao/comments/commentRss/143620.htmlhttp://www.tkk7.com/sutao/services/trackbacks/143620.html0Q前a

我们知道?strong style="color: black; background-color: #ffff66;">tomcat的整体框架了Q?也明白了里面都有些什么组Ӟ 以及各个lg是干什么用的了?/span>

http://www.csdn.net/Develop/read_article.asp?id=27225

我想Q接下来我们应该M解一?tomcat 是如何处理jsp和servleth的?/span>

1.  我们以一个具体的例子Q来跟踪TOMCATQ?/span>看看它是如何?/span>Request一层一层地递交l下一个容器,q最后交l?/span>Wrapper来处理的?/span>

?/span>http://localhost:8080/web/login.jspZ?/span>

Q以下例子,都是?/span>tomcat4 源码为参考)

q篇心得主要分ؓ3个部分: 前期Q?中期Q?和末期?/span>

 前期Q讲解了在浏览器里面输入一个URLQ是怎么?strong style="color: black; background-color: #ffff66;">tomcat抓住的?/span>

中期Q讲解了?strong style="color: black; background-color: #ffff66;">tomcat抓住后,又是怎么在各个容器里面穿梭, 最后到达最后的处理地点?/span>

末期Q讲解到达最后的处理地点后,又是怎么具体处理的?/span>

2?/span> 前期 Request的born.

    在这里我先简单讲一下requestq个东西?/span>

     我们先看着q个URLQ?/span>http://localhost:8080/web/login.jsp 它是动用?080端口来进行socket通讯的?/span>

     我们知道, 通过

       InputStream in = socket.getInputStream() ?/span>

       OutputStream out = socket.getOutputStream()

     可以实现消息的来来往往了?/span>

     但是如果把Streaml应用层看,昄操作h不方ѝ?

     所以,?strong style="color: black; background-color: #ffff66;">tomcat 的Connector里面Q?socket被封装成了Request和Responseq两个对象?/span>

     我们可以单地把Request看成发到服务器来的数据Q把Response看成惛_出服务器的数据?/span>

     

     但是q样又有其他问题了啊Q?Requestq个对象是把socket装h了, 但是他提供的又东西太多了?/span>

     诸如Request.getAuthorization(), Request.getSocket()?nbsp;像Authorization q种东西开发h员拿来基本上用不太着Q而像socketq种东西Q暴露给开发h员又有潜在的危险?而且啊, 在Servlet Specification里面标准的通信cLServletRequest和HttpServletRequestQ而非q个RequestcR? So, So, So. Tomcat必须得捣持捣持Request才行?最?strong style="color: black; background-color: #ffff66;">tomcat选择了用捣持模式(应该叫适配器模式)来解册个问题。它把org.apache.catalina.Request 捣持成了 org.apache.coyote.tomcat4.CoyoteRequest?而CoyoteRequest又实CServletRequest和HttpServletRequest q两U接口?q样提供给开发h员需要且刚刚需要的Ҏ(gu)了?/span>

 

    ok, ?/span>我们?tomcat的顶层容?- StandardEngin 的invoke()Ҏ(gu)q里讄一个断点, 然后讉K

    http://localhost:8080/web/login.jspQ?我们来看看在前期都会路过哪些地方Q?/span>

       1. run(): 536, java.lang.Thread, Thread.java

       CurrentThread

      2. run():666, org.apache.tomcat.util.threads.ThreadPool$ControlRunnable, ThreadPool.java

               ThreadPool

       3. runIt():589, org.apache.tomcat.util.net.TcpWorkerThread, PoolTcpEndpoint.java

         ThreadWorker

4.        processConnection():  549

org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler, Http11Protocol.java

                  http protocol parser

      5. Process(): 781, org.apache.coyote.http11.Http11Processor, Http11Processor.java

          http request processor

       6. service(): 193, org.apache.coyote.tomcat4.CoyoteAdapter,CoyoteAdapter.java

         adapter

       7. invoke(): 995, org.apache.catalina.core.ContainerBase, ContainerBase.java

   StandardEngin

    1. ȝE?/span>

    2. 启动U程?

    3. 调出U程池里面空闲的工作U程?/span>

    4. ?080端口传过来由httpd协议装的数据,解析成Request和Response对象?/span>

    5. 使用Http11Processor来处理request

    6. ?/span>Http11Processor里面Q?又会call CoyoteAdapter来进行适配处理Q把Request适配成实CServletRequest和HttpServletRequest接口?/span>CoyoteRequest.

7. Cq里Q前期的L拔皮工作基本上搞定Q可以交l?/span>StandardEngin 做核心的处理工作了?/span>

3. 中期?在各个容器间的穿梭?/span>

    Request在各个容器里面的I梭大致是这样一U方式:

    每个容器里面都有一个管道(piplineQ, 专门用来传送Request用的?/span>

    道里面又有好几个阀门(valveQ, 专门用来qoRequest用的?/span>

    在管道的低部通常都会放上一个默认的阀们?q个阀们至会做一件事情,是把Request交给子容器?/span>

    让我们来惌一下:

     当一个Requestq入一个容器后Q?它就在管道里面流动,波罗~ 波罗~ 波罗~ 地穿q各个阀门。在到最后一个阀门的时候,吧唧~ 那个该死的阀门就把它扔给了子容器?然后又开?波罗~ 波罗~ 波罗~ ... 吧唧~.... 波罗~ 波罗~ 波罗~ ....吧唧~....

    是通过q种方式Q?Request 走完了所有的容器。( 感觉有点像消化系l,最后一个地Ҏ(gu)点像那里~ Q?/span>

    OKQ?让我们具体看看都有些什么容器, 各个容器里面又都有些什么阀门,q些阀们都Ҏ(gu)们的Request做了些什么吧Q?br />

3.1 StandardEngin 的pipeline里面攄是:StandardEnginValve

在这里,VALVE做了三g事:

1.   验证传递过来的request是不?/span>httpservletRequest.

2    验证传递过来的 request 是否携带?/span>host header信息.

3    选择相应?/span>hostd理它。(一般我们都只有一个host:localhostQ也是127.0.0.1Q?/span>

Cq个地方Q?/span>我们?/span>request已l完成了?/span>Enginq个部分的历史命,通向前途未卜的下一站: host了?/span>

3.2 StandardHost 的pipline里面攄是: StandardHostValve

1.   验证传递过来的request是不?/span>httpservletRequest.

2.   Ҏ(gu)Request来确定哪?/span>Context来处理?/span>

Context其实是webappQ?/span>比如http://localhost:8080/web/login.jsp

q里webContext|!

3.   既然定了是哪个Context了,那么应该把那个Context?/span>classloader付给当前U程了?/span>

        Thread.currentThread().setContextClassLoader(context.getLoader().getClassLoader());

   q样request只看得见指定的context下面?/span>classes啊, jar啊这些,而看不见tomcat本n的类Q?/span>什?/span>Engin啊, Valve啊?/span>不然q得了啊Q?/span>

4. 既然requestCq里了,看来用户是准备访问webq个web app了,咋们得更C下这个用Lsession不是Q?Ok , qmanager更新一下用Lsession信息

5. 交给具体的Context 容器ȝl处理Request.

6. Context处理完毕了,?/span>classloaderq回来?/span>

3.3 StandardContext 的pipline里面攄是: StandardContextValve

1.   验证传递过来的request是不?/span>httpservletRequest.

2.   如果request意图不轨Q想要访?/span>/meta-inf, /web-infq些目录下的东西Q呵呵,没有用D!

3.   q个时候就会根?/span>Request到底?/span>ServletQ?/span>q是jspQ?/span>q是静态资源来军_到底用哪U?/span>Wrapper来处理这?/span>Reqeust了?/span>

4.   一旦决定了到底用哪U?/span>WrapperQ?/span>OKQ交l那?/span>Wrapper处理?/span>

4. 末期?不同的需求是怎么处理?

StandardWrapper

之前对Wrapper没有做过讲解Q其实它是这样一U东ѝ?/span>

我们在处理Request的时候,可以分成3U?/span>

处理静态的Q?org.apache.catalina.servlets.DefaultServlet  

处理jsp的:org.apache.jasper.servlet.JspServlet

处理servlet的:org.apache.catalina.servlets.InvokerServlet

不同的requestqq?U不同的servletd理?/span>

Wrapper是对它们的一U简单的装Q有了Wrapper后,我们可以轻村֜拦截每次的Request。也可以Ҏ(gu)地调用servlet的init()和destroy()Ҏ(gu)Q?便于理嘛!

具体情况是这么滴Q?/span>

   如果request是找jsp文gQStandardWrapper里面׃装一个org.apache.jasper.servlet.JspServletd理它?/span>

   如果request是找 静态资?QStandardWrapper里面׃装一个org.apache.jasper.servlet.DefaultServlet d理它?/span>

   如果request是找servlet QStandardWrapper里面׃装一个org.apache.jasper.servlet.InvokerServlet d理它?/span>

StandardWrapper同样也是容器Q既然是容器Q?那么里面一定留了一个管道给requestȝQ管道低部肯定也有一个阀??)Q用来做最后一道拦截工?

在这最底部的阀门里Q其实就主要做了两g?

   一是启动过滤器Q让request在N个过滤器里面{一通,如果OKQ?那就PASS?否则p到其他地方去了?/span>

   二是servlet.service((HttpServletRequest) request,(HttpServletResponse) response); q个Ҏ(gu).

     如果?JspServletQ?那么先把jsp文g~译成servlet_xxx, 再invoke servlet_xxx的servie()Ҏ(gu)?/span>

     如果?DefaultServletQ?q接找到静态资源,取出内容Q?发送出厅R?/span>

     如果?InvokerServletQ?p用那个具体的servlet的service()Ҏ(gu)?/span>

   ok! 完毕?/span>

?: StandardWrapper 里面的阀门是最后一道关口了?如果q个阀门欲意把request交给StandardWrapper 的子容器处理?对不P 在设计考虑的时候, Wrapperp考虑成最末的一个容器, 压根儿就不会lWrapperd子容器的ZQ? 如果是要调用addChild(), 立马抛出IllegalArgumentExceptionQ?/span>

参考:

     <http://jakarta.apache.org/tomcat/>
   <
http://www.onjava.com/pub/a/onjava/2003/05/14/java_webserver.html>

 




苏醄 2007-09-08 16:38 发表评论
]]>
Tomcat的源码分?/title><link>http://www.tkk7.com/sutao/articles/143617.html</link><dc:creator>苏醄</dc:creator><author>苏醄</author><pubDate>Sat, 08 Sep 2007 08:08:00 GMT</pubDate><guid>http://www.tkk7.com/sutao/articles/143617.html</guid><wfw:comment>http://www.tkk7.com/sutao/comments/143617.html</wfw:comment><comments>http://www.tkk7.com/sutao/articles/143617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/sutao/comments/commentRss/143617.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/sutao/services/trackbacks/143617.html</trackback:ping><description><![CDATA[<table style="width: 100%;" border="0" cellpadding="0" cellspacing="0" width="100%"> <tbody> <tr> <td style="padding: 0cm;"> <br /> </td> </tr> </tbody> </table> <p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">?span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span>中得到更多-<span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span>的源?span style="background: #99ff99 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">分析</span></span></strong></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 13.5pt; font-family: 宋体;">赉|?/span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><<a href="mailto:zhaochenxi@vip.sina.com">zhaochenxi@vip.sina.com</a>></span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">本文的作者通过?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">TomCat</span></strong>源代码的研究Q向读者描qC?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">tomcat</span></strong>3.3?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">TomCat</span></strong>4.0中在设计斚w使用的不同设计理念和模式Q希望对q大开发者在设计自己的系l时有所帮助?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">关于<span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span>的基本情?/span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">众所周知<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>是一个免费的开放源码的Serlvet容器Q它是Apache基金会的Jakarta目中的一个核心项目,也是sun公司官方推荐的servlet和jsp容器Q同时它q获得过多种荣誉。servlet和jsp的最新规范都可以?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">tomcat</span></strong>的新版本中得到实现?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>h轻量U和灉|嵌入到应用系l中的优点,所以得Cq泛的应用。在<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>的发展中QSun?999q六月宣布参与Jakarta目?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong> servlet容器和Jsp引擎的开发,使得<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>?.x?.x版之间系l设计上发生了比较大的变化?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>的其他信息我׃多说了。有兴趣的朋友可以访问http://jakarta.apache.org/ 的官方网站得到更多的信息?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">因ؓ工作的原因,我改写了<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>的一些代码,所以我_略的研I了一?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0的源码,深深地被q个开放Y件的设计和实现吸引,感觉到这个Y件中有许多值得我们学习和借鉴的地斏V我把自q理解介绍l大家算是抛砖引玉,不和偏差还望大家批评指正。下面就来让我们看看? <strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>那里我们可以得到什么?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">?span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span>中学习设计模?/span></strong></p> <p style="text-align: left;" align="left"><strong><span style="background: #ffff66 none repeat scroll 0% 50%; font-size: 12pt; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong><span style="font-size: 12pt; font-family: 宋体;">的设计和实现处处体现着设计模式的思想Q它的基本流E是首先通过解析xml格式的配|文Ӟ获得pȝ的配|和应用信息Q然后加载定制的lg模块提供各种pȝ服务。系l的各部分功能都是通过可以配置的组件模块来实现的?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>实现中像ObserverQFacadeQAdapterQ?Singleton{多U设计模型在<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>的源码中随处可见Qؓ我们提供了一个很好的学习设计模式的^台。我主要介绍一?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>中程序流E控制所采用的设计模式,q是一个程序运行的框架。前面提到由于Sun公司的参与,<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>虽然基本的流E没有变化,但是<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3?<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0版本之间在概念上q是有很大地不同的?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3整体上是模块化的设计Q?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0可以看作是采用面向组件技术进行设计的。组件是比模块更高的一个层ơ。我们可以通过比较它们之间的不同来了解实现一个服务器软g可以采用的设计模式和实现方式?/span></p> <p style="text-align: left;" align="left"><strong><span style="background: #ffff66 none repeat scroll 0% 50%; font-size: 13.5pt; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体;">3.3</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体;">的基?span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span>设计</span></strong></p> <p style="text-align: left;" align="left"><strong><span style="background: #ffff66 none repeat scroll 0% 50%; font-size: 12pt; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong><span style="font-size: 12pt; font-family: 宋体;">3.3</span><span style="font-size: 12pt; font-family: 宋体;">采用的是一U模块化的链状的控制<strong><span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span></strong>Q它的主要设计模式有Q?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">Chain of responsibility</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">Q责任链Q?/span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">作ؓ一个基于请求响应模式的服务器,?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3中采用一U链状处理的控制模式。请求在链上的各个环节上传递,在Q一环节上可以存在若q个"监听?处理它。这样做的目的是避免h的发送者和接受者之间的直接耦合Q从而可以ؓ其他的对象提供了参与处理h的机会。采用这个方式不但可以通过"监听?"实现pȝ功能Q而且可以通过d新的"监听?对象实现pȝ功能的扩展?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">Interceptor</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">Q监听器Q?/span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">"</span><span style="font-size: 12pt; font-family: 宋体;">监听?是一个过M用的名称Q它可以看作 "模块(module)"的同义词。它?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>功能模块构徏和扩展的方式?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3的大部分功能都是通过"监听?实现的。在 <strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>中提供了一U简单的钩子QHookQ机Ӟ监听器对钩子中感兴趣的事件进行注册,事g发生后通过钩子唤醒已注册的"监听?对象Q?监听? 对象?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>内核事gq行处理。这些模块都是围l着"责Q??{略"的模式进行设计。通过"监听?你可以监听各U特D事Ӟq而控制处理请求的各个步骤---解析Q认证,授权Q会话,响应提交Q缓冲区提交{等?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">Strategy</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">Q策略)</span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">所谓策略是?定义一l规则,按照规则q行对象装Q得他们只在规则内部进行交?。通过{略模式使得<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>作ؓ一个开源项目在开攄境下的开发和演变变得更轻松。通过q种模式把复杂的法分成模块然后不同的开发组提供各自的实现。从而实现调用模块的代码和模块的具体实现代码的分别开发。这样可以我们专注于问题的重点Qƈ且减问题之间的依赖性。在<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>中大量采用了{略的设计模式,通过q种方式每一U服务都提供了多U的实现Q例?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>中有2Q?U认证模块)Q在代码完成后可以从E_性和性能表现的考虑选择更好的实现。策略模式对开攑ּ环境下的软g开发非常有用?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">我们通过化的cd(见图一)和时序图(见图?Q描qC?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3的程序流E控制如何通过监听器和责Q铑֮现?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">?1.?化的cd</span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><!--[if gte vml 1]> <![endif]--></span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">关于cd的简单说明:</span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">BaseInterceptor</span><span style="font-size: 12pt; font-family: 宋体;">Q?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">是所有监听器的基c,描述了基本的模块功能和对各种事g的缺省处理?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">ContextManage</span><span style="font-size: 12pt; font-family: 宋体;">Q?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">pȝ的核心控制对象,q行h处理和系l配|。它l护了全局的属性、web应用的内容和全局模块{多U信息,责Q铄钩子实现也在其中?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">PoolTcpConnector</span><span style="font-size: 12pt; font-family: 宋体;">Q?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">一个处理TCPq接的连接器对象Q从BaseInterceporz。它包括一个具体处理socketq接的PoolTcpEndPointcd象?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">PoolTcpEndPoint</span><span style="font-size: 12pt; font-family: 宋体;">Q?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">处理实际的tcpq接。它有一个连接池对象ThreadPool和运行在独立U程中的应用逻辑cTcpWorkThread?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">TcpWorkThead</span><span style="font-size: 12pt; font-family: 宋体;">Q?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">处理socketq接事务Q调用接口TcpConnectionHandler中的h处理Ҏ(gu)?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Http10Interceptor</span><span style="font-size: 12pt; font-family: 宋体;">Q?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">从PoolTcpConnectorzQ实CTcpConnectionHandler接口Q是一个真正的监听器对象。它按照Http1.0的协议标准对tcpq接q行处理Q调用核心对象ContextManage的服务方法?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">?2.?化的时序?/span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><!--[if gte vml 1]> <![endif]--></span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">关于时序图中需要说明的地方Q?/span></p> <ol start="1" type="1"> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">在contextManager初始化后会根据配|信息,加蝲基本的应用模块和各种监听器对象,创徏钩子QHookQ机Ӟ注册监听器对象,形成一个责任链。然后对各个监听器对象发出engineInitQengineStart消息?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">一个请求在l过http10interceptor基本处理后提交到contextManager处理?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">ContextManager</span><span style="font-size: 12pt; font-family: 宋体;">的processRequestҎ(gu)q行h的处理。按照处理的步骤会顺序地发出H_postReadRequestQ?H_contextMapQ?H_requestMap{消息。然后从hook中取得对该消息注册的监听器对象,调用他们的处理方法,从而实现责任链方式。以下的代码片断说明了这U方式:</span></li> </ol> <p style="margin-left: 36pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>4.<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">           </span></span></span><span style="font-size: 12pt; font-family: 宋体;">BaseInterceptor ri[];</span></p> <p style="margin-left: 36pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>5.<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">           </span></span></span><span style="font-size: 12pt; font-family: 宋体;">//</span><span style="font-size: 12pt; font-family: 宋体;">取得注册对象</span></p> <p style="margin-left: 36pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>6.<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">           </span></span></span><span style="font-size: 12pt; font-family: 宋体;">ri=defaultContainer.getInterceptors(Container.H_postReadRequest);</span></p> <p style="margin-left: 36pt; text-align: left; text-indent: -18pt;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><span>7.<span style="font-family: "Times New Roman"; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">           </span></span></span><span style="font-size: 12pt; font-family: 宋体;">//</span><span style="font-size: 12pt; font-family: 宋体;">执行注册对象的对消息的处理方?/span></p> <p style="margin-left: 36pt; text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">for( int i=0; i< ri.length; i++ ) { status=ri[i].postReadRequest( req );      ......}</span></p> <ol start="8" type="1"> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">pȝ退出时contextManager发出engineStop消息?/span></li> </ol> <p style="text-align: left;" align="left"><strong><span style="background: #ffff66 none repeat scroll 0% 50%; font-size: 12pt; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong><span style="font-size: 12pt; font-family: 宋体;">3.3</span><span style="font-size: 12pt; font-family: 宋体;">的基本程?strong><span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span></strong>是采用上面介绍的方式设计的。它l我们的设计和开发提供了一个很好的思\Q通过q种模式可以L的实C个事仉动的Z模块化设计的应用E序。各个功能通过模块实现Q通过对责任链上的消息和处理步骤的改动或者添加新的监听器对象可以非常方便的扩?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>的功能。所以这是一个非常好的设计?/span></p> <p style="text-align: left;" align="left"><strong><span style="background: #ffff66 none repeat scroll 0% 50%; font-size: 13.5pt; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体;">4.0</span></strong><strong><span style="font-size: 13.5pt; font-family: 宋体;">的基?span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span>设计</span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">虽然<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.x已经实现了一个非常好的设计体p,但是在Sun公司加入后, <strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中还是引入了不同的实现方式。主要的区别?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0采用了面向组件的设计方式Q?<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中的功能是由lg提供的,控制程通过lg之间的通讯完成。这不同?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3中的Z模块的链式控?strong><span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span></strong>?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">?向组件的技?CO)是比面向对象的技?OOP)更高一层的抽象Q它融合了面向对象的优点Q加入了安全性和可扩展的模块设计Q可以更好的映射问题域空 间。采用面向组件的设计会带来很多好处,可以提高复用性、降低耦合度和通过l装构成pȝ{等。面向组件编E中有许多概念与原来面向对象的编E是不同的,?如:</span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Message(</span><span style="font-size: 12pt; font-family: 宋体;">消息)Q定义抽象操作;<span> Method(</span>Ҏ(gu))Q定义具体的操作Q?Interface(接口)Q一l消息的集合Q?Implementation(实现)Q一l方法的集合Q?Module(模块)Q静态的数据<strong><span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span></strong>, Type(cd)Q动态的数据<strong><span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span></strong>?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">软glg不同与功能模块,它具有以下特性:</span></p> <ul type="disc"> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">lg是一个自包容的模块,h定义清楚的界U,对外提供它的能力、属性和事g?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">lg自n不保留状态?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">lg可以是一个类Q大部分情况下是一l类?/span></li> </ul> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">?span>Java </span>语言中对面向lg~程的支持是通过JavaBeans模型获得的。JavaBeanlg框架提供了对事g和属性的支持?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0的组件的是通过JavaBean技术实现的。这是它?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3中最大的不同。下面我们来看一?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0是如何通过面向lg~程来实现程序流E控制的?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">面向lg~程时设计组件是关键Q从<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中可以看Z要用了以下的设计模式:</span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">Separation of Concerns</span></strong><strong><span style="font-size: 12pt; font-family: 宋体;">QSOCQ?/span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">设计lg时应该从不同的问题领域,站在不同的观点上<strong><span style="background: #99ff99 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">分析</span></strong>Q把每一U属性分别考虑。D一个例子FileLoggerlgQ它用于把系l日志信息保存到文gpȝ中。按照这U模?strong><span style="background: #99ff99 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">分析</span></strong>Q我们从不同的角度看待它Q它如何启动服务、停止服务和q行通讯Q它的具体的功能有哪些?别的lg可以发给它哪些消息?Zq些考虑QFileLoggerlg应该实现两种接口QLifecycleQ生存期接口Q和LoggerBaseQ功能接口)?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Inversion of Control</span><span style="font-size: 12pt; font-family: 宋体;">QIOCQ这个模式定义的是,lgL通过外部q行理的。组仉要的信息L来源于外部,实际上组件在生存期的各个阶段都是被创建它的组件管理的。在<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中就是通过q种lg之间的相互控制和调用实现各个功能的?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">按照q些模式<strong><span style="background: #99ff99 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">分析</span></strong>得到?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中的lg是既有共性又有特性。共性是Lifecycle接口Q特性是不同的功能接口。其中生存期接口处理lg的整个生存期中的各个阶段的事?功能接口提供l其他的lg使用?/span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">具体的功能如何实现我在这里不多介l了Q我主要介绍一?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中组件的Lifecycle接口的设计。Lifecycle接口实现了组件的生存期管理,控制理和通讯。创Z个Y件组件和创徏一个JavaBean对象一P可以参考JavaBeanq行理解。我通过一个模拟的 Lifecycle接口lg的类图来描述?见图?</span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 12pt; font-family: 宋体;">?3.?Lifecycle接口lgcd</span></strong></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;"><!--[if gte vml 1]> <![endif]--></span></p> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">Ҏ(gu)拟的Lifecycle接口lg的类囄说明</span></p> <ol start="1" type="1"> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">Lifecycle Interface(</span><span style="font-size: 12pt; font-family: 宋体;">接口)定义一l组仉讯的Message(消息)?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">lg实现Lifecycle接口Q组件内部定义一个LifecycleSupport对象。需要和该组仉讯的其他组件必d现LifecycleListener接口Q该lg通过add/removeLifecycleListenerҎ(gu)理需要通讯的其他组件?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">lg内部状态改变时如果需要和其他lg通讯Ӟ通过LifecycleSupport对象的fireLifecycleEventҎ(gu)通知其他lg?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">其他lg通过lifecycleEventҎ(gu)获得通知的消息。LifecycleEvent对象是从java.util.EventObjectz的?/span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">当然在组件设计和实现中我们也可以直接使用JavaBeans中已l提供的的类如:java.beans.PropertyChangeListenerQjava.beans.PropertyChangeSupportq样可以获得更多的功能特性支持?/span></li> </ol> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">通过上面?strong><span style="background: #99ff99 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">分析</span></strong>我们可以看到lg成ؓ<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0中的核心概念Q系l的功能都是通过lg实现的,lg之间的通讯构成了系l的q行控制机制。我们把 <strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3中模块化的链状控制机制和<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0的面向组件的设计q行比较Q就会发?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0在设计思想上Y件组件的概念非常明确?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>4.0?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>3.3最主要的区别就在于此。至于面向对象和面向lg的关pd区别Q我在这里就不介l了Q有兴趣的朋友可以找到很多这斚w的资源?/span></p> <p style="text-align: left;" align="left"><strong><span style="font-size: 18pt; font-family: 宋体;">?span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span>源码中得到高效的软glg</span></strong></p> <p style="text-align: left;" align="left"><strong><span style="background: #ffff66 none repeat scroll 0% 50%; font-size: 12pt; font-family: 宋体; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong><span style="font-size: 12pt; font-family: 宋体;">不但为我们提供了设计和实现系l时的新思\Q同时因为它是由lg或者模块构成的Q所以它qؓ我们提供了大量可用的高效软glg。这些组仉可以在我们的E序开发中使用。我单列举一些,需要时可以直接从源码中取得?/span></p> <ul type="disc"> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">一些特D集合类数据<strong><span style="background: #a0ffff none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">l构</span></strong>如池、队列、缓存等可用于服务端开发?"src"share"org"apache"<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">tomcat</span></strong>"util"collections</span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">一个简单的钩子QHooksQ机制的实现?src"share"org"apache"<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">tomcat</span></strong>"util"hooks</span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">一个简单线E池QThreadPoolQ的实现?src"share"org"apache"<strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">tomcat</span></strong>"util"threads</span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">lgLifecycle接口的设计和实现?"src"catalina"src"share"org"apache"Catalina</span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">常用的日志信息的理QLoggerQ的实现?src"catalina"src"share"org"apache"catalina"logger</span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">对xml格式的配|信息进行处理(XmlMapperQ的实现?span> src"catalina"src"share"org"apache"catalina"util"xml</span></span></li> <li style="text-align: left;"><span style="font-size: 12pt; font-family: 宋体;">对socket通讯的高U管理和实现QnetQ?span> "src"catalina"src"share"org"apache"catalina"net</span></span></li> </ul> <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">通过以上?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>的简单的介绍Q我们可以看出,作ؓ一个开放源码的目Q?strong><span style="background: #ffff66 none repeat scroll 0% 50%; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Tomcat</span></strong>不但为我们提供了一个应用的q_Q同时它qؓ我们提供了一个学习和研究设计模式、面向组件技术等理论的实践^台?/span></p> <img src ="http://www.tkk7.com/sutao/aggbug/143617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/sutao/" target="_blank">苏醄</a> 2007-09-08 16:08 <a href="http://www.tkk7.com/sutao/articles/143617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://shadaiym.com" target="_blank">ĻۺϾþ2</a>| <a href="http://chch12.com" target="_blank">˾ҹƵ</a>| <a href="http://minliusoft.com" target="_blank">һͼƬ</a>| <a href="http://www321fafa.com" target="_blank">ˬִ̼һ߳</a>| <a href="http://770144.com" target="_blank">պƷһ</a>| <a href="http://se969.com" target="_blank">ƷŮٸaѾþ</a>| <a href="http://zj1069.com" target="_blank">˾þۺӰԺ</a>| <a href="http://51porn3.com" target="_blank">avɫ㽶һ</a>| <a href="http://qmoread.com" target="_blank">ŷպƵ</a>| <a href="http://tvnxl.com" target="_blank">Ƭѹۿȫ</a>| <a href="http://wwwyy763.com" target="_blank">һ</a>| <a href="http://aijiu868.com" target="_blank">˳߲VA</a>| <a href="http://988938.com" target="_blank">ɫAV</a>| <a href="http://fphs666.com" target="_blank">պƵ</a>| <a href="http://lfhotline.com" target="_blank">˳վɫ </a>| <a href="http://yule4.com" target="_blank">޹Ʒר</a>| <a href="http://wwwy66y6.com" target="_blank">avƬ쿴</a>| <a href="http://wangquanai.com" target="_blank">޹¶</a>| <a href="http://zbhongtai.com" target="_blank">99ƵѲ</a>| <a href="http://www9k832.com" target="_blank">Ӱ</a>| <a href="http://ww99w.com" target="_blank">һaƵ</a>| <a href="http://266my.com" target="_blank">һëƬ</a>| <a href="http://www-715111.com" target="_blank">AVպAVþ</a>| <a href="http://lcqkp.com" target="_blank">һëƬڲ</a>| <a href="http://sese3366.com" target="_blank">žžۺAVһ</a>| <a href="http://laosanqq.com" target="_blank">91Ƶ</a>| <a href="http://selangcun.com" target="_blank">av볱߹ۿ</a>| <a href="http://sy8989.com" target="_blank">ŮëƬ߿˶</a>| <a href="http://holdengong.com" target="_blank">avרۿƷ</a>| <a href="http://ti166.com" target="_blank">պѹۿƵ</a>| <a href="http://adcadm.com" target="_blank">AV߹ۿ</a>| <a href="http://my77789.com" target="_blank">Ļ</a>| <a href="http://3333kkkk.com" target="_blank">޾߹ۿ</a>| <a href="http://yese889.com" target="_blank">ާѡþþþƷ</a>| <a href="http://nit8.com" target="_blank">ѹվ߹ۿ</a>| <a href="http://zzxngk.com" target="_blank">AVһַ</a>| <a href="http://xp189.com" target="_blank">JIZZձ</a>| <a href="http://pengkaimjg.com" target="_blank">ѹۿAVƬ߲</a>| <a href="http://www876444.com" target="_blank">һ˿Ƶ</a>| <a href="http://ylptt.com" target="_blank">޹ƷŮ</a>| <a href="http://zzttt04.com" target="_blank">Ƶһ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>