GenericServlet类
1、实现了Servlet接口
GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。
2、实现了ServletConfig接口
GenericServlet还实现了ServletConfig接口,所以可以直接调用getInitParameter()、getServletContext()等ServletConfig的方法。
3、实现了Serializable接口
Serializable是Java提供的序列化接口,是一个空接口,为对象提供标准的序列化与反序列化操作。使用Serializable实现序列化过程相当简单,只需要在类声明的时候指定一个标识,便可以自动的实现默认的序列化过程。
private static final long serialVersionUID = 1L;
4、两个重载的 init() 方法
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
// 空方法,这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。
public void init() throws ServletException {}
在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给了实例变量。然后在该类的很多方法中使用了实例变量config。如果子类覆盖了GenericServlet的init(StringConfig)方法,那么this.config=config这一条语句就会被覆盖了,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法都不能使用了。如果真的希望完成 一些初始化操作,那么去覆盖GenericServlet提供的init()无参方法,它是没有参数的init()方法,它会在init(ServletConfig)方法中被调用。
GenericServlet类源码
//javax.servlet.GenericServlet
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config;
public GenericServlet() {}
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
// 空方法,这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。
public void init() throws ServletException {}
@Override
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public String getServletInfo() {
return "";
}
@Override
public void destroy() {}
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public String getServletName() {
return config.getServletName();
}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
}
本文主要介绍了GenericServlet类,它实现了Servlet、ServletConfig和Serializable接口。还提到其有两个重载的init()方法,若子类覆盖init(ServletConfig)方法,会使实例变量config为null,建议覆盖无参init()方法完成初始化操作,最后提及了该类源码。
734





