• [Servlet]深入研究GenericServlet


    GenericServlet概述

    如果我们直接通过实现Servlet接口来编写一个Servlet类,就需要实现Servlet接口定义的5种方法,为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类GenericServlet,该类提供了除service()方法外的其他4种方法的简单实现。GenericServlet类定义了一个通用的、不依赖于具体协议的Servlet,它实现了Servlet接口和ServletConfig接口。

    public abstract class GenericServlet implements Servlet, ServletConfig

    下列表中罗列了GenericServlet的所有方法:

    Method Summary
    void destroy()
    ServletConfig getServletConfig()
    ServletContext getServletContext()
    void init()
    void init(ServletConfig config)
    abstract void service(ServletRequest req, ServletResponse res)

    重写的init()方法

    如果我们要自定义一个通用的Servlet,只需要从GenericServlet类继承,并实现其中的抽象方法service()方法。

    在GenericServlet类中,提供了两种重载的init()方法:

    • public void init(ServletConfig config) throws ServletException
    • public void init() throws ServletException

    第一种init()方法是Servlet接口中init()方法的实现。在这种方法中,首先将ServletConfig对象保存在一个transient实例变量中,然后调用第二种不带参数的init()方法。

    通常我们在编写继承于GenericServlet的自定义Serlvet时,只需要重写第二中不带参数的init()方法就可以了。

    ServletConfig对象

    在javax.servlet包中,定义了ServletConfig接口。Servlet容器使用ServletConfig对象在Servlet初始化时向其传递配置信息。

    所谓的Serlvet配置信息,就是在Web应用程序中web.xml文件中配置有关Servlet的内容。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
      <servlet>
        <description>This is the description of my J2EE component</description>
        <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>app.java.servlet.FirstServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet/FirstServlet</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

    要想从ServletConfig对象获取有关Servlet的配置信息,首先需要获得ServletConfig对象,方式有以下几种:

    • 通过继承GenericServlet,并重写init(ServletConfig config)方法来获取ServletConfig对象。
    public class ConfigServlet extends GenericServlet {
        private ServletConfig config;
    
        @Override
        public void init(ServletConfig config) throws ServletException {
            this.config = config;
        }
    
        @Override
        public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
        }
    }
    
    • 通过继承GenericServlet,并调用getServletConfig()方法来获取ServletConfig对象。
    ServletConfig servletConfig = getServletConfig();

    ServletConfig接口提供了以下方法供使用:

    Method Summary
    String getInitParameter(String name)
    Enumeration getInitParameterNames()
    ServletContext getServletContext()
    String getServletName()

    下面我们一一来讨论上述方法的作用:

    • getServletName()方法:获取web.xml文件中配置的Servlet名称。
      <servlet>
        <servlet-name>ConfigServlet</servlet-name>
        <servlet-class>app.java.servlet.ConfigServlet</servlet-class>
      </servlet>
    

    我们通过获取到的ServletConfig对象调用getServletName()方法来验证。

    public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
    
        String servletName = servletConfig.getServletName();
        System.out.println(servletName);
    }
    

    运行Web应用程序,在控制台中打印“ConfigServlet”。

    • getInitParameter(String name)方法:返回指定名称的初始化参数的值,如果参数不存在则返回null值。

    首先,我们需要在web.xml文件中有关Servlet配置信息中,增加初始化参数的内容。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <servlet>
        <servlet-name>ConfigServlet</servlet-name>
        <servlet-class>app.java.servlet.ConfigServlet</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>jyl</param-value>
        </init-param>
        <init-param>
            <param-name>blog</param-name>
            <param-value>http://www.longestory.com</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>ConfigServlet</servlet-name>
        <url-pattern>/servlet/ConfigServlet</url-pattern>
      </servlet-mapping>
    </web-app>
    

    然后,我们在自定义Servlet的service()方法中获取对应初始化参数。

    public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
    
        String name = servletConfig.getInitParameter("name");
        String blog = servletConfig.getInitParameter("blog");
        System.out.println(name + "'s blog is " + blog);
    }
    

    运行Web应用程序,在控制台中打印“jyl’s blog is http://www.longestory.com”。

    • getInitParameterNames()方法:返回Servlet配置的所有初始化参数名称的枚举集合。
      • Enumeration是Iterator的前身,用法与Iterator一致。
    public void service(ServletRequest req, ServletResponse res)
                throws ServletException, IOException {
        ServletConfig servletConfig = getServletConfig();
    
        Enumeration enumeration = servletConfig.getInitParameterNames();
        while (enumeration.hasMoreElements()) {
            String element = (String) enumeration.nextElement();
            String value = servletConfig.getInitParameter(element);
            System.out.println(element + ": " + value);
        }
    }
    

    运行Web应用程序,在控制台中打印:

    name: jyl
    blog: http://www.longestory.com
    
    • getServletContext()方法:返回一个ServletContext对象,后面具体学习。

    ServletConfig有哪些实际作用呢?在struts 1 框架中就运行了ServletConfig内容。

    <!-- Standard Action Servlet Configuration (with debugging) -->
    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>
              /WEB-INF/struts-config.xml,
              /WEB-INF/struts-config-Wildcard.xml
           </param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <!-- Standard Action Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    

    转载说明:请注明作者及原文链接,谢谢!

  • 相关阅读:
    luogu P1064|| 01背包||金明的预算
    NOIp蒟蒻的爆零记——HA-0132
    模板输入计划
    1112测试教你做人
    NOIP注意事项
    强连通分量的一二三 | | JZOJ【P1232】 | | 我也不知道我写的什么
    图的割点 | | jzoj【P1230】 | | gdoi | |备用交换机
    【游戏作品】Sunset Game 制作组出品游戏一览
    【说明】我们计划从博客园迁移到知乎啦
    【总结】操作系统的重点
  • 原文地址:https://www.cnblogs.com/longestory/p/4566968.html
Copyright © 2020-2023  润新知