一、ServletConfig接口详解
1、简介
Servlet 容器初始化 Servlet 时,会为这个 Servlet 创建一个 ServletConfig 对象,并将 ServletConfig 对象作为参数传递给 Servlet 。通过 ServletConfig 对象即可获得当前 Servlet 的初始化参数信息。一个 Web 应用中可以存在多个 ServletConfig 对象,但一个 Servlet 只能对应一个 ServletConfig 对象,即 Servlet 的初始化参数仅对当前 Servlet 有效。
2、ServletConfig 接口
jakarta.servlet 包提供了一个 ServletConfig 接口,该接口中提供了以下方法:
返回值类型 | 方法 | 描述 |
---|---|---|
String | getServletName() | 返回 Servlet 的名字,即 web.xml 中 <servlet-name> 元素的值。 |
ServletContext | getServletContext() | 返回一个代表当前 Web 应用的 ServletContext 对象。 |
String | getInitParameter(String name) | 根据初始化参数名 name,返回对应的初始化参数值。 |
Enumeration<String> | getInitParameterNames() | 返回 Servlet 所有的初始化参数名的枚举集合。如果该 Servlet 没有初始化参数,则返回一个空的集合。 |
3、获取 ServletConfig 对象
获取 ServletConfig 对象一般有 2 种方式:
1)从带参的 init() 方法中获取
public class ServletConfigDemo extends HttpServlet {
private static final long serialVersionUID = 1562778022508275850L;
private ServletConfig servletConfig;
@Override
public void init(ServletConfig config) throws ServletException {
// 从带参的init()方法中,获取ServletConfig对象
this.servletConfig = config;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(this.servletConfig.getServletName());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2)调用 GenericServlet 提供的 getServletConfig() 方法获取
// 通过 GenericServlet 提供的 getServletConfig 方法获得 ServletConfig 对象
ServletConfig servletConfig = this.getServletConfig();
4、配置 Servlet 初始化参数
配置 Servlet 的初始化参数有 2 种方式:
- 在 web.xml 中配置初始化参数;
- 在 @WebServlet 注解中配置初始化参数;
1)在 web.xml 中配置初始化参数
在 web.xml 中可以使用一个或多个 <init-param> 元素为 Servlet 配置初始化参数,代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://jakarta.ee/xml/ns/jakartaee"
xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="5.0">
<display-name>servletDemo</display-name>
<servlet>
<servlet-name>ServletConfigDemo</servlet-name>
<servlet-class>com.hoperun.www.ServletConfigDemo</servlet-class>
<!-- Servlet 初始化参数 -->
<init-param>
<param-name>name</param-name>
<param-value>CSDN</param-value>
</init-param>
<init-param>
<param-name>URL</param-name>
<param-value>https://www.csdn.net</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletConfigDemo</servlet-name>
<url-pattern>/ServletConfigDemo</url-pattern>
</servlet-mapping>
</web-app>
以上配置说明如下:
- <init-param> 元素是 <servlet> 的子元素,需要在 <servlet> 元素内使用,表示只对当前 Servlet 有效;
- <param-name> 子元素:表示参数的名称;
- <param-value> 子元素:表示参数的值;
2)在 @WebServlet 注解中配置初始化参数
通过 @WebServlet 注解的 initParams 属性也可以为 Servlet 设置初始化参数,代码如下:
@WebServlet(urlPatterns = { "/MyServlet" }, initParams = { @WebInitParam(name = "name", value = "CSDN"),
@WebInitParam(name = "URL", value = "www.csdn.net") })
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
5、示例
下面我们通过一个示例演示如何通过 ServletConfig 对象读取 Servlet 的初始化参数。
package com.hoperun.www;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebInitParam;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns = "/ReadServletConfigParam", initParams = { @WebInitParam(name = "name", value = "CSDN"),
@WebInitParam(name = "URL", value = "www.csdn.net") })
public class ReadServletConfigParam extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
// 获取ServletConfig对象
ServletConfig config = getServletConfig();
// 获取ServletName
String servletName = config.getServletName();
writer.write("ServletName: " + servletName + "<br/>");
// 返回 Servlet 的初始化参数的名称的集合
Enumeration<String> initParameterNames = config.getInitParameterNames();
// 遍历集合获取初始化参数名称
while (initParameterNames.hasMoreElements()) {
// 获取初始化参数名称
String initParamName = initParameterNames.nextElement();
// 获取相应的初始参数的值
String initParamValue = config.getInitParameter(initParamName);
// 向页面输出
writer.write(initParamName + " : " + initParamValue + "<br/>");
}
// 关闭流
writer.close();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
启动 Tomcat 服务器,在地址栏输入 http://localhost:8080/servletDemo/ReadServletConfigParam,访问 ReadServletConfigParam,结果如下图: