首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Tomcat源码-请求处理3

2012-10-13 
Tomcat源码---请求处理三一,这一章节主要讲request与response通过管道,阀门在各个容器间运行?1,connector.

Tomcat源码---请求处理三

一,这一章节主要讲request与response通过管道,阀门在各个容器间运行?

1,connector.getContainer().getPipeline().getFirst().invoke(request, response);

这一步是StandardEngine获取StandardPipeline被StandardEngineValve进行过滤后执行到StandardHost

?

    /**     * Select the appropriate child Wrapper to process this request,     * based on the specified request URI.  If no matching Wrapper can     * be found, return an appropriate HTTP error.     *     * @param request Request to be processed     * @param response Response to be produced     * @param valveContext Valve context used to forward to the next Valve     *     * @exception IOException if an input/output error occurred     * @exception ServletException if a servlet error occurred     */    public final void invoke(Request request, Response response)        throws IOException, ServletException {        // Disallow any direct access to resources under WEB-INF or META-INF        //不允许访问以下两个目录的资源文件        MessageBytes requestPathMB = request.getRequestPathMB();        if ((requestPathMB.startsWithIgnoreCase("/META-INF/", 0))            || (requestPathMB.equalsIgnoreCase("/META-INF"))            || (requestPathMB.startsWithIgnoreCase("/WEB-INF/", 0))            || (requestPathMB.equalsIgnoreCase("/WEB-INF"))) {            notFound(response);            return;        }        // Wait if we are reloading        boolean reloaded = false;        while (context.getPaused()) {            reloaded = true;            try {                Thread.sleep(1000);            } catch (InterruptedException e) {                ;            }        }        // Reloading will have stopped the old webappclassloader and        // created a new one        if (reloaded &&                context.getLoader() != null &&                context.getLoader().getClassLoader() != null) {            Thread.currentThread().setContextClassLoader(                    context.getLoader().getClassLoader());        }        // Select the Wrapper to be used for this Request        //获取StandardWrapper,这个不允许有子容器        Wrapper wrapper = request.getWrapper();        if (wrapper == null) {            notFound(response);            return;        } else if (wrapper.isUnavailable()) {            // May be as a result of a reload, try and find the new wrapper            wrapper = (Wrapper) container.findChild(wrapper.getName());            if (wrapper == null) {                notFound(response);                return;            }        }        // Normal request processing        Object instances[] = context.getApplicationEventListeners();        ServletRequestEvent event = null;        if ((instances != null)                 && (instances.length > 0)) {            event = new ServletRequestEvent                (((StandardContext) container).getServletContext(),                  request.getRequest());            // create pre-service event            for (int i = 0; i < instances.length; i++) {                if (instances[i] == null)                    continue;                if (!(instances[i] instanceof ServletRequestListener))                    continue;                ServletRequestListener listener =                    (ServletRequestListener) instances[i];                try {                    listener.requestInitialized(event);                } catch (Throwable t) {                    container.getLogger().error(sm.getString("standardContext.requestListener.requestInit",                                     instances[i].getClass().getName()), t);                    ServletRequest sreq = request.getRequest();                    sreq.setAttribute(Globals.EXCEPTION_ATTR,t);                    return;                }            }        }        //StandardWrapperValve的执行,这下对servlet,filter,listener进行了处理        wrapper.getPipeline().getFirst().invoke(request, response);        if ((instances !=null ) &&                (instances.length > 0)) {            // create post-service event            for (int i = 0; i < instances.length; i++) {                if (instances[i] == null)                    continue;                if (!(instances[i] instanceof ServletRequestListener))                    continue;                ServletRequestListener listener =                    (ServletRequestListener) instances[i];                try {                    listener.requestDestroyed(event);                } catch (Throwable t) {                    container.getLogger().error(sm.getString("standardContext.requestListener.requestDestroy",                                     instances[i].getClass().getName()), t);                    ServletRequest sreq = request.getRequest();                    sreq.setAttribute(Globals.EXCEPTION_ATTR,t);                }            }        }                    }
?

热点排行