容器创建了Servlet实例后,它将调用实例的init(ServletConfig)方法初始化Servlet.该方法的参数ServletConfig对象包含了在WEB应用程序的部署描述文件中指定的初始化参数。在init(ServletConfig)调用完后,容器将调用init() 方法,之后Servlet就被初始化了。
两者不同定义:
void init(ServletConfig config) throws ServletException
public void init() throws ServletException
原理如下:
1、如果用户不需要设置一些初始化操作,那么init()方法的实现可有可无,因为可以从父类GenericServlet中继承得到。
2、如果用户需要servlet通过从web.xml中读取initialization parameters或者configuration data,那么就需要显式实现init()方法。
3、GenericServlet 提供两个overloaded形式的方法如下:
public void init() throws ServletException
public void init(ServletConfig) throws ServletException
4、Servlet interface只定义一个init(ServletConfig)方法,而且servlet加载时必须被调用,但只在第一次加载被调用一次。
5、GenericServlet实现了这个init(ServletConfig)方法,这个方法先保存ServletConfig reference,然后调用init()方法。
6、如果用户servlet实现init()方法并在其中填充自己需要初始化的信息,这个init()会被GenericServlet中的init(ServletConfig)方法调用,因为ServletConfig reference已经被保存,所以你可以访问web.xml中的。
7、如果用户servlet实现init(ServletConfig),那么就覆盖了GenericServlet(父类)init(ServletConfig)方法,因此,GenericServlet会调用子类的方法,而不会保 存ServletConfig reference,必须执行super.init(config)才能保存ServletConfig reference访问web.xml中的。
8、所以有两种方法初始化:
第一种
public class LoginServlet extends HttpServlet
{
public void init() throws ServletException
{
}
}
第二中
public class LoginServlet extends HttpServlet
{
public void init(ServletConfig config) throws ServletException
{
super.init(config)
}
}
9、servlet初始化正常结束,才能处理处理用户的请求,如果在初始化方法init()中出现错误,那么需要throw a ServletException或者父类的UnavailableException, 这会告诉servlet容器初始化失败,不能处理任何请求。