JavaWeb 之 ServletConfig 接口

一、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 的配置信息

原文地址:https://www.cnblogs.com/niujifei/p/15107854.html