2012-07-17 75 views
-4

請告知會發生什麼如果我在一個servlet的doget()方法內部調用init()方法。它會拋出異常嗎?它會對servlet的生命週期產生什麼影響?在servlet的doget()方法中調用init()

請指教。

+0

你試過了嗎? – johusman 2012-07-17 14:51:14

+3

永遠不要這樣做。它使得服務器跨越黑暗的一面,將運行瀏覽器的機器炒掉,然後破壞自身。根據您的服務器和發送命中獲取請求的瀏覽器的位置,它可能也會導致跨大西洋海底通信電纜的中斷。 – 2012-07-17 15:25:40

回答

1

很可能,您的init()方法中的代碼將執行。

對於init方法沒有什麼特別的地方,除了容器在您的servlet投入使用之前調用它。你可以隨時撥打它。如果您的init方法更改任何共享數據的值,則可能會遇到奇怪的問題。

我無法想像爲什麼有人會從doGet方法中調用init

1

首先,如果您試圖從doGet()中調用init()方法並查看會發生什麼,則可以避免提出此問題。

無論如何,servlet規範2.3表示:

初始化被設置爲使得一個servlet可以讀取持久 配置數據,初始化昂貴的資源(如JDBC™API 基於連接),以及執行其他單時間活動。

所以,你應該不知道有多少一次性活動的是在當前的init()方法。調用該方法與調用不同的方法沒有區別。我在考慮一個場景,其中您的init()方法唯一的作用是從ServetConfig的init參數初始化擁有的屬性;在這種情況下,沒有錯將會發生。

但是,如果您的init()方法執行任何可能會改變servlet內部狀態的任務,那麼您有機會面對一種奇怪的行爲。

如果您正在執行init()方法中的任何任務,您可能需要在doGet()中使用該方法,然後將它們移至私有內部方法。

0

如果你沒有實現init()方法,很多事情都不會發生。原因是繼承的實現也是空的。你的servlet可能延伸的HttpServlet,它繼承以下從GenericServlet類實現:

public void init() throws ServletException { 
    // NOOP by default 
} 

如果你有自己的實現,那麼在您的實現代碼被執行。它會拋出異常 - 這取決於你編碼的內容。

如果你調用init,它將ServletConfig作爲參數,那麼原來的ServletConfig將被替換,並調用init()。我看不出爲什麼要撥打initinit(ServletConfig)方法。方法是讓你在需要時重寫,並被servlet容器調用。

相關問題