[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>


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

时间: 2024-12-28 01:06:16

[Servlet]深入研究GenericServlet的相关文章

[Servlet]深入研究HttpServlet

HttpServlet概述 在大多数的Web应用程序中,客户端都是通过Http协议去访问服务器端的资源,而我们编写的Servlet主要是用于Http协议的请求和响应处理.为了快速开发应用于Http协议的Servlet类,Sun公司在javax.servlet.http包中提供了一个抽象类HttpServlet,它继承于GenericServlet,用于创建适合基于Http协议的Web Servlet. public abstract class HttpServlet extends Gener

Servlet的优化.GenericServlet

如何更好的使用servlet?GernericServlet可以由自己仿照一个出来,下面就是介绍了如何写这样的一个类 1.init方法 妥善的保存config对象 2.空参init方法,为了防止开发人员重写 原生init方法 3.service方法空实现=> 声明城抽象 4.destory方法空实现 5.实现getServletInfo,getServletConfig 6.实现了servletConfig接口. 接口中的方法直接调用config实现类实现. 代码实现 package ming.

servlet实现的三种方式对比(servlet 和GenericServlet和HttpServlet)

第一种: 实现Servlet 接口 第二种: 继承GenericServlet 第三种 继承HttpServlet (开发中使用) 通过查看api文档发现他们三个(servlet 和GenericServlet和HttpServlet)的关系是 Servlet是一个接口,其中含有很多方法如:init(),service(),destory()方法. GenericServlet是一个实现了Servlet接口的实现类,他可以使用Servlet中的方法. HttpServlet是GenericSer

Servlet Httpservlet Genericservlet 三者之间关系

一.Servlet分析 1.1.Servlet 源码 public abstract interface Servlet { public abstract void init(ServletConfig paramServletConfig) throws ServletException; public abstract ServletConfig getServletConfig(); public abstract void service(ServletRequest paramSer

Servlet,GenericServlet,httpServlet区别

Servlet接口:定义五个方法,其中包括三个生命周期方法 GenericServlet类:实现了Servlet定义的方法,参与了Servlet的生命周期 HttpServlet类:继承了GenericServlet,无需参与Servlet的生命周期,可以直接调用GenreicServlet的方法,并且还扩展了doGet, doPost, doDelete, doPut, doTrace等方法 使用Servlet的三种方法 Implements Servlet接口:你这个Servlet类会去实现

扩展GenericServlet实现Servlet程序 学习笔记

import java.io.IOException; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //扩展GenericServlet实现Servlet程序 public class Demo12 extends GenericServle

web开发之Servlet 一

因为最近在研究公司一套新的框架,发现这套框架的底层是对Struts2,Spring 封装后的WEB应用框架,而我发现如果仅仅是利用这个框架开发,确实很容易快速上手,做业务来说是没有问题的,但我觉得如果只对上层如何去用熟悉是不行,必须要学习其底层是如何玩的,而任何一套WEB应用框架的开发,肯定都是基于Servlet 对象中各个方法的生命周期来进行的,因此对Servlet的研究是有必要,虽然以前学过,但是很多原理都遗忘了,为此决定重新学习一下. 本人的开发工具和环境是:Myeclipse + Tom

动态页面 servlet

1.常见软件架构. C/S: 客户端 服务器  安全性较好,但是升级需要升级两端   B/S: 浏览器 服务器  安全性较差, 但是升级时 只需要升级服务器端(我们今后就是开发这个架构的) 2.资源分类:     静态资源: 无论访问多少次 内容都不会发生变化. html .css .js .     动态资源: 访问结果会发生变化. servlet,jsp . jsp就是servlet. php,asp. 3.常见服务器: tomcat 4.tomcat 会以下配置:     1.修改tomc

Servlet生命周期和工作原理

Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet: 1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码: <loadon-startup>1</loadon-startup&g