初始化() 方法
還有一些其他有用的小東西。當然,我說的是 servlet 初始化。如您所知,在 Web 服務器創建 servlet 對象並將其放入容器後,它會調用 servlet 的init()方法。您可以覆蓋此方法並初始化其中需要的任何內容。
為什麼不使用構造函數?
因為創建 servlet 的過程是這樣的:
- 我們創建一個繼承自的對象HTTPServlet
- 創建對象Servlet上下文, 添加它的 servlet 變量
- 創建對象Servlet配置, 添加它的 servlet 變量
- ……
- Web 服務器將 servlet 附加到容器
- 調用init()方法
在您的 servlet 的構造函數中,它的許多內部變量仍未初始化。容器對您的 servlet 一無所知,您的 servlet 對其上下文一無所知。我認為這裡一切都很清楚。
讓我們編寫一個 servlet,它在初始化時找到一個帶有設置的屬性文件:
public class PropertiesServlet extends HttpServlet {
public init() {
try (InputStream input = new FileInputStream("c:/path/to/config.properties")) {
Properties prop = new Properties();
prop.load(input);
String databaseURL = prop.getProperty("db.url");
String databaseUser = prop.getProperty("db.user ");
String databasePassword = prop.getProperty("db.password");
}
}
}
這裡我們創建一個對象特性並將config.properties文件中的數據加載到其中。嗯,以後可以脫離對象了特性各種選項,例如訪問數據庫的數據,例如。
如何正確加載屬性文件
順便問一下,如果您的 servlet 沒有在您的計算機上運行怎麼辦?
假設他們在這裡寫了它,它在世界另一個地方某處的服務器上運行。或者多台服務器。在這種情況下如何正確加載屬性文件?
好問題。通常,servlet 在運行時只知道它的屬性文件的相對路徑,而不知道它的絕對路徑,因為 servlet war 文件可以存放在任何地方。
所以,我們需要找出我們的 servlet 存儲的路徑(servlet 已經初始化)並添加一個相對路徑到它:)
它看起來像這樣:
String path = absoluteServletParh + "relative path";
而且,一如既往,這樣一項基本任務往往有自己的小“但是”。您的 servlet 及其屬性文件存儲在存檔中 :) 當然,不一定,但它確實發生了。屬性文件通常存儲在 jar 或 war 文件中。
也就是說,您的文件在磁盤上可能沒有物理路徑。但是由於容器能夠加載您的 servlet,它很可能也能夠加載您的屬性文件。
為此,您需要獲取類加載器對象(類加載器) 並要求他上傳您的文件。這是它的樣子:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");
Properties prop = new Properties();
prop.load(stream);
getConfig() 方法
順便說一句,並非所有參數都可以在屬性文件中傳遞給 servlet。例如,您的 servlet 與分佈式 Web 應用程序中的其他 servlet 進行通信。
然後您需要確保容器在調用其init()方法時將所有必要的信息傳遞給您的 servlet 。而且,他就是這樣做的。
您的 servlet(記住它是從HttpServlet類繼承的)有一個getServletConfig()方法。它返回一個對象Servlet配置,由容器創建和初始化。該對象具有以下方法:
getInitParameterNames() | 返回 servlet 參數名稱的列表 |
getInitParameter(字符串名稱) | 按名稱返回 servlet 參數 |
getServletName() | 返回 servlet 自己的名字 |
getServletContext() | 返回一個對象Servlet上下文 |
讓我們編寫一個 servlet,它從Servlet配置'A。將它們放在那裡將通過 web.xml 文件:
<web-app>
<servlet>
<servlet-name>Print-Servlet</servlet-name>
<servlet-class>PrintServlet</servlet-class>
<init-param>
<param-name>jdbc-driver</param-name>
<param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Print-Servlet</servlet-name>
<url-pattern>/print</url-pattern>
</servlet-mapping>
</web-app>
servlet 可以使用以下代碼獲取其參數:
public class PrintServlet extends HttpServlet {
public void init() {
ServletConfig config = this.getServletConfig();
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String key = initParameterNames.nextElement();
System.out.println("%s: %s\n", key, config.getInitParameter(key));
}
}
}
GO TO FULL VERSION