1. 程式人生 > >Web開發中Listener、Filter、Servlet的初始化及調用

Web開發中Listener、Filter、Servlet的初始化及調用

children tomcat啟動 什麽 lis exceptio try 部分 OS findchild

我們在使用Spring+SpringMVC開發項目中,web.xml中一般的配置如下:

技術分享圖片
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"
> 3 <!-- 加載spring配置 4 默認查找的配置文件位置是:WEB-INF/applicationContext.xml。 5 可通過下面參數指定文件位置--> 6 <context-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value> 9 classpath:applicationContext.xml
10 </param-value> 11 </context-param> 12 13 <filter> 14 <filter-name>CorsFilter</filter-name> 15 <filter-class>com.filter.CORSFilter</filter-class> 16 </filter> 17 <filter-mapping> 18 <filter-name
>CorsFilter</filter-name> 19 <url-pattern>/*</url-pattern> 20 </filter-mapping> 21 22 <listener> 23 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 24 </listener> 25 26 <servlet> 27 <servlet-name>spring-mvc</servlet-name> 28 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 29 <!-- spring mvc 默認加載的配置文件為/WEB-INF/[servlet-name]-servlet.xml,也可通過以下參數指定 --> 30 <!-- <init-param> 31 <param-name>contextConfigLocation</param-name> 32 <param-value>/WEB-INF/spring-mvc-servlet.xml</param-value> 33 </init-param> --> 34 <!-- load-on-startup設置為1,表示項目啟動時加載 --> 35 <load-on-startup>1</load-on-startup> 36 </servlet> 37 </web-app>
View Code

那麽Listener中的contextInitialized方法是什麽時候被調用呢?答案就在org.apache.catalina.core.StandardContext類的startInternal方法中

 1 //org.apache.catalina.core.StandardContext
 2  @Override
 3 protected synchronized void startInternal() throws LifecycleException {
 4     //省略部分代碼,只列出關鍵代碼
 5 // Configure and call application event listeners
 6             if (ok) {
 7                 if (!listenerStart()) {
 8                     log.error(sm.getString("standardContext.listenerFail"));
 9                     ok = false;
10                 }
11             }
12 
13             try {
14                 // Start manager
15                 Manager manager = getManagerInternal();
16                 if ((manager != null) && (manager instanceof Lifecycle)) {
17                     ((Lifecycle) getManager()).start();
18                 }
19             } catch(Exception e) {
20                 log.error(sm.getString("standardContext.managerFail"), e);
21                 ok = false;
22             }
23 
24             // Configure and call application filters
25             if (ok) {
26                 if (!filterStart()) {
27                     log.error(sm.getString("standardContext.filterFail"));
28                     ok = false;
29                 }
30             }
31 
32             // Load and initialize all "load on startup" servlets
33             if (ok) {
34                 if (!loadOnStartup(findChildren())){
35                     log.error(sm.getString("standardContext.servletFail"));
36                     ok = false;
37                 }
38             } 

第7行執行觸發listener事件,listenerStart()方法中有listener.contextInitialized(event)語句,直接調用listener的contextInitialized方法。

第27行會執行了filter的init方法,具體細節請參照tomcat源碼,在此不在詳細贅述。

第34行,如果在web.xml中servlet標簽指定了<load-on-startup>1</load-on-startup>(值大於0即可),會執行servlet的實例化,然後調用servlet的int(ServletConfig config)。

由此也可指定在Tomcat啟動時,這三者調用的先後順序為listener-->filter-->servlet。

註:StandardContext類的startInternal方法會在Tomcat啟動時調用。

Web開發中Listener、Filter、Servlet的初始化及調用