初始化() 方法

還有一些其他有用的小東西。當然,我說的是 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));
    	}
  }
}