Web開發中Listener、Filter、Servlet的初始化及調用
阿新 • • 發佈:2018-03-23
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"View Code> 3 <!-- 加載spring配置 4 默認查找的配置文件位置是:WEB-INF/applicationContext.xml。 5 可通過下面參數指定文件位置--> 6 <context-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value> 9 classpath:applicationContext.xml10 </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>
那麽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的初始化及調用