本文共 2755 字,大约阅读时间需要 9 分钟。
本节书摘来自异步社区《Servlet、JSP和Spring MVC初学指南》一书中的第1章,第1.8节,作者:【加】Budi Kurniawan(克尼亚万) , 【美】Paul Deck著,更多章节内容可以访问云栖社区“异步社区”公众号查看
前面的例子中展示了如何通过实现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提供了第二个init方法,它不带参数。这个方法是在ServletConfig被赋给servletConfig后,由第一个init方法调用:
public void init(ServletConfig servletConfig)
throws ServletException {this.servletConfig = servletConfig;this.init();
}
这`
意味着,可以通过覆盖没有参数的init方法来编写初始化代码,ServletConfig则仍然由GenericServlet实例保存。 清单1.3中的GenericServletDemoServlet类是对清单1.2中ServletConfigDemoServlet类的改写。注意,这个新的Servlet扩展了GenericServlet,而不是实现Servlet。
清单1.3 GenericServletDemoServlet类
package app01a;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("" + "Admin:" + admin + "Email:" + email + ""); }}
可见,通过扩展GenericServlet,就不需要覆盖没有计划改变的方法。因此,代码变得更加整洁。在清单 1.3 中,唯一被覆盖的方法是 Service 方法。而且,不必亲自保存ServletConfig。
利用下面这个URL调用Servlet,其结果应该与ServletConfigDemoServlet相似:
http://localhost:8080/app01a/generic
转载地址:http://hoxba.baihongyu.com/