GenericServlet类是Servlet接口的实现类,我们也可以通过继承GenericServlet来编写自己的Servlet。下面是GenericServlet类的源代码:
public abstract class GenericServlet implements Servlet, ServletConfig,
java.io.Serializable {
private static final long serialVersionUID = 1L;
private transient ServletConfig config; // 定义成员变量
public GenericServlet() {}
@Override
public void destroy() {}
@Override
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
@Override
public Enumeration<String> getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
@Override
public ServletConfig getServletConfig() {
return config;
}
@Override
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
@Override
public String getServletInfo() {
return "";
}
/*实现了Servlet接口的init(ServletConfig)方法,把参数config赋值给成员变量config,然后再调用本类自己新建的无参的init()方法*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
/*无参的init是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化操作,就不要去覆盖init(ServletConfig)方法了,而应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。*/
public void init() throws ServletException {}
public void log(String msg) {
getServletContext().log(getServletName() + ": " + msg);
}
public void log(String message, Throwable t) {
getServletContext().log(getServletName() + ": " + message, t);
}
@Override
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
@Override
public String getServletName() {
returnconfig.getServletName();
}
}
在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给该实例变量。然后在其他方法中都使用了该实例变量config。
如果子类覆盖了GenericServlet的init(ServletConfig)方法,那么this.config=config这一条语句就会被覆盖,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法就都不能使用了。如果真的希望完成一些初始化操作,那么就应该去覆盖GenericServlet提供的无参的nit()方法,它会在init(ServletConfig)方法中被调用。
另外GenericServlet还实现了ServletConfig接口,所以可以直接调用getInitParameter(String)、getServletContext()等ServletConfig中的方法。