1. 程式人生 > >Servlet、ServletConfig、ServletContext深入學習

Servlet、ServletConfig、ServletContext深入學習

功能 style 配置服務器 初始 傳遞 解決 核心 des 生命

1.Servlet學習

  

Servlet 加載—>實例化—>服務—>銷毀。

init(servletConfig):(經過自己的測試發現會先調用這個而不是init())
在Servlet的生命周期中,僅執行一次init()方法。它是在服務器裝入Servlet時執行的,負責初始化Servlet對象。可以配置服務器,以在啟動服務器或客戶機首次訪問Servlet時裝入Servlet。無論有多少客戶機訪問Servlet,都不會重復執行init()。
service():

它是Servlet的核心,負責響應客戶的請求。每當一個客戶請求一個HttpServlet對象,該對象的Service()方法就要調用,而且傳遞給這個方法一個“請求”(ServletRequest)對象和一個“響應”(ServletResponse)對象作為參數。在HttpServlet中已存在Service()方法。默認的服務功能是調用與HTTP請求的方法相應的do功能。

destroy():
僅執行一次,在服務器端停止且卸載Servlet時執行該方法。當Servlet對象退出生命周期時,負責釋放占用的資源。一個Servlet在運行service()方法時可能會產生其他的線程,因此需要確認在調用destroy()方法時,這些線程已經終止或完成。

  應該知道,在Servlet初始化的時候,會自動調用init(ServletConfig config),Container會自動收集一些該Servlet的配置信息,生成一個ServletConfig的實例,通過調用該實例的四個getXXX方法(即ServletConfig接口中的四個方法),我們可以得到該Servlet的這些配置信息。

  而該實例我們如何獲取呢?是通過Servlet#getServletConfig()得到的,該方法同樣在GenericServlet中實現,具體如下:

public void init(ServletConfig config) throws ServletException {  
    this.config = config;  
    this.init();  
}  
public ServletConfig getServletConfig() {  
    return config;  
} 

  我認為init()的出現,是為了解決一個問題,那就是有些人最開始時候,重寫init(ServletConfig config)方法,但卻總是忘記去調用“super.init(config);”。試想,如果真的出現這種情況,那麽,就會造成一種結果,容器收集的Servlet的配置信息,不能初始化給GenericServlet的config屬性,以至於當調用getServletConfig()的時候,會得不到有用的config實例,而只能得到一個null。這樣也就無法獲取該Servlet的配置信息了。(我剛開始重寫這個方法沒有調用super.init(config)所以就獲取不到servletConfig對象了)

而無參數的init()方法在GenericServlet中的出現,解決了這種或許人為造成的獲取不到ServletConfig對象的尷尬。可以看到含參init方法調用了無參init,這就讓我們可以在處理Servlet初始化參數的時候,只需要重寫無參的init()方法就行了。初始化config對象的操作仍然在Container調用init(ServletConfig config)時候完成,然後調用你重寫了的init()方法,完成其他初始化操作。

Servlet、ServletConfig、ServletContext深入學習