注册 留言板
当前位置:首页 > 中间件技术 > Tomcat > 正文

【Tomcat9源码分析】组件与框架概述

来源:CSDN   发布时间: 2017-06-18   作者:linxdcn   浏览次数:
摘要: 转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73321304 1 组件与框架介绍 Server:代表整个Catalina Servl...

转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73321304


1 组件与框架介绍


【Tomcat9源码分析】组件与框架概述

Server:代表整个Catalina Servlet容器,可以包含一个或多个Service

Service:包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理

Connector:实现某一协议的连接器,用来处理客户端发送来的协议,如默认的实现协议有HTTP、HTTPS、AJP

Engine:接到来自不同Connector请求,处理后将结果返回给Connector。Engine是一个逻辑容器

Host:虚拟主机,即域名或网络名,一个Engine可以包含多个Host。

Context:部署的具体Web应用的上下文,每个请求都在是相应的上下文里处理,如一个war包

Wrapper:对应定义的Servlet

由上可知,Catalina中有两个主要的模块:连接器(Connector)和容器(Container)


2 组件功能

2.1 Server

Server为定义的接口,默认实现是StandardServer,主要作用有

  • 定义了 Servlet 容器的相关配置,即server.xml中的配置
  • 启动Server将启动所有的Tomcat组件,关闭Server将关闭所有组件

Server接口中重要的方法如下:

public interface Server extends Lifecycle {

    public int getPort();

    public void setPort(int port);

    public String getAddress();

    public void setAddress(String address);

    public String getShutdown();

    public void setShutdown(String shutdown);

    public void addService(Service service);

    public Service findService(String name);

    public Service[] findServices();

    public void removeService(Service service);
}

2.2 Service

Service为定义的接口,默认实现是StandardService,主要作用有

  • 逻辑上包含Connector和Container

Service接口中重要的方法如下:

public interface Service extends Lifecycle {

    public Engine getContainer();

    public void setContainer(Engine engine);

    public String getName();

    public void setName(String name);

    public Server getServer();

    public void setServer(Server server);

    public void addConnector(Connector connector);

    public Connector[] findConnectors();

    public void removeConnector(Connector connector);
}

2.3 Connector

Connector为定义的连接器类,默认实现的协议有http、https、AJP,主要作用有

  • 根据不同的协议解析客户端的请求
  • 将解析完的请求转发给Connector关联的Engine容器处理

Connector默认支持的协议如下:

/** * Defaults to using HTTP/1.1 NIO implementation. */
public Connector() {
    this("org.apache.coyote.http11.Http11NioProtocol");
}


public Connector(String protocol) {
    boolean aprConnector = AprLifecycleListener.isAprAvailable() &&
            AprLifecycleListener.getUseAprConnector();

    if ("HTTP/1.1".equals(protocol) || protocol == null) {
        if (aprConnector) {
            protocolHandlerClassName = "org.apache.coyote.http11.Http11AprProtocol";
        } else {
            protocolHandlerClassName = "org.apache.coyote.http11.Http11NioProtocol";
        }
    } else if ("AJP/1.3".equals(protocol)) {
        if (aprConnector) {
            protocolHandlerClassName = "org.apache.coyote.ajp.AjpAprProtocol";
        } else {
            protocolHandlerClassName = "org.apache.coyote.ajp.AjpNioProtocol";
        }
    } else {
        protocolHandlerClassName = protocol;
    }

    // Instantiate protocol handler
    ProtocolHandler p = null;
    try {
        Class<?> clazz = Class.forName(protocolHandlerClassName);
        p = (ProtocolHandler) clazz.getConstructor().newInstance();
    } catch (Exception e) {
        log.error(sm.getString(
                "coyoteConnector.protocolHandlerInstantiationFailed"), e);
    } finally {
        this.protocolHandler = p;
    }
}

2.4 Engine


【Tomcat9源码分析】组件与框架概述

Engine为定义的接口,默认实现是StandardEngine,主要有以下模块:

  • Cluster:实现tomcat管理
  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式。只是简单的将Connector传过来的变量传给Host容器

2.5 Host


【Tomcat9源码分析】组件与框架概述

Host为定义的接口,默认实现是StandardHost,主要有以下模块:

  • Cluster:实现tomcat管理
  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式

2.6 Context


【Tomcat9源码分析】组件与框架概述

Context为定义的接口,默认实现是StandardContext,主要有以下模块:

  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式
  • Manager: 它主要是应用的session管理模块
  • Resources: 它是每个web app对应的部署结构的封装
  • Loader:它是对每个web app的自有的classloader的封装
  • Mapper:它封装了请求资源URI与每个相对应的处理wrapper容器的映射关系

2.7 Wrapper


【Tomcat9源码分析】组件与框架概述

Wrapper为定义的接口,默认实现是StandardWrapper,主要有以下模块:

  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式
  • Servlet和Servlet Stack:保存Wrapper包装的Servlet

转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73321304



tomcat 源码 框架
我来说两句
评论内容:
验  证  码:
 
(网友评论仅供其表达个人看法,并不表明本站同意其观点或证实其描述。)
评论列表
已有 0 条评论(查看更多评论)
精彩专题
友情链接:
QQ交流群:①群 155252576 ②群 469193068 ③群 531831996 ④群 243504572
设为首页 - 加入收藏 Copyright @2016 Infocool 版权所有 粤ICP备16000626号