GenericServlet
抽象类为Servlet
接口提供了通用实现,它与任何网络应用层协议无关。GenericServlet
除了实现Servlet
接口还实现了ServletConfig
和Serializable
接口。
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();
}
}
init
方法
从
GenericServlet
类的源代码可以看出,GenericServlet
实现了Servlet
接口中的init(ServletConfig config)
初始化方法,GenericServlet
类有一个ServletConfig
类型的私有实例变量config
,当Servlet
容器调用GenericServlet
的init(ServletConfig config)
方法时,该方法使得私有实例变量config
引用由容器传入的ServletConfig
对象,使得GenericServlet
对象与一个ServletConfig
对象关联。
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
GenericServlet
还定义了一个不带参数的init()
方法,init(ServletConfig config)
方法会调用该方法。对于GenericServlet
类的子类,如果希望覆盖父类的初始化行为那么就由如下两种方法。
- 覆盖父类不带参数的
init()
方法 - 覆盖父类带参数的
init(ServletConfig config)
,但是如果希望当前Servlet
对象和ServletConfig
对象相关联,应该现在该方法中调用super.init(config)
方法
service()
方法
GenericServlet
类没有实现Servlet
接口中的service()
方法。service()
方法是GenericServlet
类中唯一的抽象方法,GenericServlet
类的子类必须实现该方法,从而为特定的客户请求提供具体的服务。
destroy()
方法
GenericServlet
类尽管实现了Servlet
接口的destroy()
方法,但实际上什么也没有做。GenericServlet
类的具体子类可以覆盖该方法,从而为待销毁的当前Servlet
对象释放占用的各种资源(关闭文件输入流和输出流,关闭数据库连接等,实际项目中很少有放在这个方法中去处理的)。
ServletConfig
接口
此外,
GenericServlet
类实现了ServletConfig
接口中的所有的方法,因此GenericServlet
类的子类可以直接调用getServletContext()
,getInitParameter()
,getInitParameterNams()
等方法。
Tips
GenericServlet
类实现了Servlet
接口和ServletConfig
接口。GenericServlet
类的主要身份是Servlet
,此外它使用装饰者模式为自己附加了ServletConfig
装饰身份。在具体实现类中GenericServlet
类包装了一个ServletConfig
接口的实例,通过该实例来实现ServletConfig
接口中的方法。