一、Servlet API
1、Servlet 接口
Servlet API 的核心是 javax.servlet.Servlet 接口,所有的 Servlet 类都必须实现这一接口。 Servlet接口的相关方法在 **Servlet(一)**中已经介绍过了,这里不再讲解。
在 Servlet API 中,javax.servlet.GenericServlet 抽象类实现了 Servlet 接口,而 javax.servlet.http.HttpServlet 抽象类是 GenericServlet 类的子类。当用户开发自己的 Servlet 类时,可以选择扩展 GenericServlet 类或者 HttpServlet 类(建议使用 HttpServlet 类)。
2、GenericServlet 接口
GenericServlet 类的主要源代码:
package javax.servlet;
import java.io.IOException;
import java.io.Serializable;
import java.util.Enumeration;
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {
}
public void destroy() {
}
public String getInitParameter(String name) {
return this.getServletConfig().getInitParameter(name);
}
public Enumeration<String> getInitParameterNames() {
return this.getServletConfig().getInitParameterNames();
}
public ServletConfig getServletConfig() {
return this.config;
}
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
}
public String getServletInfo() {
return "";
}
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public void log(String msg) {
this.getServletContext().log(this.getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
this.getServletContext().log(this.getServletName() + ": " + message, t);
}
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
public String getServletName() {
return this.config.getServletName();
}
}
分析: (1)GenericServlet 类除了实现 Servlet 接口,还实现了 ServletConfig 接口和 Serializable 接口。 (2)从 GenericServlet 类的源代码可以看出,GenericServlet 类实现了 Servlet 接口中 init(ServletConfig config) 初始化方法。GenericServlet 类有一个 ServletConfig 类型的的私有实例变量 config。当 Servlet 容器调用 GenericServlet 的init(ServletConfig config) 方法时,该方法是的私有实例变量 config 引用由容器传入的 ServletConfig 对象,即使得 GenericServlet 对象与一个 ServletConfig 对象关联。 (3)GenericServlet 类还自定义了一个不带参数的 init() 方法,init(ServletConfig config) 方法会调用此方法。对于 GenericServlet 类的子类,如果希望覆盖弗雷德初始化行为,有两种方法:
- 覆盖父类的不带参数的
init() 方法
public void init() {
...
}
- 覆盖父类的带参数的
init(ServletConfig config) 方法。如果希望当前 Servlet 对象与 ServletConfig 对象关联,应该在该方法中先调用 super.init(config) 方法:
public void init(ServletConfig config){
super.init(config);
...
}
(4)GenericServlet 类没有实现 Servlet 接口中的 service() 方法,service() 方法是 GenericServlet 类中唯一的抽象方法,GenericServlet 类的具体子类必须实现该方法,从而为特定的客户请求提供具体的服务。 (5)GenericServlet 类尽管实现了 Servlet 接口中的 destroy() 方法,实际上什么也没做。GenericServlet 类的具体子类可以覆盖该方法,从而为待销毁的当前 Servlet 对象释放所占用的各种资源(例如关闭文件输入流和输出流,关闭与数据库的连接等)。 (6)GenericServlet 实现了 ServletConfig 接口中的所有方法。因此,GenericServlet 类的子类可以直接调用在 ServletConfig 接口中定义的 getServletContext()、getInitParameter() 和 getInitParameterNames() 等方法。
|