看的《深入分析Java技术内幕》
-------------Servlet-------------
1.大体介绍:JavaWeb如何基于Servlet工作,Servlet容器工作原理(Tomcat为例),Web工程在Servlet容器中如何启动,Servlet容器如何解析web.xml定义的Servlet,用户请求如何分配给指定的Servlet,Servlet容器如何管理Servlet生命周期。
2.Servlet与Servlet容器的关系:类似枪和子弹。为了解耦,通过标准化接口相互协作。
3.以Tomcat为例介绍Servlet容器如何管理Servlet。Context容器直接管理Servlet在容器中的包装类Wrapper,所以Context容器直接影响Servlet的工作方式。
4.Tomcat容器模型:Container容器最外层,包含Engine,Engine包含Host,Host包含Servlet容器,Servlet容器包括多个Context,每个Context包含了多个Wrapper。
5.Web初始化:添加Web应用时会创建StandardContext容器并设置url和path。其中最重要的配置是ContextConfig,负责整个Web应用配置的解析,最后将这个Context容器加到父容器Host中。
6.Tomcat的启动逻辑基于观察者模式,所有容器继承Lifecycle接口,管理容器整个生命周期,所有容器的修改和状态改变由它通知观察者(Listener)。
7.ContextConfig的初始化:解析web.xml,将Servlet包装成Context容器中的StandardWrapper(不包装成Servlet对象原因:StandardWrapper是Tomcat容器中的一部分,具有容器的特征,而Servlet为独立的Web开发标准,不应该强耦合在Tomcat中)。
8.Context容器才是真正运行Servlet的Servlet容器。一个Web应用对应一个Context容器,配置属性由应用的web.xml指定。
9.Servlet实例的创建(前面完成Servlet的解析并包装成StandardWrapper添加在Context容器中)。
10.Servlet主动关联(实现三个接口)三个类:ServletConfig,ServletRequest,ServletResponse。ServletConfig在Servlet初始化时就传给Servlet了,后两个是在请求到达时调用Servlet传递。ServletConfig是获取Servlet的配置属性,StandardWrapper和ApplicationContext使用门面模式并实现ServletConfig接口。ServletConfig实现ServleContext,ServletContext含Context容器中如工作路径等的必要信息。而ServletRequest,ServletResponse转化为自己的Servlet类中HttpServletRequest和HttpServletResponse类。
11.用户从浏览器向服务器发起请求包括:http:hostname:port/contextpath/servletpath,前两个建立TCP连接,后面的URL选择服务器子容器服务用户请求到达Servlet容器,这种映射工作由Mapper类完成(Tomcat5前)(5后被移到Request中),保存了tomcat的Container容器中所有子容器信息,是Request类进入Container容器前,Mapper已根据hostname和contextpath将host和context容器设置到Requst属性中,保证Request进入Container容器前确定访问的子容器。
12.tomcat中基于观察者模式的Listener应用广泛,都继承EventListener接口。
13.Filter除提供request和response对象外,还提供了FilterChain对象。
-------------Tomcat-------------
1.tomcat两个核心组件:Connector和Container。一个Container可以选择多个Connector并形成一个Service,Service被包含在Server服务器里。
2.一个Service可以设置一个Container容器和多个Connector。Service接口标准实现类是StandardService,同时实现了Lifecycle接口。
3.Server接口:让其他程序访问Service集合,维护其生命周期。
4.Lifecycle接口:控制生命周期。
5.Connector组件:接受浏览器的TCP连接请求,创建Request和Reponse对象用于和请求端交换数据。然后产生线程处理请求并把Request和Reponse对象传给处理请求的线程(多线程是Connector设计的核心),由Container组件处理请求线程。
6.Container组件:与Servlet介绍同,有四个分别是父子关系的组件:Engine,Host,Context,Wrapper,一个Engine代表完整的Servlet引擎。
7.一个Host在Engine中代表一个虚拟主机,安装和展开多个应用(eg.URL中的localhost)。
8.Context:管理以Wrapper出现的Servlet实例,启动子容器和Pipeline。具备了Servlet的基本运行环境,理论上只要有Contxt就能运行Servlet。
9.Wrapper:实现类是StandardWrapper,实现了拥有Servlet初始信息的ServletConfig,代表一个Servlet,管理Servlet,包括Servlet的装载,初始化,执行和资源回收。