2009-06-03 98 views

回答

8

的Servlet實例由容器,通過反射創建的,他們希望找到一個公共的無參數的構造函數(默認構造函數)。

要配置您的servlet,請使用web.xml文件中指定的servlet參數。這些傳遞給你的servlet的方法init()


雖然這將是可能一個servlet容器選擇一個非默認的構造函數,並強制對字符串進行簡單的類型和反思調用構造函數,這不是什麼Servlet規範要求。

部分原因可能是歷史的;早在依賴注入系統廣泛實踐這種替代方法之前,Servlet就已經被首先指定了。但是,這樣的構造者會相當有限;傳遞可以從web.xml中指定的簡單字符串創建的參數是可行的,但更有用的對象— a DataSource(例如—)會很尷尬。

儘管在servlet中有最終的成員變量會很好。

以前稱爲「WebBeans」(JSR 299,我認爲)的JSR將爲Servlet中的依賴注入支持提供一些標準。這可能解決目前方法中的一些缺點。

+0

但爲什麼期望默認的構造函數?我們也可以使用反射調用參數化的構造函數。 – 2009-06-03 16:48:06

1

由於servlet由容器實例化,所以它們需要一個無參數的構造函數。

此外,容器可能會重新使用servlet,並且不會在重用時調用構造函數。

1

您需要通過<servlet-param>來初始化變量,或者使用像Spring這樣的框架,它可以讓您將Servlet委託給與其他bean相同的其他類。

1

不!我們無法在servlet中提供參數化的構造函數。servlet容器爲sevrlet創建對象 。容器將根據Class.forName(String classname)創建對象。我們可以使用Class.forName()創建一個對象,如果該類僅包含默認構造函數。由於容器使用Class.forName()代碼創建對象,因此我們不會將參數化構造函數編寫爲servlet的一部分。儘管如果我們想寫參數化構造函數,我們仍然調用service()方法的構造函數!