最新消息: 新版网站上线了!!!

Tomcat基本结构以及启动,Web应用的初始化

Tomcat中最顶层的容器是server,代表整个服务器。一个server可以包含至少一个Service,用于提供具体的服务。
Service主要包含Connector与Container,他们各自的作用如下:
Connector用于处理连接连接相关的事情,并提供Socket与Request和Response相关的转化;
Container用于封装和管理Servlet,以及具体处理Request请求;

 image.png

由上图可以知道一个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应用的初始化

web应用的初始化工作是在ContextConfig的configureStart方法中实现的,应用的初始化主要是解析web.xml文件,web.xml描述了Web应用的关键信息,也是Web应用的入口。web.xml 文件中的各个配置项将会被解析成相应的属性保存在 WebXml 对象中,接下去将会将 WebXml 对象中的属性设置到 Context 容器中,这里包括创建 Servlet 对象、filter、listener 等等。

所有 web.xml 属性都被解析到 Context 中,所以说 Context 容器才是真正运行 Servlet 的 Servlet 容器。一个 Web 应用对应一个 Context 容器,容器的配置属性由应用的 web.xml 指定。

在我们的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加载配置文件到启动容器的流程:

  1. 在启动Web项目时,容器比如Tomcat会读web.xml配置文件中所有的属性,包括<context-param>和<listener>这些等等。

  2. 接着Tomcat会创建一个ServletContext(这里的ServletContext可以理解为上述每个web应用对应的Context容器),应用范围内即整个web项目都能使用这个上下文。
  3. Tomcat将刚刚读取到<context-param>和<listener>这些web.xml中的参数键值对交给ServletContext。
  4. 创建web.xml 中配置的监听器类Listener。

经过以上步骤,已经产生一个ServletContext对象实例,ServletContext状态发生变化,


.....

转载请注明:谷谷点程序 » Tomcat基本结构以及启动,Web应用的初始化