一、概念
Servlet:服务端小程序、Config(Configuration):配置信息,那也就是说ServletConfig的作用就是为我们的Servlet提供初始配置信息的一种对象。
官方一点的概念就是:
- 为Servlet提供初始配置参数的一种对象,每个Servlet都有自己独立唯一的ServletConfig对象
- 容器会为每个Servlet实例化一个ServletConfig对象,并通过Servlet生命周期的
init方法
传入给Servlet作为属性
二、分析
当我们写好配置文件后,Tomcat是可以读取到 web.xml
配置信息的,通过 <servlet-class>
Tomcat知道你这个是一个Servlet后,会对这个Servlet进行初始化,在Servlet初始化之前,它会先读取 <init-param>
,然后放到一个 ServletConfig对象
上, ServletConfig对象
是由Tomcat给我们产生的,紧接着Servlet在进行构造初始化的时候,就会将 ServletConfig对象
进行传入,这个 init(ServletConfig config)
在GenericServlet中已经重写好了,并且赋值给了其成员变量,此时我们就可以从GenericServlet中获取到config对象。
PS:每个Servlet独享一个 ServletConfig对象
。

三、使用
ServletConfig是一个接口,定义了如下API
package jakarta.servlet;
import java.util.Enumeration;
public interface ServletConfig {
String getServletName();
ServletContext getServletContext();
String getInitParameter(String var1);
Enumeration<String> getInitParameterNames();
}
抽象方法名 | 作用 |
---|---|
getServletName() | 获取 <servlet-name>HelloServlet</servlet-name> 定义的Servlet名称 |
getServletContext() | 获取ServletContext对象,在GenericServlet抽象类中进行了实现 |
getInitParameter() | 获取配置Servlet时设置的『初始化参数』,根据名字获取值 |
getInitParameterNames() | 获取所有初始化参数名组成的Enumeration对象 |
四、代码示例
1)定义Servlet
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig = getServletConfig();
// 根据参数名获取单个参数
String value = servletConfig.getInitParameter("param1");
System.out.println("param1:"+value);
// 获取所有参数名,早期的Iterator用的就是Enumeration
Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
// hasMoreElements():判断有没有下一个参数,如果有返回True,如果没有返回False
while (parameterNames.hasMoreElements()) {
// nextElement():1、取出元素;2、向下移动游标
String paramaterName = parameterNames.nextElement();
System.out.println(paramaterName+":"+servletConfig.getInitParameter(paramaterName));
}
}
}
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletConfig servletConfig = this.getServletConfig();
// 根据参数名获取单个参数
String value = servletConfig.getInitParameter("param1");
System.out.println("param1:"+value);
// 获取所有参数名
Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
// 迭代并获取参数名
while (parameterNames.hasMoreElements()) {
String paramaterName = parameterNames.nextElement();
System.out.println(paramaterName+":"+servletConfig.getInitParameter(paramaterName));
}
}
}
2)web.xml
方式配置Servlet
<servlet>
<servlet-name>ServletA</servlet-name>
<servlet-class>com.atguigu.servlet.ServletA</servlet-class>
<!--配置ServletA的初始参数,可以写多个键值对,这多个键值对都可以被Tomcat所读取到,然后以ServletConfig对象的形式进行一个转换-->
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>value2</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>ServletB</servlet-name>
<servlet-class>com.atguigu.servlet.ServletB</servlet-class>
<!--配置ServletB的初始参数-->
<init-param>
<param-name>param3</param-name>
<param-value>value3</param-value>
</init-param>
<init-param>
<param-name>param4</param-name>
<param-value>value4</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ServletA</servlet-name>
<url-pattern>/servletA</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ServletB</servlet-name>
<url-pattern>/servletB</url-pattern>
</servlet-mapping>
3)注解方式配置Servlet
@WebServlet(
urlPatterns = "/userServlet1",
// @WebInitParam又是一个注解,initParams的值通过查看源码可知,接收的是一个WebInitParam注解数组
initParams = {@WebInitParam(name = "param1",value = "value1"), @WebInitParam(name = "param2",value = "value2")}
)
public class UserServlet extends HttpServlet {