java web項目啟動加載順序


 

 

轉載:https://www.cnblogs.com/writeLessDoMore/p/6935524.html

 

web.xml加載過程(步驟):
       1.啟動WEB項目的時候,容器(如:Tomcat)會去讀它的配置文件web.xml.讀兩個節點:   

   <listener></listener> 和 <context-param></context-param>

2.緊接着,容器創建一個ServletContext(上下文),這個WEB項目所有部分都將共享這個上下文.

3.容器將<context-param></context-param>轉化為鍵值對,並交給ServletContext.

4.容器創建<listener></listener>中的類實例,即創建監聽.

5.在監聽中會有contextInitialized(ServletContextEvent args)初始化方法,在這個方法中獲得:

ServletContext = ServletContextEvent.getServletContext();   
                   context-param的值 = ServletContext.getInitParameter("context-param的鍵");  

6.得到這個context-param的值之后,你就可以做一些操作了.注意,這個時候你的WEB項目還沒有完全啟動完成.這個動作會比 所 有的Servlet都要早.
換句話說,這個時候,你對<context-param>中的鍵值做的操作,將在你的WEB項目完全啟動之前被執行.

7.舉例.你可能想在項目啟動之前就打開數據庫.
那么這里就可以在<context-param>中設置數據庫的連接方式,在監聽類中初始化數據庫的連接.

8.這個監聽是自己寫的一個類,除了初始化方法,它還有銷毀方法.用於關閉應用前釋放資源.比如說數據庫連接的關閉.

web.xml節點加載順序:

可以肯定的是,節點的加載順序與它們在 web.xml 文件中的先后順序無關。即不會因為 filter 寫在 listener 的前面而會先加載 filter。最終得出的結論是:listener -> filter -> servlet

        同時還存在着這樣一種配置節點:context-param,它用於向 ServletContext 提供鍵值對,即應用程序上下文信息。我們的 listener, filter 等在初始化時會用到這些上下文中的信息,那么 context-param 配置節是不是應該寫在 listener 配置節前呢?實際上 context-param 配置節可寫在任意位置,因此真正的加載順序為:

context-param -> listener -> filter -> servlet

對於某類配置節而言,與它們出現的順序是有關的。以 filter 為例,web.xml 中當然可以定義多個 filter,與 filter 相關的一個配置節是 filter-mapping,這里一定要注意,對於擁有相同 filter-name 的 filter 和 filter-mapping 配置節而言,filter-mapping 必須出現在 filter 之后,否則當解析到 filter-mapping 時,它所對應的 filter-name 還未定義。web 容器啟動時初始化每個 filter 時,是按照 filter 配置節出現的順序來初始化的,當請求資源匹配多個 filter-mapping 時,filter 攔截資源是按照 filter-mapping 配置節出現的順序來依次調用 doFilter() 方法的。

       servlet 同 filter 類似,此處不再贅述。

【加載spring

       比如filter 需要用到 bean ,但加載順序是: 先加載filter 后加載spring,則filter中初始化操作中的bean為null;

       所以,如果過濾器中要使用到 bean,可以將spring 的加載 改成 Listener的方式 :


<listener>  
        <listener-class>  
             org.springframework.web.context.ContextLoaderListener   
        </listener-class>  
</listener>

    最終結論:

           web.xml 的加載順序是:[context-param -> listener -> filter -> servlet -> spring] ,而同類型節點之間的實際程序調用的時候的順序是根據對應的 mapping 的順序進行調用的。

 

============================================================

java filter 讀取 filter init-param 配置的變量

轉載:https://blog.csdn.net/home_zhang/article/details/7754634

 

web.xml中

<!-- 編碼過濾 避免出現亂碼 -->
<filter>
<filter-name>txtFilter</filter-name>
<filter-class>com.filter.txtFilter</filter-class>
<init-param>
<param-name>URL</param-name>
<param-value>http://127.0.0.1:8081/uu/</param-value>
</init-param>
<init-param>
<param-name>LocalURL</param-name>
<param-value>http://127.0.0.1:8081/vv/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>txtFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

讀取變量的代碼:

 

public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init()...............");
this.URL = filterConfig.getInitParameter("URL");
this.LocalURL = filterConfig.getInitParameter("LocalURL");
System.out.println("URL:" + URL);
System.out.println("LocalURL:" + LocalURL);


}

 

運行控制台顯示結果:

init()...............
UMT.URL:http://127.0.0.18081/uu/
LocalURL:http://127.0.0.1:8081/vv/

 

servlet-獲取web.xml配置的init-param參數

轉載:https://www.cnblogs.com/luoxiaozhao/p/6963824.html

1.web.xml配置的參數

復制代碼
 1      <servlet>
 2         <servlet-name>firstServlet</servlet-name>
 3         <servlet-class>com.Conservlet</servlet-class>
 4         <init-param>
 5             <param-name>url</param-name>
 6             <param-value>jdbc:mysql://localhost:3306/house</param-value>
 7         </init-param>
 8         <init-param>
 9             <param-name>user</param-name>
10             <param-value>root</param-value>
11         </init-param>
12         <init-param>
13             <param-name>pwd</param-name>
14             <param-value>123456</param-value>
15         </init-param>
16         <init-param>
17             <param-name>driver</param-name>
18             <param-value>com.mysql.jdbc.Driver</param-value>
19         </init-param>
20     </servlet>
21     <servlet-mapping>
22         <servlet-name>firstServlet</servlet-name>
23         <url-pattern>/a</url-pattern>
24     </servlet-mapping>
復制代碼

2.servlet的doGet()獲取值

復制代碼
 1 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3             // TODO Auto-generated method stub
 4             try {            
 5             ServletConfig config = getServletConfig();
 6             String driver=config.getInitParameter("driver");
 7             String url=config.getInitParameter("url");
 8             String user=config.getInitParameter("user");
 9             String pwd=config.getInitParameter("pwd");
10             response.setCharacterEncoding("gbk");
11             //注冊驅動
12             Class.forName(driver);
13             //建立連接
14             Connection conn = (Connection)DriverManager.getConnection(url, user, pwd);
15             Statement stm = (Statement)conn.createStatement();
16             ResultSet rs = stm.executeQuery("select username,pwd from user");
17             response.setContentType("text/html;charset=gbk");
18             PrintStream out = new PrintStream(response.getOutputStream());
19             out.println("<html>");
20             out.println("<head>");
21             out.println("<title>測試連接</title>");
22             out.println("</head>");
23             out.println("<body>");
24             out.println("<table border=\"1\" width=\"300\"");
25             while(rs.next())
26             {
27                 out.println("<tr>");
28                 out.println("<td>"+rs.getString(1)+"</td>");
29                 out.println("<td>"+rs.getString(2)+"</td>");
30                 out.println("</tr>");
31             }    
32             out.println("</table>");
33             out.println("</body>");
34             out.println("</html>");
35         } catch (Exception e) {
36             // TODO: handle exception
37         }
38     }
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM