Tomcat系统架构分析

1.1. Wrapper 容器

Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。Wrapper 是最底层的容器,它没有子容器了,所以调用它的 addChild 将会报错。

Wrapper 的实现类是 StandardWrapper,StandardWrapper 还实现了拥有一个 Servlet 初始化信息的 ServletConfig,由此看出 StandardWrapper 将直接和 Servlet 的各种信息打交道。

下面看一下非常重要的一个方法 loadServlet,代码片段如下:

1). StandardWrapper.loadServlet

public synchronized Servlet loadServlet() throws ServletException {

    ………

    Servlet servlet;

    try {

        ………

        ClassLoader classLoader = loader.getClassLoader();

        ………

        Class classClass = null;

        ………

        servlet = (Servlet) classClass.newInstance();

        if ((servlet instanceof ContainerServlet) &&

            (isContainerProvidedServlet(actualClass) ||

            ((Context)getParent()).getPrivileged() )) {

                ((ContainerServlet) servlet).setWrapper(this);

        }

        classLoadTime=(int) (System.currentTimeMillis() -t1);

        try {

            instanceSupport.fireInstanceEvent(InstanceEvent.BEFORE_INIT_EVENT,servlet);

            if( System.getSecurityManager() != null) {

                Class[] classType = new Class[]{ServletConfig.class};

                Object[] args = new Object[]{((ServletConfig)facade)};

                SecurityUtil.doAsPrivilege(“init”,servlet,classType,args);

            } else {

                servlet.init(facade);

            }

            if ((loadOnStartup >= 0) && (jspFile != null)) {

                ………

                if( System.getSecurityManager() != null) {

                    Class[] classType = new Class[]{ServletRequest.class,

                        ServletResponse.class};

                    Object[] args = new Object[]{req, res};

                    SecurityUtil.doAsPrivilege(“service”,servlet,classType,args);

                } else {

                    servlet.service(req, res);

                }

            }

            instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,servlet);

            ………

 

return servlet;

}

它基本上描述了对 Servlet 的操作,当装载了 Servlet 后就会调用 Servlet 的 init 方法,同时会传一个 StandardWrapperFacade 对象给 Servlet,这个对象包装了 StandardWrapper,ServletConfig 与它们的关系图如下:

2). ServletConf与 StandardWrapperFacade、StandardWrapper 的关系

Tomcat系统架构分析

Servlet 可以获得的信息都在 StandardWrapperFacade 封装,这些信息又是在 StandardWrapper 对象中拿到的。所以 Servlet 可以通过 ServletConfig 拿到有限的容器的信息。

当 Servlet 被初始化完成后,就等着 StandardWrapperValve 去调用它的 service 方法了,调用 service 方法之前要调用 Servlet 所有的 filter。

1. Tomcat 中其它组件

Tomcat 还有其它重要的组件,如安全组件 security、logger 日志组件、session、mbeans、naming 等其它组件。这些组件共同为 Connector 和 Container 提供必要的服务。

原文链接:http://www.atguigu.com/jsfx/1539.html

上一篇:Servlet分析


下一篇:JavaWeb(五)Servlet