回答
號
的Servlet實例由容器,通過反射創建的,他們希望找到一個公共的無參數的構造函數(默認構造函數)。
要配置您的servlet,請使用web.xml文件中指定的servlet參數。這些傳遞給你的servlet的方法init()
。
雖然這將是可能一個servlet容器選擇一個非默認的構造函數,並強制對字符串進行簡單的類型和反思調用構造函數,這不是什麼Servlet規範要求。
部分原因可能是歷史的;早在依賴注入系統廣泛實踐這種替代方法之前,Servlet就已經被首先指定了。但是,這樣的構造者會相當有限;傳遞可以從web.xml中指定的簡單字符串創建的參數是可行的,但更有用的對象— a DataSource
(例如—)會很尷尬。
儘管在servlet中有最終的成員變量會很好。
以前稱爲「WebBeans」(JSR 299,我認爲)的JSR將爲Servlet中的依賴注入支持提供一些標準。這可能解決目前方法中的一些缺點。
由於servlet由容器實例化,所以它們需要一個無參數的構造函數。
此外,容器可能會重新使用servlet,並且不會在重用時調用構造函數。
您需要通過<servlet-param>
來初始化變量,或者使用像Spring這樣的框架,它可以讓您將Servlet委託給與其他bean相同的其他類。
不!我們無法在servlet中提供參數化的構造函數。servlet容器爲sevrlet創建對象 。容器將根據Class.forName(String classname)
創建對象。我們可以使用Class.forName()
創建一個對象,如果該類僅包含默認構造函數。由於容器使用Class.forName()
代碼創建對象,因此我們不會將參數化構造函數編寫爲servlet的一部分。儘管如果我們想寫參數化構造函數,我們仍然調用service()
方法的構造函數!
但爲什麼期望默認的構造函數?我們也可以使用反射調用參數化的構造函數。 – 2009-06-03 16:48:06