How Tomcat works 第三总结

   首先本文并不是详细的介绍本章的相关知识,更不是详细介绍对应的源码的,而是在自我总结的时候,希望能帮到有同样觉得混乱的朋友,或者希望我介绍的内容有能吸引你的地方,然后你能够主动的去读读这本书,或者能互相讨论学习。我经常去逛逛博客,但却很少(基本没有)分享自己的东西,但愿会有好的开始吧。

        最近想提升一下小技术,感觉学习一下tomcat源码是个不错的选择,不止能学到很多编程规范,还有里面用到的设计模式,HTTP协议,字符串的处理(基于String源码),国际化词条的处理等等,这是平常很难学到的。偶然看到了《How Tomcat Works》这本书,还有中文版,我曾经尝试看过一些其他的英文原著的书,但看着看着,最后英文没学好,书也没看完,还是决定看看中文版的吧(英语没过四级,但一直很努力学习ing,其实在公司也能用英文和客户交流,但觉得看书还是比较费劲)。
        看过前两章,自己跟着敲代码,基本没什么问题。但第三章代码明显增多了,看了两个周六,仍然云里雾里的,我本人也有点懒,周六看书,周日LOL,晚上卸载......... 还有如果对Tomcat体系还不太了解的话,建议去看看这篇文章:  http://www.ibm.com/developerworks/cn/java/j-lo-tomcat1/
        再扯就到蛋了,言归正传,这里我只总结一下第三章的代码以及相关详细介绍,如果你想真正的学习的话,最好配合这本书慢慢看,而且要有耐心看,书上说的我就不重复提了,以下是根据运行顺序来解释每个书上用到的类,其中有些功能其实很简单,但是由于处理字符串方面,Tomcat追求的是速度,所以对于字符串的处理几本都是基于字符数组的处理,因此代码 可读性的难度就大大增加了,但我们也应该多多学习如何在处理字符串时使用字符数组的处理来增加 代码的执行效率(String源码都是根据char/byte数组来处理的)。
        引用自原书的类关系图:

                                                                
          Bootstrap.java ,这个类就几行代码,是为了从main方法中启动Tomcat的,
         HttpConnector.java  , 这是一个多线程类,被Bootstrap.java调用时,启用一个线程来生成 ServerSocket 对象,然后等待 Client 请求,  socket = serverSocket.accept() 就是进入堵塞状态,直到有HTTP请求了,才可以继续往下执行。当Client发出请求,后台获取socket 后会把socket 发送给  HttpProcessor 执行后续处理(生成 Request , Response 等等).
         HttpProcessor.java : 这个类主要有四个方法:processor( Socket ), parseRequest( SocketInputStream),parseHeaders( SocketInputStream ),  normalize( String )。
                 (1)、 processor( Socket ) 方法是被HttpConnector.java 调用的,用来生成 HttpRequest 对象以及 HttpResponse 对象。
                (2)、  parseRequest( SocketInputStream) 方法是通过解析Http请求传过来的三个必须的信息:传递的方法(POST/GET),URI(包含添加在路径后面的参数) 还有 HTTP版本(比如HTTP1.1)。
                (3)、parseHeaders( SocketInputStream ) 方法是通过解析Http请求传过来的除了上面的三个信息之外的其他信息,比如Content-length, Content-Type,Server信息等等。
                (4)、normalize( String ) 方法是用来把URI规范化的,不懂的可以去了解一下 File. getCanonicalPath() 这个方法,原理一样。
        SocketInputStream.java:首先有必要介绍的是这个类中用到了SocketInputStream 这个类,这是Tomcat中定义的一个类,是为了我更好的解析 Http 请求(Socket 中的 InputStream)而定义的,它主要有两个方法: readRequestLine(HttpRequestLine requestLine) 和  readHeader(HttpHeader header) ,从方法名可以看出和上面(2)、(3)提到的方法很像;其实这两个方法就是为他们准备的(这是一个不错的OOP思想,把行为封装到对应的类中,而不是什么都依赖逻辑类来完成)。还有这两个方法的参数是 HttpRequestLine 类型 和 HttpHeader 类型,这也是Tomcat中自定义的比较简单的两个类。
       HttpRequestLine.java :  这个类是用来保存 SocketInputStream.readRequestLine(HttpRequestLine requestLine)方法解析的三个字段(请求方法,URI,HTTP版本)以及一些字符串处理的方法。
       HttpHeader.java : 这个类是用来保存 SocketInputStream.readHeader(HttpHeader header)方法解析出的HTTP请求头的消息,每一条头部信息(Name-Value 对)对应一个HttpHeader对象
    
        请求解析完了,我们是不是要去回复请求了呢? 对啊,这时,我服务器根据请求路劲,查找用户请求对应的资源,本章中只是简单的处理静态资源以及简单的 Servlet ,而且没有根据配置文件来读取Servlet所应该匹配的路径,而是根据URI 中的子路劲如果是以 "/servlet/" 开头(比如 http://localhost:8080 /servlet/myServletName ),则断定是请求Servlet 资源,否则是请求静态资源。
         ServletProcessor.java : 当请求Servlet 资源时,会调用这个类。在这个类中,首先是解析出 Servler Name ,然后根据路劲,以  URLClassLoader 为类加载去加载Servlet类并生成此类的对象。最后调用  servlet.service()方法(这里用到门面模式,把Request和Response 封装到对应的Facade类中,但我觉得有点多余,至少目前看不出多大用处),把Request 对象 和 Response对象传给Servlet处理,然后就是我们的Servlet的事情了。
         StaticResourceProcessor.java : 如果请求是静态资源,比如一个 html 文件, 则调用此类,主要就是查找出对应文件,然后 读取文件,以流的形式写入Response 的 OutputStream 中。

        还有一些工具类介绍一下,比如ManagerString,这个类是用于国际化的,以前我一直迷惑我们项目中是怎么抽取词条的(我们目前的项目就是),读了这个类的源代码之后,我终于明白了 java 项目中是怎么处理 XXXXX.properties 文件了(文件是 Name = Value 的格式)。

                           ------------------------------ 最近有点忙,有时间会继续把本章代码敲完,然后继续学习How Tomcat Works。。。。。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值