之前提到servlet 生命周期中的三个阶段,第一个阶段中servlet容器会执行init方法来初始化一个servlet.
init方法和destroy这两个方法在servlet生命周期中之执行一次。servlet容器(或者说是servlet引擎)创建了servlet实例对象后立即调用该init方法。
Init方法是在servlet对象被创建后,再由servlet容器调用的方法,其执行位于构造方法之后,在执行init方法时,会传递一个serveltConfig对象。
所以,如果要在初始代码中用到servletConfig对象,则这些初始操作只能在init方法中编写,不能在构造方法中编写.
GenericServlet中关于init方法的示意源码:
public void init(ServletConfig config) throws ServletException
{
this.config=config;
......
}
如果在要在自己编写的servlet类中增加一些额外的初始化功能,则必须覆盖GenricServlet类的init(ServletConfig config)方法,如果覆盖后,父类的init(ServletConfig config)方法就不会被调用。GenericServlet类中有些方法依赖init方法执行的结果,例如
getServletName()方法:
public ServletContext getServeltContext()
{
return config.getServletContext;
}
这里的config对象的引用就来自Init(ServletConfig config)执行的结果.
所以如果子类需要覆盖了父类的init(ServletConfig config)方法,则首先要调用父类的init(ServletConfig config)方法,也就是先加入 super.init(config) 语句来先执行父类的方法.否则,会产生空指针异常 java.lang.NullPointerException ,因为config对象的引用为空。
为了避免这样的情况的产生,GenericServlet的设计人员 在GenericServlet中又定义了一个无参数的init()空方法. 且在init(servletConfig config)方法最后也调用了这个无参的空方法
public void init(ServletConfig config) throws ServletException
{
this.config=config;
init();
}
所以,我们只需覆盖这个无参的init方法加入自己的初始代码即可,而无需覆盖带参数的父类的init方法.
如果有多个重载的init方法,对以servlet而言,servlet容器始终就之调用servlet接口中的那个方法:init(ServletConfig config) (当然也会执行已经覆盖的无参的init()方法),其他的覆盖的init方法不会执行。
分析 2中关于servlet生命周期的那个例子程序中的一个代码:
//覆盖父类的init(ServletConfig config)方法 加入计数
public void init(ServletConfig config) throws ServletException
{
super.init(config); //调用父类的init方法
name=config.getServletName();
initvar++;
System.out.println(name+">init():Servlet 被初始化了"+initvar+"次");
}
/* 父类的带参数的init(ServletConfig config)方法最终还是会调用了不带参数的init()方法,
* 所以也可以在自己的servlet中覆盖不带参数的init()方法来加入自己的统计参数代码
*/
public void init() //覆盖父类的不带参数的初始化方法
{
//name=getServleConfig.getServletNmae(); //因为已经实现了servletConfig接口,则直接调用其方法即可
name=getServletName(); //直接返回
initvar++;
System.out.println(name+"init(): servlet被初始化了了 "+initvar+"次");
}
以上的功能是一样的。
分享到:
相关推荐
1. **Servlet接口**:所有Servlet都必须实现这个接口,它定义了Servlet的基本方法,如`init()`(初始化Servlet)、`service()`(处理请求)和`destroy()`(销毁Servlet)。 2. **GenericServlet**:这是一个抽象类...
1. **Servlet生命周期方法**:init(), service(), destroy(),以及它们如何被Web容器调用。 2. **GenericServlet的service()方法**:如何根据请求类型分派到对应的doXXX()方法。 3. **HttpServlet的doXXX()方法**:...
4. 销毁:当Servlet不再使用或Web应用关闭时,容器调用`destroy()`方法,释放资源。 六、请求与响应处理 - HttpServletRequest接口提供了访问请求信息的方法,如请求参数、头信息、路径信息等。 - ...
Servlet接口定义了Servlet的基本方法,如`init()`、`service()`、`destroy()`和`getServletInfo()`等。`init()`在Servlet实例化时被调用,用于初始化Servlet;`service()`处理客户端请求并生成响应;`destroy()`在...
1. **Servlet接口**:这是所有Servlet类的基类,定义了Servlet的基本方法,如`init()`, `service()`, `destroy()`等。`init()`方法在Servlet实例化后首次调用,用于初始化Servlet;`service()`方法处理客户端的请求...
- **初始化**:Servlet容器调用`init()`方法进行初始化,可以在这里设置初始参数或加载配置。 - **服务**:当接收到请求时,Servlet容器会调用`service()`方法,该方法会根据请求类型分派到`doGet()`或`doPost()`...
`jsp.init()`, `jsp.service()`, `jsp.destroy()`分别对应Servlet的初始化、服务和销毁方法,但这些方法在JSP页面中是隐式的。 6. **Servlet配置**: 在`web.xml`部署描述符中,开发者可以配置Servlet和Filter,包括...
`init()`, `destroy()` 和 `getServletConfig()` 方法分别是Servlet的初始化、销毁和获取Servlet配置信息的方法。 2. **GenericServlet类** GenericServlet是一个抽象类,实现了Servlet和ServletConfig接口,提供...
- `Servlet`:定义了Servlet的基本行为,如init()、service()、destroy()方法,用于初始化、处理请求和销毁Servlet。 - `HttpServlet`:是Servlet的子类,专门处理HTTP协议的请求,提供了doGet()、doPost()等方法...
1. **Servlet生命周期**:了解Servlet的初始化、服务、销毁过程,以及如何通过`init()`, `service()`, `destroy()`方法控制这些过程。 2. **请求处理流程**:观察`HttpServletRequest`和`HttpServletResponse`如何...
`GenericServlet`是抽象类,实现了`Servlet`和`ServletConfig`接口,提供了通用的生命周期方法。`HttpServlet`继承自`GenericServlet`,专门为HTTP协议定制,提供了`doGet()`、`doPost()`等方法。 4. **请求处理**...
1. **Servlet接口**:Servlet规范定义了`javax.servlet.Servlet`接口,它包含`init()`, `service()`, `destroy()`等方法,这些方法在Servlet生命周期的不同阶段被调用。 2. **GenericServlet类**:`javax.servlet....
4. **Servlet上下文**:ServletContext接口,提供了获取全局信息和与其他Servlet通信的方法。 5. **Servlet的多线程问题**:每个Servlet实例可能被多个请求线程同时访问,理解线程安全问题和如何处理。 6. **...
当Web服务器接收到对Servlet的请求时,会加载Servlet类,创建Servlet实例,并调用`init()`方法进行初始化。然后,对于每个后续的请求,Servlet容器将调用`service()`方法来处理请求并生成响应。最后,当Servlet不再...
Servlet的核心接口是`javax.servlet.Servlet`,它定义了Servlet的基本方法,如`init()`, `service()`, `destroy()`和`getServletConfig()`。`init()`方法在Servlet被加载时调用,用于初始化Servlet;`service()`...