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

  • 相关阅读:
    SPI通信协议(SPI总线)学习
    编译内核提示mkimage command not found – U-Boot images will not be built
    Ubuntu samba服务搭建
    Ubuntu telnet服务搭建
    嵌入式 PPPD工具实现3G拨号实践以及工具PPPD和CHAT详解摘录
    helloworld模块
    shell脚本文件判断
    git入门教程
    ILI9341支持32*32点阵英文字符(stm32)
    tft英文8*32尺寸字符库
  • 原文地址:https://www.cnblogs.com/niujifei/p/15107854.html
Copyright © 2020-2023  润新知