package org.apache.catalina; public interface Mapper { public Container getContainer(); public void setContainer(Container container); public String getProtocol(); public void setProtocol(String protocol); public Container map(Request request, boolean update); }
public class SimpleContext implements Context, Pipeline { public SimpleContext() { pipeline.setBasic(new SimpleContextValve()); } protected HashMap<String, Container> children = new HashMap<String, Container>(); protected Loader loader = null; protected SimplePipeline pipeline = new SimplePipeline(this); protected HashMap<String, String> servletMappings = new HashMap<String, String>(); protected Mapper mapper = null; protected HashMap<String, Mapper> mappers = new HashMap<String, Mapper>(); private Container parent = null; ...... }
public final class Bootstrap2 { @SuppressWarnings("deprecation") public static void main(String[] args) { HttpConnector connector = new HttpConnector(); Wrapper wrapper1 = new SimpleWrapper(); wrapper1.setName("Primitive"); wrapper1.setServletClass("PrimitiveServlet"); Wrapper wrapper2 = new SimpleWrapper(); wrapper2.setName("Modern"); wrapper2.setServletClass("ModernServlet"); Context context = new SimpleContext(); context.addChild(wrapper1); context.addChild(wrapper2); Valve valve1 = new HeaderLoggerValve(); Valve valve2 = new ClientIPLoggerValve(); ((Pipeline) context).addValve(valve1); ((Pipeline) context).addValve(valve2); Mapper mapper = new SimpleContextMapper(); mapper.setProtocol("http"); context.addMapper(mapper); Loader loader = new SimpleLoader(); context.setLoader(loader); // context.addServletMapping(pattern, name); context.addServletMapping("/Primitive", "Primitive"); context.addServletMapping("/Modern", "Modern"); connector.setContainer(context); try { connector.initialize(); connector.start(); // make the application wait until we press a key. System.in.read(); } catch (Exception e) { e.printStackTrace(); } } }
我们先看看时序图
public void invoke(Request request, Response response, ValveContext valveContext) throws IOException, ServletException { ..... Context context = (Context) getContainer(); // Select the Wrapper to be used for this Request Wrapper wrapper = null; try { wrapper = (Wrapper) context.map(request, true); } catch (IllegalArgumentException e) { badRequest(requestURI, (HttpServletResponse) response.getResponse()); return; } if (wrapper == null) { notFound(requestURI, (HttpServletResponse) response.getResponse()); return; } // Ask this Wrapper to process this Request response.setContext(context); wrapper.invoke(request, response); }
public Container map(Request request, boolean update) { //this method is taken from the map method in org.apache.cataline.core.ContainerBase //the findMapper method always returns the default mapper, if any, regardless the //request's protocol Mapper mapper = findMapper(request.getRequest().getProtocol()); if (mapper == null) return (null); // Use this Mapper to perform this mapping return (mapper.map(request, update)); } public Mapper findMapper(String protocol) { // the default mapper will always be returned, if any, // regardless the value of protocol if (mapper != null) return (mapper); else synchronized (mappers) { return ((Mapper) mappers.get(protocol)); } }
how tomcat works 5 servlet容器 下
原文地址:http://blog.csdn.net/dlf123321/article/details/40211945