Servlet生命周期(三)

一、Servlet接口定义了Servlet生命周期

  • init()方法:服务器调用该方法初始化servlet
  • service()方法:初始化完毕,服务器调用该方法响应客户的请求
  • destroy()方法:服务器调用该方法消灭servlet对象
  • 其中,init()方法只在servlet第一次被请求加载的时候被调用一次,当有客户再请求servlet服务时,web服务器将启动一个新的线程,在该线程中,调用service方法响应客户的请求。

二、关于Servlet的生命周期

  • Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
  • 针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
  • 在Servlet的整个生命周期内,servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,servlet引擎都会创建一个新的HTTPServletRequest请求对象和一个新的HTTPServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法

三、servlet生命周期

  1. 创建servlet,并调用init方法
  2. 通过service方法来处理请求
  3. 通过destroy方法来销毁servlet

当我们创建一个servlet时,第一次访问,会创建servlet对象,并调用init方法,init方法只调用一次。开启一个线程来调用service方法。当下一次再访问时,又开启一个线程来调用service方法。servlet对象,一般情况只创建一次,它常驻内存。当服务停止,或者servlet对象销毁时会调用destroy方法。 

注意:如果在servlet中创建了成员变量,就可能出现线程安全问题。(出现线程安全问题的情况:1.多线程;2.有共享资源;3.多条语句操作共享资源。)servlet共享资源是成员变量因为就一个servlet,多线程访问service,service中肯定操作成员变量,多条语句操作,造成线程安全问题。解决方案,同步,但造成性能降低。因此,在开发中尽量避免在servlet中创建成员变量。如果创建了成员变量,就必须要同步。

四、演示servlet生命周期

1.在webproject中的src目录下,新建servlet,选择init(), destroy(), doGet(), doPost()方法重写,在配置页面中,确认servlet-name, 以及确认url-pattern,点击finish。

package com.it.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

public class LifeServlet extends HttpServlet {

	public LifeServlet(){
		System.out.println("servlet constructor");
	}
	
	public void destroy() {
		System.out.println("servlet destroy");
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("servlet service");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request,response);
	}

	public void init() throws ServletException {
		System.out.println("servlet init");
	}

}

2. 在浏览器中输入配置好的url-pattern,不断刷新,发现构造和init()都只执行一次,然后不再执行。重新部署项目,发现destroy()方法执行。

猜你喜欢

转载自blog.csdn.net/Ada_yangyang/article/details/81569740