一、ServletConfig 类
1、ServletConfig 类介绍
ServletConfig 类从类名上来看, 就知道是 Servlet 程序的配置信息类。
Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建, 我们负责使用。
Servlet 程序默认是第一次访问的时候创建, ServletConfig 是每个 Servlet 程序创建时, 就创建一个对应的 ServletConfig 对象。
2、ServletConfig 方法列表
该接口提供了四个抽象方法:
public String getServletName(); 获取Servlet的别名
public String getInitParameter(String name); 根据name获取初始化参数
public Enumeration<String> getInitParameterNames(); 获取所有的初始化参数
public ServletContext getServletContext(); 获取 ServletContext 对象
二、GenericServlet 与 ServletConfig
1、GenericServlet 实现 Servletconfig
2、代码剖析
在 GenericServlet 抽象类中有一个 ServletConfig 类型的成员变量:
private transient ServletConfig config;
在 init(ServletConfig) 方法中,给该成员变量赋值:
1 public void init(ServletConfig config) throws ServletException {
2 this.config = config;
3 this.init();
4 }
GenericServlet 同时继承了 Servlet 和 ServletConfig 两个接口,并重写了其中的方法,
并且巧妙的把 ServletConfig 对象通过 getServletConfig() 方法返回了。
四、ServletConfig 类的三大作用
1、三大作用
(1)可以获取 Servlet 程序的别名 servlet-name 的值;
(2)获取初始化参数 init-param
(3)获取 ServletContext 对象
2、案例
创建一个 Servlet 程序继承 HttpServlet :
public class HelloServlet4 extends HttpServlet
在 web.xml 中配置对应的信息:
1 <!-- servlet 标签给 Tomcat 配置 Servlet 程序 -->
2 <servlet>
3 <!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
4 <servlet-name>HelloServlet4_config</servlet-name>
5 <!--servlet-class 是 Servlet 程序的全类名-->
6 <servlet-class>com.njf.java.HelloServlet4</servlet-class>
7 <!--init-param 是初始化参数,可以设置多个键值对-->
8 <init-param>
9 <!--是参数名-->
10 <param-name>username</param-name>
11 <!--是参数值-->
12 <param-value>root</param-value>
13 </init-param>
14 <init-param>
15 <param-name>password</param-name>
16 <param-value>123456</param-value>
17 </init-param>
18 </servlet>
19
20 <!--servlet-mapping 标签给 servlet 程序配置访问地址-->
21 <servlet-mapping>
22 <!--servlet-name 标签的作用是告诉服务器, 我当前配置的地址给哪个 Servlet 程序使用-->
23 <servlet-name>HelloServlet4_config</servlet-name>
24 <!--
25 url-pattern 标签配置访问地址
26 / 斜杠在服务器解析的时候, 表示地址为: http://ip:port/工程路径
27 /hello 表示地址为: http://ip:port/工程路径/hello
28 -->
29 <url-pattern>/hello4</url-pattern>
30 </servlet-mapping>
init-param 是Servlet的初始化参数,类似于Map的键值对结构,可以设置多对。
使用 ServletConfig 获取信息:
1 @Override
2 public void init(ServletConfig config) throws ServletException {
3
4 //1.获取 ServletConfig 对象
5 System.out.println("config = " + config);
6
7 //2.可以获取 Servlet 程序的别名 servlet-name 的值
8 String servletName = config.getServletName();
9 System.out.println("HelloServlet4的别名是 = " + servletName);
10
11 //3. 获取初始化参数 init-param
12 String username = config.getInitParameter("username");
13 System.out.println("初始化参数username = " + username);
14 String password = config.getInitParameter("password");
15 System.out.println("初始化参数password = " + password);
16
17 Enumeration<String> initParameterNames = config.getInitParameterNames();
18 while (initParameterNames.hasMoreElements()) {
19 String key = initParameterNames.nextElement();
20 System.out.println("key = " + key); //获取key
21 System.out.println(key + "=" + config.getInitParameter(key));//根据key获取值
22 }
23
24 //3.获取 ServletContext 对象
25 ServletContext servletContext = config.getServletContext();
26 System.out.println("servletContext = " + servletContext);
27 }
运行结果:
通过 ServletConfig 对象可以在 init() 方法中获取上面的三项信息。
我们把同样的代码放到 get()或 post() 方法中再测试一下:
1 @Override
2 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
3
4 ServletConfig config = getServletConfig();
5
6 //1.获取 ServletConfig 对象
7 System.out.println("config = " + config);
8
9 //2.可以获取 Servlet 程序的别名 servlet-name 的值
10 String servletName = config.getServletName();
11 System.out.println("HelloServlet4的别名是 = " + servletName);
12
13 //3. 获取初始化参数 init-param
14 String username = config.getInitParameter("username");
15 System.out.println("初始化参数username = " + username);
16 String password = config.getInitParameter("password");
17 System.out.println("初始化参数password = " + password);
18
19 Enumeration<String> initParameterNames = config.getInitParameterNames();
20 while (initParameterNames.hasMoreElements()) {
21 String key = initParameterNames.nextElement();
22 System.out.println("key = " + key); //获取key
23 System.out.println(key + "=" + config.getInitParameter(key));
24 }
25
26 //3.获取 ServletContext 对象
27 ServletContext servletContext = config.getServletContext();
28 System.out.println("servletContext = " + servletContext);
29 }
运行结果:
对于上面的 init() 方法是可以获取的,为什么get() 方法就无法获取到 ServletConfig 对象呢?
这是因为我们在自己的 servlet 中重写了 init(config) 方法,从而会把 GenericServlet 中的 init() 方法覆盖掉,这样就导致了一个问题,使得 GenericServlet 中的 config 属性为 null。
从而在调用 getServletConfig() 方法时获取了一个null的 ServletConfig() 对象。
避免:当我们在自定义的 Servlet 程序中重写了 init() 方法一定要调用父类(GenericServlet类)的 init(ServletConfig) 方法。
在 init(ServletConfig) 方法加上 super.init(config),再次测试:
运行结果:
这样就可以在 init 方法和 get 方法中获取到信息了,并且发现获取的是同一个servletConfig 对象,所以一个 ServletConfig 和一个 Servlet 是一一对应的,一个ServletConfig 只能获取该对应 Servlet 的配置信息。