1. 程式人生 > >Tomcat學習筆記(四)

Tomcat學習筆記(四)

客服 list illegal state oid () ons mov tom

Servlet容器部分

servlet容器用來處理請求servlet資源,並為web客服端填充response對象模塊,在tomcat中,共有4種類型的容器,分別是:Engine、Host、Contex和Wrapper。
4種類型的容器,分別對應不同的層次:
Engine:表示整個Catalina servlet引擎
Host:表示包含有一個或者多個Context容器的虛擬機
Context:表示一個Web應用程序。一個Context可以多個Wrapper。
Wrapper:表示獨立的servlet。
ContainerBase的抽象類實現了Container接口,同時這4個接口的實現並且繼承ContianerBase類為StandardEngine,StandardHost,StandardContext,StandardWrapper

Engine與Host的關系
StandardEngine

public void addChild(Container child) {

        if (!(child instanceof Host))
            throw new IllegalArgumentException
                (sm.getString("standardEngine.notHost"));
        super.addChild(child);

    }

Host與Context的關系
StandardHost

public void addChild(Container child) {
        child.addLifecycleListener(new MemoryLeakTrackingListener());
        if (!(child instanceof Context))
            throw new IllegalArgumentException
                (sm.getString("standardHost.notContext"));
        super.addChild(child);

    }

Context與Wrapper的關系
StandardContext

public void addChild(Container child) {
        // Global JspServlet
        Wrapper oldJspServlet = null;

        if (!(child instanceof Wrapper)) {
            throw new IllegalArgumentException
                (sm.getString("standardContext.notWrapper"));
        }
        boolean isJspServlet = "jsp".equals(child.getName());

        // Allow webapp to override JspServlet inherited from global web.xml.
        if (isJspServlet) {
            oldJspServlet = (Wrapper) findChild("jsp");
            if (oldJspServlet != null) {
                removeChild(oldJspServlet);
            }
        }

        super.addChild(child);

        if (isJspServlet && oldJspServlet != null) {
            /*
             * The webapp-specific JspServlet inherits all the mappings
             * specified in the global web.xml, and may add additional ones.
             */
            String[] jspMappings = oldJspServlet.findMappings();
            for (int i=0; jspMappings!=null && i<jspMappings.length; i++) {
                addServletMapping(jspMappings[i], child.getName());
            }
        }
    }

然而StandardWrapper不能addChild

public void addChild(Container child) {
        throw new IllegalStateException
            (sm.getString("standardWrapper.notChild"));
    }

容器關系如下:

技術分享

Tomcat學習筆記(四)