zoukankan      html  css  js  c++  java
  • [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>
    

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

  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/longestory/p/4566968.html
Copyright © 2011-2022 走看看