设为首页 收藏本站
查看: 376|回复: 0

[经验分享] How Tomcat Work——连接器

[复制链接]

尚未签到

发表于 2017-1-23 08:58:02 | 显示全部楼层 |阅读模式
概要  
    在介绍中提到,Catalina 中有两个主要的模块:连接器和容器。本章中你将会写一个可以创建更好的请求和响应对象的连接器,用来改进第2章中的程序。一个符合Servlet 2.3和2.4规 范 的 连 接 器 必 须 创 建javax.servlet.http.HttpServletRequest 和javax.servlet.http.HttpServletResponse,并传递给被调用的servlet的service方法。在第2 章 中,servlet 容器只可以运行实现了 javax.servlet.Servlet 的 servlet,并传递 javax.servlet.ServletRequest 和 javax.servlet.ServletResponse 实例给 service 方法。因为连接器并不知道 servlet 的类型(例如它是否实现了 javax.servlet.Servlet,继承了javax.servlet.GenericServlet,或者继承了javax.servlet.http.HttpServlet),所以连接器必须始终提供HttpServletRequest和HttpServletResponse的实例。
    在本章的应用程序中,连接器解析HTTP请求头部并让servlet可以获得头部, cookies, 参数名/值等等。你将会完善第2章中Response类的getWriter方法,让它能够正确运行。由于这些改进,你将会从 PrimitiveServlet 中获取一个完整的响应,并能够运行更加复杂的ModernServlet。
    本章你建立的连接器是将在第 4 章详细讨论的 Tomcat4 的默认连接器的一个简化版本。Tomcat的默认连接器在Tomcat4中是不推荐使用的,但它仍然可以作为一个非常棒的学习工具。在这章的剩余部分,"connector"指的是内置在我们应用程序的模块。
    注意:和上一章的应用程序不同的是,本章的应用程序中,连接器和容器是分离的。
    在我们解释该应用程序之前,让我们先来说说包 org.apache.catalina.util 里边的StringManager类。这个类用来处理这个程序中不同模块和Catalina自身的错误信息的国际化。
StringManager 类  
    一个像Tomcat这样的大型应用需要仔细的处理错误信息。在Tomcat中,错误信息对于系统管理员和servlet程序员都是有用的。例 如,Tomcat记录错误信息,让系统管理员可以定位发生的任何异常。对 servlet 程 序 员 来 说 , Tomcat 会在抛出的任何一个
javax.servlet.ServletException 中发送一个错误信息,这样程序员可以知道他/她的 servlet究竟发送什么错误了。
    Tomcat 所采用的方法是在一个属性文件里边存储错误信息,这样,可以容易的修改这些信息。不过,Tomcat中有数以百计的类。把所有类使用的错误信 息存储到一个大的属性文件里边将会容易产生维护的噩梦。为了避免这一情况,Tomcat 为每个包都分配一个属性文件。例如,在包 org.apache.catalina.connector 里边的属性文件包含了该包所有的类抛出的所有错误信息。每个属性文件都会被一个 org.apache.catalina.util.StringManager类的实例所处理。当Tomcat 运行时,将会有许多 StringManager实例,每个实例会读取包对应的一个属性文件。此外,由于 Tomcat的受欢迎程度,提供多种语言的错误信息也是有意义的。目前,有三种语言是被支持的。英语的错误信息属性文件名为LocalStrings.properties。另外两个是西班牙语和日语,分别放在 LocalStrings_es.propertiesLocalStrings_ja.properties里边。
    当包里边的一个类需要查找放在该包属性文件的一个错误信息时,它首先会获得一个
StringManager实例。不过,相同包里边的许多类可能也需要 StringManager,为每个对象创建一个StringManager实例是一种资源浪费。因此, StringManager类被设计成一个StringManager实例可以被包里边的所有类共享。假如你熟悉设计模式,你将会正确的猜到 StringManager是一个单例 (singleton)类。仅有的一个构造方法是私有的,所有你不能在类的外部使用new关键字来实例化。你通过传递一个包名来调用它的公共静态方法 getManager来获得一个实例。每个实例存储在一个以包名为键(key)的Hashtable中。
应用程序
    从本章开始,每章附带的应用程序都会分成模块。这章的应用程序由三个模块组成:
connector, startup和core。
    startup模块只有一个类, Bootstrap,用来启动应用的。 connector模块的类可以分为五组:
  连接器和它的支撑类(HttpConnector和HttpProcessor)。  
  指代HTTP请求的类(HttpRequest)和它的辅助类。  
  指代HTTP响应的类(HttpResponse)和它的辅助类。
  Facade类(HttpRequestFacade和HttpResponseFacade)。  
  Constant类   

    Tomcat的默认连接器和我们的连接器使用SocketInputStream类来从套接字的InputStream中读取字节流。一个 SocketInputStream 实例对从套接字的 getInputStream 方法中返回的java.io.InputStream 实例进行包装。  SocketInputStream 类提供了两个重要的方法:
readRequestLine 和 readHeader。readRequestLine 返回一个 HTTP 请求的第一行。例如,这行包括了 URI,方法和 HTTP 版本。因为从套接字的输入流中处理字节流意味着只读取一次,从第一个字节到最后一个字节(并且不回退),因此 readHeader 被调用之前,readRequestLine 必须只被调用一次。readHeader每次被调用来获得一个头部的名/值对,并且应该被重复的调用知道所有的头部被读取到。readRequestLine 的返回值是一个 HttpRequestLine 的实例,而readHeader 的返回值是一个 HttpHeader 对象。  

  我们将会在下面的子节里边详细说明该应用程序:

  启动应用程序  
  连接器  
  创建一个HttpRequest对象  
  创建一个HttpResponse对象  
  静态资源处理器和servlet处理器  
  运行应用程序
启动应用程序  
    Bootstrap 类来启动应用程序         
   Bootstrap类

package ex03.pyrmont.startup;
import ex03.pyrmont.connector.http.HttpConnector;
public final class Bootstrap {
    public static void main(String[] args) {
        HttpConnector connector = new HttpConnector();
        connector.start();
    }
}
    Bootstrap类中的main方法实例化HttpConnector类并调用它的start方法。
连接器  
    ex03.pyrmont.connector.http.HttpConnector类指代一个连接器,职责是创建一个服务器套接字用来等待前来的HTTP请求。这个类在Listing 3.2中出现。
    HttpConnector类实现了java.lang.Runnable,所以它能被它自己的线程专用。当你启动应用程序,一个HttpConnector的实例被创建,并且它的run方法被执行。
    注意: 你可以通过读"Working with Threads"这篇文章来提醒你自己怎样创建Java线程。  
    run方法包括一个while循环,用来做下面的事情:
  等待HTTP请求  
  为每个请求创建个HttpProcessor实例  
  调用HttpProcessor的process方法

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-332281-1-1.html 上篇帖子: tomcat中使用JNDI 下篇帖子: 设置Tomcat为自动启动的服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表