2011-02-28 70 views
12

當我反編譯GenericServlet並檢查init()時,我看到下面的代碼。什麼是servlet的init()方法用於?

public void init(ServletConfig servletconfig) 
    throws ServletException 
{ 
    config = servletconfig; 
    init(); 
} 

public void init() 
    throws ServletException 
{ 
} 

這裏實際執行的init方法是什麼?我錯過了什麼嗎?

+2

無關的問題:最servletcontainers都是開源的。您可以從他們的主頁下載servletcontainer的源代碼。它包含Servlet API。無需手動反編譯:) – BalusC 2011-02-28 12:26:19

+0

@BalusC你可以,但這是一個乏味的過程。爲了快速「檢查這件事情」,我更喜歡反編譯。 – Bozho 2011-02-28 12:53:37

+3

@Bozho:反編譯的源代碼不包含javadocs。這可能是一項乏味的一次性任務,但之後您可以將源代碼包含在IDE中,並且您從不需要面對「未知來源」頁面和/或單獨對每個小類進行反編譯。 – BalusC 2011-02-28 12:57:38

回答

8

javadoc

/** 
* 
* A convenience method which can be overridden so that there's no need 
* to call <code>super.init(config)</code>. 
* 
* <p>Instead of overriding {@link #init(ServletConfig)}, simply override 
* this method and it will be called by 
* <code>GenericServlet.init(ServletConfig config)</code>. 
* The <code>ServletConfig</code> object can still be retrieved via {@link 
* #getServletConfig}. 
* 
* @exception ServletException if an exception occurs that 
*     interrupts the servlet's 
*     normal operation 
* 
*/ 

所以什麼也不做只是爲了方便。

+2

爲什麼我們不能把所有初始化/初始化代碼放在servlet構造函數中?實際上,我的書以這種方式提出了問題 - '爲什麼會有init()方法?換句話說,爲什麼構造函數不夠用於初始化servlet?你會在init()方法中加入什麼樣的代碼? – 2014-04-26 22:31:13

+2

_Well,在JDK 1.0(最初編寫servlet)中,動態加載的Java類(如servlet)的構造函數無法接受參數。因此,爲了向servlet提供有關自身及其環境的任何信息,服務器必須調用servlet的init()方法並傳遞實現ServletConfig接口的對象 - Jason Hunter的Java Servlet編程與William Crawford – Kay 2017-02-13 19:51:46

12

是的,它什麼都不做。它可能是抽象的,但是每個servlet都會被迫實現它。這樣,默認情況下,init()上沒有任何事情發生,並且每個servlet都可以覆蓋此行爲。例如,你有兩個servlet:

public PropertiesServlet extends HttpServlet { 

    private Properties properties; 

    @Override 
    public void init() { 
     // load properties from disk, do be used by subsequent doGet() calls 
    } 
} 

public AnotherServlet extends HttpServlet { 

    // you don't need any initialization here, 
    // so you don't override the init method. 
} 
+0

但是在調用init()方法之前沒有服務請求。如果init方法中沒有任何事情發生,那有什麼意義? – vinoth 2011-02-28 10:02:31

+4

servlet可以覆蓋此,並指定要發生什麼 – Bozho 2011-02-28 10:21:52

+1

@Bozho - 爲什麼我們不能把所有的初始化/初始化代碼servlet的構造函數中?實際上,我的書以這種方式提出了問題 - '爲什麼會有init()方法?換句話說,爲什麼構造函數不夠用於初始化servlet?你會在init()方法中加入什麼樣的代碼? – 2014-04-26 22:30:34

3

構造可能無法訪問ServletConfig因爲容器沒有叫init(ServletConfig config)方法。

init()方法從GenericServlet繼承,它有一個ServletConfig作爲它的屬性。多數民衆贊成HttpServlet以及您通過延伸HttpServlet寫入什麼自定義servlet得到ServletConfig

and GenericServlet implements ServletConfig其中有getServletContext方法。所以你的自定義servlets init方法將有權訪問這兩者。

相關問題