初始化() 方法
还有一些其他有用的小东西。当然,我说的是 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