1.从Servlet容器说起1.1.接口是连接Servlet与Servlet容器的关键1.2.Context容器直接管理Servlet在容器中的包装类Wrapper,一个Context对应一个Web工程1.3.ContextConfig负责整个Web应用配置的解析工作,在调用Tomcat.addWebapp时被加入到StandardContext 1.4.Tomcat的启动逻辑是基于观察者模式设计的1.5.所有容器都会继承Lifecycle接口,管理着容器的整个生命周期,所有容器的改变都会由Lifecycle去通知已经注册的Listener1.6.ContextConfig的init方法完成的工作1.6.1.创建用于解析XML配置文件的contextDigester对象1.6.2.读取默认的context.xml配置文件,如果存在则解析它(配置文件里面是web.xml的访问路径)1.6.3.读取默认的host配置文件,如果存在则解析它1.6.4.读取默认的Context自身的配置文件,如果存在则解析它1.6.5.设置Context的DocBase1.7.Context容器执行startInternal方法的启动逻辑1.7.1.创建读取资源文件的对象1.7.2.创建ClasLoader对象1.7.3.设置应用的工作目录1.7.4.启动相关的辅助类,如logger,realm,resources等1.7.5.修改启动状态,通知感兴趣的观察者1.7.6.子容器初始化1.7.7.获取ServletContext并设置必要的参数1.7.8.初始化"load on startup"的servlet(JspServlet,DefaultServlet),在conf/web.xml下配置1.8.Web应用的初始化工作是在ContextConfig的configureStart方法中实现的,目的是为了解析*web.xml文件1.8.1.globalWebXml搜索路径是在conf/web.xml1.8.2.hostWebXml1.8.3.web.xml(应用的配置文件),解析成相应的属性保存在WebXml对象中,接下来将WebXml对象中的属性设置到Context容器中,这里包括Servlet对象、filter、listener等1.9.Context容器才是真正运行Servlet的Servlet容器2.创建Servlet实例2.1.创建Servlet对象:Servlet的"load-on-start"配置项大于0时,Context容器启动时就会被实例化2.2.初始化Servlet对象:调用Servlet的init()方法3.Servlet体系结构3.1.Servlet关联的类有ServletConfig,ServletRequest,ServletResponse3.2.ServletConfig在Servlet初始化时就传给了Servlet3.3.ServletRequest,ServletResponse是在调用Servlet传递过来的3.4.ServletConfig是为了获取Servlet的一些配置属性,而这些属性可能在Servlet运行时被用到3.5.门面设计模式:保证拿到所规定的数据,而不是拿到所有的数据(懒加载),封装容器中的数据4.Servlet如何工作4.1.hostname和port用来与服务器建立TCP连接4.2.URL用来选择在服务器中哪个子容器服务用户请求,在Request类进入Container容器之前,Mapper会根据请求内容,将host和context容器设置到类中,所以当Request类进入Container容器之前,对于访问子容器已经确定5.Servlet中的Listener5.1.Listener能够方便地从另一个纵向维度控制程序和数据5.2.Servlet提供了6种两类事件观察者接口5.2.1.EventListeners类型5.2.1.1.ServletContextAttributeListener5.2.1.2.SerlvetRequestAttributeListener5.2.1.3.ServletReuqestListener5.2.1.4.HttpSessionAttributeListener5.2.2.LifecycleListener类型5.2.2.1.ServletContextListener5.2.2.2.HttpSessionListener5.3.触发条件:属性被修改的时候,EventListeners类型的接口触发;生命周期中不同状态的时候,LifecycleListener类型的接口触发6.Filter如何工作6.1.作用:提供FilterChain对象,控制请求的流转6.2.Filter三个接口方法6.2.1.init():初始化接口6.2.1.1.可以获得下配置 参数值6.2.2.doFilter():在每个用户的请求进来时,这个方法都会被调用,并在Servlet的service方法之前被调用.6.2.2.1.通过调用FilterChain.doFilter可以将请求继续传递下去;如果想拦截这个请求,可以不调用,那么这个请求会直接返回6.2.2.2.Filter是一种责任链涉及模式6.2.3.destroy():当Filter对象被销毁的时候,方法被调用6.2.3.1.当Web容器调用这个方法之后,容器会再调用一次doFilter方法(有待商榷)6.3.FilterChain保存了所有Filter对象7.Servlet中的url-pattern7.1. 的三种解析规则7.1.1.精确匹配:如/foo.htm只会匹配foo.htm这个URL7.1.2.路径匹配:如/foo/*只会匹配以foo作为前缀的URL7.1.3.后缀匹配:如*.htm匹配所有以htm作为后缀的URL7.2.匹配规则7.2.1.精确匹配:如servlet1为/foo.htm,servlet2为/*.请求URL为http://localhost/foo.htm,那么只有servlet1匹配成功7.2.2.最长路径匹配:如servlet1为/foo/*,servlet2为/*.请求URL为http://localhost/foo.htm,那么只有servlet1匹配7.2.3.后缀路径匹配:一次请求只会匹配到一个servlet7.3.Filter的匹配规则与servlet不同,只要匹配成功,这些Filter都会在请求链上被调用
Tomcat容器模型
Servlet顶层类关联图
Filter相关的类结构图