返回介绍

C.8 GenericServlet

发布于 2025-04-22 20:10:07 字数 3034 浏览 0 评论 0 收藏

前面的例子展示了如何通过实现 Servlet 接口来编写 Servlet。但你注意到没有?它们必须给 Servlet 中的所有方法都提供实现,即便其中有一些实现压根就没有包含任何代码。此外,还需要将 ServletConfig 对象保存到类级变量中。

值得庆幸的是,GenericServlet 抽象类出现了。本着面向对象编程的尽可能使代码简单的原则,GenericServlet 实现了 Servlet 和 ServletConfig,并完成以下任务:

  • 将 init 方法中的 ServletConfig 赋给一个类级变量,以便可以通过调用 getServletConfig 获取。

  • 为 Servlet 接口中的所有方法提供默认的实现。

  • 提供方法,包围 ServletConfig 中的方法。

GenericServlet 通过将 ServletConfig 赋给 init 方法中的类级变量 servletConfig,来保存 ServletConfig。下面就是 GenericServlet 中的 init 实现。

public void init(ServletConfig servletConfig)
    throws ServletException {
  this.servletConfig = servletConfig;
  this.init();
}

但是,如果在类中覆盖了这个方法,就会调用 Servlet 中的 init 方法,并且还必须调用 super.init(servletConfig) 来保存 ServletConfig。为了避免上述麻烦,GenericServlet 提供了第 2 个 init 方法,它不带参数。这个方法是在 ServletConfig 被赋给 servletConfig 后,由第 1 个 init 方法调用。

public void init(ServletConfig servletConfig)
    throws ServletException {
  this.servletConfig = servletConfig;
  this.init();
}

这意味着,可以通过覆盖没有参数的 init 方法来编写初始化代码,ServletConfig 则仍然由 GenericServlet 实例保存。

清单 C.3 中的 GenericServletDemoServlet 类是对清单 C.2 中 ServletConfigDemoServlet 类的改写。注意,这个新的 Servlet 扩展了 GenericServlet,而不是实现 Servlet。

清单 C.3 GenericServletDemoServlet 类

package servletapi1;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;

@WebServlet(name = "GenericServletDemoServlet",
    urlPatterns = { "/generic" },
    initParams = {
      @WebInitParam(name="admin", value="Harry Taciak"),
      @WebInitParam(name="email", value="admin@example.com")
    }
)
public class GenericServletDemoServlet extends GenericServlet {

  private static final long serialVersionUID = 62500890L;

  @Override
  public void service(ServletRequest request,
      ServletResponse response)
      throws ServletException, IOException {
    ServletConfig servletConfig = getServletConfig();
    String admin = servletConfig.getInitParameter("admin");
    String email = servletConfig.getInitParameter("email");
    response.setContentType("text/html");
    PrintWriter writer = response.getWriter();
    writer.print("<!DOCTYPE html>"
        + "<html><head></head><body>"
        + "Admin:" + admin
        + "<br/>Email:" + email
        + "</body></html>");
  }
}

可见,通过扩展 GenericServlet,就不需要覆盖那些不打算改变的方法。因此,代码变得更加整洁。在清单 C.3 中,唯一被覆盖的方法是 Service 方法。而且,不必亲自保存 ServletConfig。

用下面这个 URL 调用 Servlet,其结果应该与 ServletConfigDemoServlet 相似。

http://localhost:8080/servletapi1/generic

即使 GenericServlet 是对 Servlet 一个很好的加强,但它也不常用,因为它毕竟不像 HttpServlet 那么高级。HttpServlet 才是主角,在现实的应用程序中广泛使用。关于它的详情,请查阅 C.9 节。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。