01 08Servlet生命周期

Servlet的生命周期可以控制的只是初始化、服务、销毁。其它的操作都会由容器来负责完成。

1 基本生命周期

在HttpServlet类里面提供有以下的几个方法来负责生命周期的处理:
1、初始化:public void init() throws ServletException
|————默认情况下是在Servlet第一次使用的时候初始化;
2、服务(主要是处理GET与POST请求):
(1)处理GET请求:protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
(2)处理POST请求:protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException
3、销毁:public void destroy()
|————一个Servlet长时间不使用,为了保证资源的节约,自动销毁;
|————当容器关闭的时候,自动调用销毁操作;
|————当Tomcat自动重新加载的时候也会销毁。
范例:观察生命周期

package org.lks.demo;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class LifeServlet extends HttpServlet {

	public void init() throws ServletException {
		System.out.println("[LifeServlet] init...");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] get...");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] post...");
	}

	public void destroy() {
		System.out.println("[LifeServlet] destory...");
	}

}

<servlet>
	<servlet-name>LifeServlet</servlet-name>
	<servlet-class>org.lks.servlet.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>LifeServlet</servlet-name>
	<url-pattern>/lift.servlet<url-pattern>
</servlet-mapping>

对于初始化的控制方法,也可以在容器启动的时候设置为默认初始化,那么需要在web.xml文件里面增加如下配置:

<load-on-startup>1</load-on-startup>

加入以上的配置之后,Servlet会在容器启动的时候自动进行初始化的操作。

2 扩展生命周期

以上给出的几个操作方法,严格来讲是使用最多的几个方法,但是对于初始化和服务的方法在HttpServlet类里面还是有其他定义的:
(1)初始化方法:public void init(ServletConfig config) throws ServletException
|————可以读取初始化的配置参数数据;
(2)服务方法:
|————GenericServlet:public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
|————HttpServlet:protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException

HttpServlet类中的service()方法是一个普通方法,已经实现好的方法。
范例:观察扩展生命周期

package org.lks.demo;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class LifeServlet extends HttpServlet {

	public void init() throws ServletException {
		System.out.println("[LifeServlet] init...");
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("[LifeServlet] init, parameter: " + config.getInitParameter("data"));
	}

	@Override
	public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("[LifeServlet] service...");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] get...");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("[LifeServlet] post...");
	}

	public void destroy() {
		System.out.println("[LifeServlet] destory...");
	}

}

<servlet>
   <servlet-name>LifeServlet</servlet-name>
   <servlet-class>org.lks.demo.LifeServlet</servlet-class>
   <init-param>
   	<param-name>data</param-name>
   	<param-value>HELLO</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
 </servlet>
<servlet-mapping>
	<servlet-name>LifeServlet</servlet-name>
	<url-pattern>/lift.servlet<url-pattern>
</servlet-mapping>

此时可以发现无参的初始化方法将不再起作用,而变为了可以读取初始化配置参数的方法执行。同时可以发现,一旦覆写了service()方法之后,doGet()和doPost()两个方法将不再执行了。因为在HttpServlet类中的service()方法里面会接收用户的请求类型,如果发现这个请求类型是GET请求,这个方法自动调用doGet()方法(此方法是交给子类覆写的),也就是说整个Servlet之中如果子类要想处理GET请求就必须覆写doGet()方法,如果要想处理POST请求,就必须按照要求覆写doPost()方法,那么这就是一个最典型的模板设计模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章