初始化() 方法

还有一些其他有用的小东西。当然,我说的是 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));
    	}
  }
}