Tomcat中最顶层的容器是server,代表整个服务器。一个server可以包含至少一个Service,用于提供具体的服务。
Service主要包含Connector与Container,他们各自的作用如下:
Connector用于处理连接连接相关的事情,并提供Socket与Request和Response相关的转化;
Container用于封装和管理Servlet,以及具体处理Request请求;
由上图可以知道一个Tomcat容器分为四个等级:Container容器、Engine、Host以及Context。真正管理Servlet容器的是Context容器,一个Context对应一个Web应用。
Tomcat的启动是从顶层开始一直到Engine到Host到Context。Tomcat的采用了一种观察者设计模式,所有的容器都会继承Lifecycle接口,它管理整个容器的生命周期,所有容器的修改和状态的改变都会由它去通知已经注册的观察者(Listener)。
当启动到Context容器时,也就是Context容器的初始状态设为init时,添加在Context容器的Listener将会被调用。ContextConfig继承了LifecycleListener接口,ContextConfig将负责整个Web应用配置文件的解析工作(web.xml)。
web应用的初始化工作是在ContextConfig的configureStart方法中实现的,应用的初始化主要是解析web.xml文件,web.xml描述了Web应用的关键信息,也是Web应用的入口。web.xml 文件中的各个配置项将会被解析成相应的属性保存在 WebXml 对象中,接下去将会将 WebXml 对象中的属性设置到 Context 容器中,这里包括创建 Servlet 对象、filter、listener 等等。
在我们的web项目中的web.xml可能会存在如下配置信息:
<!--ServletContextListener监听器配置--> <context-param> <param-name>contextInitParam</param-name> <param-value>contextInitParam value</param-value> </context-param> <listener> <listener-class>com.basic.demo.ServletContextListenerDemo</listener-class> </listener>
<context-param>元素用来声明应用范围(当前Web应用)内的上下文初始化参数。
<listener>元素配置监听器,在Servlet中主要有如下三种监听器:
ServletContextListenerHttpSessionListenerServletRequestListener
Context容器状态的改变是用ServletContextListener 来监听,下面就梳理从Tomcat加载配置文件到启动容器的流程:
在启动Web项目时,容器比如Tomcat会读web.xml配置文件中所有的属性,包括<context-param>和<listener>这些等等。
接着Tomcat会创建一个ServletContext(这里的ServletContext可以理解为上述每个web应用对应的Context容器),应用范围内即整个web项目都能使用这个上下文。 Tomcat将刚刚读取到<context-param>和<listener>这些web.xml中的参数键值对交给ServletContext。 创建web.xml 中配置的监听器类Listener。
经过以上步骤,已经产生一个ServletContext对象实例,ServletContext状态发生变化,
转载请注明:谷谷点程序 » Tomcat基本结构以及启动,Web应用的初始化