1>接口中的定义
void init(ServletConfig config) throws ServletException;
void destroy();
反编译tomcat ,lib目录 中的servlet-api.jar中的GenericServlet后得到
public abstract class GenericServlet
implements Servlet, ServletConfig, Serializable
{
private transient ServletConfig config;
public void destroy()
{
}
public String getInitParameter(String name)
{
return getServletConfig().getInitParameter(name);
}
public Enumeration getInitParameterNames()
{
return getServletConfig().getInitParameterNames();
}
public ServletConfig getServletConfig()
{
return this.config;
}
public ServletContext getServletContext()
{
return getServletConfig().getServletContext();
}
public String getServletInfo()
{
return "";
}
public void init(ServletConfig config)
throws ServletException
{
this.config = config;
init();
}
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);
}
public abstract void service(ServletRequest paramServletRequest, ServletResponse paramServletResponse)
throws ServletException, IOException;
public String getServletName()
{
return this.config.getServletName();
}
}
2>实际运行过程
你自己写一个类继承了HttpServlet,容器会在初始化你这个servlet时,先实例化一个实现了ServletConfig接口的类的实例,然后
调用GenericServlet的init(ServletConfig config)方法,这时,这个带参数的方法利用传入的config参数完成它implements ServletConfig接口的功能.然后再调用你覆写的无参的init()方法.-----这里是典型的多态运用
3>一个实际的例子
假设你的web.xml文件中相关servlet这样配置
<servlet>
<servlet-name>
counter
</servlet-name>
<servlet-class>
InitCounter
</servlet-class>
<init-param>
<param-name>
initial
</param-name>
<param-value>
1000
</param-value>
<description>
The initial value for the counter <!-- optional -->
</description>
</init-param>
</servlet>
你就可以在init()方法中得到web.xml中的配置
public void init() throws ServletException{
String initial = getInitParameter("initial");
try {
count = Integer.parseInt(initial);
}
catch (NumberFormatException e) {
count = 0;
}
}
4>总结
你在代码中覆写的是无参数的init()方法 这个方法是在GenericServlet中定义的,你不用overriding 有参的在Servlet接口中定义的方法.
从servlet 2.1开始就是这样了
而GenericServlet中实现了Servlet接口中的destroy()方法,这只是 一个空方法