首页 > 代码库 > Servlet

Servlet

1.Tomcat与Servlet容器

TomCat->Container容器->Engine->Host->Servlet容器->Context->Wrapper

技术分享

真正管理Servlet容器的是Context容器,一个Context对应一个Web工程。

2.TomCat容器启动过程

Tomcat7 增加了一个启动类 org.apache.catalina.startup.Tomcat

1 Tomcat tomcat = getTomcatInstance();
2 File appDir = new File(getBuildDirectory(), "webapps/examples");
3 tomcat.addWebapp(null, "/examples", appDir.getAbsolutePath());
4 tomcat.start();

创建了一个Tomcat实例,新增了一个Web应用,然后启动Tomcat。

 1 public Context addWebapp(Host host, String url, String path){
 2     silence(url);
 3     Context ctx = new StandardContext();
 4     ctx.setPath(url);
 5     ctx.setDocBase(path);
 6     if(defaultRealm == null){
 7         initSimpleAuth();
 8     }
 9     ctx.setRealm(defaultRealm);
10     ctx.addLifecycleListener(new DefaultWebXmlListener());
11     ContextConfig ctxCfg = new ContextConfig();
12     ctx.addLifecycleListener(ctxCfg);
13     ctxCfg.setDefaultWebXml("org/apache/catalin/startup/NO_DEFAULT_XML");
14     if(host == null){
15         getHost().addChild(ctx);
16     }else{
17         host.addChild(ctx);
18     }
19     return ctx;
20 }

 

addWebapp方法中会新建一个Context    //一个Web应用对应一个Context容器

为Context配置了 应用的路径 并 指定了配置文件 ContextConfig //负责整个Web应用配置的解析工作

最后将这个Context加到父容器Host中。

3.Web应用的初始化过程

web应用的初始化工作是在ContextConfig中的configureStart方法中实现的,初始化主要是解析web.xml文件,这个文件描述了一个web应用的关键信息,也是一个web应用的入口。

Tomcat首先去找globalWebXml 然后去找hostWebXml 再去找WEB-INF/web.xml 

并将web.xml解析成相应的属性保存在WebXml对象中,接下来将WebXml对象中的属性设置到Context容器中,在这一步骤创建Servlet、filter、listener等。

这里WebXml的configureContext方法会将Servlet包装成Context中的StandardWrapper 并传入Context中

除Servelet包装成StandardWrapper并作为子容器添加到Context外,其他web.xml属性都被解析到Context中

一个web应用对应一个Context容器,容器的配置属性由应用的web.xml指定。

4.创建Servlet实例

前面Servelet被包装成StandardWrapper并作为子容器添加到Context容器中,但是它还没有被实例化。

如果web.xml中Servlet的load-on-startup配置项大于0,那么在Context容器启动时就会被实例化。

通过StandardWrapper的initServlet方法 初始化Servlet 该方法调用Servlet的init方法,同时将包装了StandardWrapper对象的StandardWrapperFacade 传给Servlet,这样Servlet对象就初始化完成了。

5.Servlet体系结构

与Servlet主动关联的三个类,ServletConfig ServletRequest ServletResponse

ServletConfig是在Servlet初始化的时候传递给Servlet的 //即上述的StandardWrapperFacade ,而后两者是在请求到达时调用Servlet传递过来的

6.Servlet如何工作

浏览器发往服务器的一个url  http://hostname:port/contextpath/servletpath

hostname与port用来与服务器建立TCP连接,后面的URL用来选择服务器中哪个子容器服务用户的请求。

TomCat 7中的org.apache.tomcat.util.http.mapper这个类,保存了Tomcat的Container容器中的所有子容器的信息,在org.apache.catalina.connector.Request类进入Container容器之前,Mapper将会根据这次请求的hostname和contextpath将host和context容器设置到Request的mappingData属性中,所以当Request进入Container容器之前,对于要访问哪个子容器就已经确定了。接下来根据url来匹配在每个Servlet/*此处指的是Context中的各个Wrapper*/ 中配置的<url-pattern>

Servlet