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节。