- 内容提要
- 作者简介
- 译者简介
- 前言
- HTTP
- Servlet 和 JSP
- 下载 Spring 或使用 STS 与 Maven/Gradle
- 手动下载 Spring
- 使用 STS 和 Maven/Gradle
- 下载 Spring 源码
- 本书内容简介
- 下载示例应用
- 第 1 章Spring 框架
- 第 2 章模型 2 和 MVC 模式
- 第 3 章Spring MVC 介绍
- 第 4 章基于注解的控制器
- 第 5 章数据绑定和表单标签库
- 第 6 章转换器和格式化
- 第 7 章验证器
- 第 8 章表达式语言
- 第 9 章JSTL
- 第 10 章国际化
- 第 11 章上传文件
- 第 12 章下载文件
- 第 13 章应用测试
- 附录 A Tomcat
- 附录 B Spring Tool Suite 和 Maven
- 附录 C Servlet
- 附录 D JavaServer Pages
- 附录 E 部署描述符
C.8 GenericServlet
前面的例子展示了如何通过实现 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 节。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论