创建Servlet实例。
创建Servlet对象
如果Servlet的load-on-startup配置项大于0,那么在Context容器启动时就会被实例化。在解析配置文件时会读取默认的globalWebXml,在conf下的web.xml文件中定义了一些默认的配置项,其中定义了两个Servlet,分别是org.apache.catalina.servlets.DefaultServlet和org.apache.jasper.servlet.JspServlet。他们的load-on-startup分别是1和3,也就是当Tomcat启动时这两个Servlet就会被启动。
创建Servlet实例的方法是从Wrapper.loadServlet开始的。LoadServlet方法要完成的就是获取servletClass,然后把他交给InstanceManager去创建一个基于servletClass.class的对象。如果这个Servlet配置了jsp-file,那么这个servletClass就是在conf/web.xml中定义的org.apache.jasper.servlet.JspServlet了。
初始化Servlet
初始化Servlet在StandardWrapper的initServlet方法中,这个方法很简单,就是调用Servlet的init()方法,同时把包装了StandardWrapper对象的StandardWrapperFacade作为ServletConfig传给Servlet。
如果该Servlet关联的是一个JSP文件,那么前面初始化的就是JspServlet,接下来会模拟一次简单请求,请求调用这个JSP文件,以便编译这个JSP文件为类,并初始化这个类。
这样Servlet对象就初始化完成了,事实上Servlet从被web.xml解析到完成初始化,这个过程非常复杂,中间有很多过程,包括各种容器状态的转化引起的监听时间的触发、各种访问全县的控制和一些不可预料的错误发生的判断行为等。
下图是这个过程的一个完整的时序图。