2010-11-01 147 views
8

,而我真的不能相信實際使用情況對這樣的情景,但我純粹是打算這是一個好奇心驅使的問題。訪問一個servlet實例

我明白servlet容器保持到小服務程序的創建的所有情況下,和代表請求線程這些實例。保持這些實例的管理也是有意義的,以避免不必要的調用來改變容器範圍以外的servlet實例的生命週期。

但是真的沒有辦法訪問servlet實例嗎?

回答

5

此前Servlet的2.1(超過十年的老的話),你可以使用ServletContext#getServlet()此。然而,從那時起,它就被棄用了。只是因爲這是一個糟糕的設計。如果要在請求 - 響應鏈中從servlet內部調用另一個servlet,請使用RequestDispatcher#include()。如果您想調用另一個servlet的非servlet特定方法,那麼現在只需將該代碼重構爲單獨的Java類,然後您可以在這兩個servlet中導入/使用該類。

+0

確實是一個非常有趣的行爲。我只知道JSP中的「包含」,但servlet服務方法也可以鏈接在一起,這是新聞。感謝您的學習。 – anirvan 2010-11-02 08:10:15

+0

不過,這項技術應該高度謹慎使用,因爲它也表明了設計氣味。通常,調用servlet應該從一開始就是一個過濾器,或者應該轉換爲遵循[前端控制器](http://stackoverflow.com/questions/3541077/design-patterns-web-based-applications /)模式。 – BalusC 2010-11-02 08:12:27

2

容器創建了Servlet只有一個實例,並使用相同的實例來服務於多個請求。有「SingleThreadModel」,如果你實現,容器會創建Servlet的多個實例,但現在已經棄用了。

0

沒有通過標準的Servlet API(所以答案是否定的)。

你可以,但是,使用和實際執行的知識討厭的招數用反射來獲取由實現使用的數據結構,保持持有Servlet實例,(所以答案是肯定的)。

servlet容器可能,但是,有一個安全管理器的地方,禁止使用說難聽技巧(所以答案是可能)。