1.8 GenericServlet抽象类
1.8 GenericServlet
通过实现Servlet接口方式来编写Servlet,你必须实现Servlet接口之中的所有方法,即便其中有一些方法是根本就没有包含任何代码的空方法。此外,还需要将ServletConfig对象保存到类级变量中。值得庆幸的是**GenericServlet抽象类的出现。本着尽可能使代码简单的原则,GenericServlet实现了Servlet和ServletConfig接口**,并完成以下任务:
-将init方法中的ServletConfig赋给一个类级变量,以便可以通过调用getServletConfig获取。
-为Servlet接口中的所有方法提供默认的实现。
-提供方法,包围ServletConfig中的方法。
GenericServlet通过将ServletConfig赋给init方法中的servletConfig这个类级变量,来保存ServletConfig。下面就是GenericServlet中的init实现:
1 | public void init(ServletConfig servletConfig) |
Servlet中的init方法,并且还必须调用super.init(servletConfig)来保存ServletConfig。为了避免上述麻烦,**GenericServlet提供了第二个init方法**,它不带参数。这个方法是在ServletConfig被赋给servletConfig后,由第一个init方法调用:
1 | public void init(ServletConfig servletConfig) |
这意味着,可以通过覆盖没有参数的init方法来编写初始化代码,ServletConfig则仍然由GenericServlet实例保存。下面的GenericServletDemoServlet类是对之前的ServletConfigDemoServlet类的改写。注意,这个新的Servlet扩展(继承)了GenericServlet,而不是实现Servlet。
实例
1 | package app01a; |
可见,通过扩展(继承)GenericServlet方式编写的Servlet,不需要覆盖那些没计划要改变的方法。因此,代码变得更加整洁。在上述代码中,唯一被覆盖的方法是service方法。而且不必手动保存ServletConfig。 利用下面这个URL调用Servlet,其结果应该与 ServletConfigDemoServlet相似:
http://localhost:8080/Hello/generic
即使GenericServlet是对Servlet一个很好的加强,但它也不常用,因为它毕竟不像HttpServlet那么高级。**HttpServlet才是主角,在现实的应用程序中被广泛使用**。关于它的详情,请查阅1.9节。