ServletConfig
ServletConfig
CAMELLIA10. ServletConfig
10.1 ServletConfig 是什么?
- 包名:
jakarta.servlet.ServletConfig
- 角色:Servlet 规范的一部分。
- 类型:一个接口。
- 注释:
jakarta.servlet.Servlet
也是一个接口。
10.2 谁实现了这个接口?
- 实现者:由 Web 服务器实现。
- 示例:Tomcat 通过
org.apache.catalina.core.StandardWrapperFacade implements ServletConfig
。 - 考虑:不同的 Web 服务器(例如 Jetty)可能有不同的类和包名,但它们都实现了
ServletConfig
。
10.3 与 Servlet 的关系
- 关联:每个
Servlet
对象都有一个对应的ServletConfig
对象。 - 一对一:一个
Servlet
对应一个ServletConfig
,100 个Servlet
对象会有 100 个ServletConfig
对象。
10.4 ServletConfig 对象的创建
- 创建者:由 Web 服务器(如 Tomcat)创建。
- 时间点:在创建
Servlet
对象的同时创建ServletConfig
对象。
10.5 ServletConfig 的用途
- 含义:
Config
是 Configuration(配置)的缩写。 - 角色:作为
Servlet
对象的配置信息对象(.xml
)。
10.6 ServletConfig 中包含的信息
包装了web.xml
文件中的 <servlet>
标签。
- 示例:
1
2
3
4<servlet>
<servlet-name>configServlet</servlet-name>
<servlet-class>servlet.ConfigTestServlet</servlet-class>
</servlet> - 封装:Web 服务器(如 Tomcat)解析
web.xml
文件,并将<servlet>
标签中的配置信息封装到ServletConfig
对象中。
10.7 ServletConfig 接口中的方法
修饰符和类型 | 方法 | 描述 |
---|---|---|
java.lang.String |
getInitParameter(java.lang.String name) |
返回包含命名初始化参数的值的 String ,如果参数不存在则返回 null 。 |
java.util.Enumeration<java.lang.String> |
getInitParameterNames() |
返回包含 servlet 初始化参数名称的 Enumeration 对象,如果 servlet 没有初始化参数则返回空 Enumeration 。 |
ServletContext |
getServletContext() |
返回 ServletContext ,引用当前正在执行的 servlet 上下文。 |
java.lang.String |
getServletName() |
返回此 servlet 实例的名称。 |
10.7.1 配置Servlet对象的初始化信息
在
<servlet></servlet>
可以配置Servlet对象的初始化信息
- 示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<servlet>
<servlet-name>configServlet</servlet-name>
<servlet-class>servlet.ConfigTestServlet</servlet-class>
<!--这里是可以配置一个Servlet对象的初始化信息的。-->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.cj.jdbc.Driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/bjpowernode</param-value>
</init-param>
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>root1234</param-value>
</init-param>
<!--以上<servlet></servlet>标签中的<init-param></init-param>是初始化参数。-->
</servlet> - 这些初始化参数信息会自动被 Web 服务器封装到
ServletConfig
对象中。
10.7.2 ServletConfig中的getInitParameterNames()
和getInitParameter()
方法
getServletName()
返回当前 Servlet 实例的名称。getInitParameterNames()
方法返回一个Enumeration<String>
对象,该对象包含当前 Servlet 的所有初始化参数的名称。如果 Servlet 没有初始化参数,则返回一个空的Enumeration
。这个方法通常用于遍历所有初始化参数名称,以便进一步处理它们的值。getInitParameter(String name)
方法返回指定名称的初始化参数的值。如果参数不存在,则返回null
。这个方法通常用于获取特定初始化参数的值。getServletContext()
返回当前 Servlet 实例正在执行的 ServletContext 对象的引用。ServletContext 提供了与 Web 应用程序环境交互的方法,如获取资源、设置和获取属性等。示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28public class ConfigTestServlet extends GenericServlet {
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
// 获取ServletConfig对象
ServletConfig config = this.getServletConfig();
// 输出该对象
out.println("ServletConfig对象是:"+config);
//ServletConfig对象是:org.apache.catalina.core.StandardWrapperFacade@3cdfe47
//获取<servlet-name></servlet-name>
String servletName = config.getServletName();
out.println("<br>"+servletName);
// 通过ServletConfig对象的两个方法,可以获取到web.xml文件中的初始化参数配置信息。
Enumeration<String> initParameterNames = config.getInitParameterNames();
//遍历集合
while (initParameterNames.hasMoreElements()){
String initParameterName = initParameterNames.nextElement();
String initParameter = config.getInitParameter(initParameterName);
out.println("<br>"+initParameterName+" = "+initParameter);
}
//通过ServletConfig对象获取ServletContext对象。
ServletContext application = config.getServletContext();
out.println("<br>"+application);
}
}
10.7.3 注意事项
[!NOTE]
分析GenericServlet源码可以知道我们根本不必获取ServletConfig对象,因为GenericServlet有提供。
1 | //在init被赋值 |
- 10.7.2示例代码改写:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18public class ConfigTestServlet3 extends GenericServlet {
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.println("ServletConfig对象:"+this.getServletConfig());
out.println("<br> ServletConfig对象名称:"+this.getServletName());
Enumeration<String> initParameterNames = this.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String initParameterName = initParameterNames.nextElement();
String initParameter = this.getInitParameter(initParameterName);
out.println("<br>"+initParameterName+" = "+initParameter);
}
ServletContext application1 = this.getServletContext();
out.println("<br>"+application1);
}
}