(7)Servlet的生命周期

(7)Servlet的生命周期

一、Servlet的生命周期

  Servlet 生命周期可被定义为从创建直到毁灭的整个过程。

生命周期:

  • 初始化:Servlet 调用 init () 方法进行初始化。
  • 执行:Servlet 调用 service() 方法来处理客户端的请求。
  • 销毁:Servlet 调用 destroy() 方法终止。
  • GC:最后,Servlet 由 JVM 的垃圾回收器进行垃圾回收的。

1.初始化(init() )

  init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。
也就是说init()方法运行只运行一次,第一次后就不会再进入init()方法运行init()中的代码。

方法:

@Override
public void init() throws ServletException {
	// 初始化代码...
}

2.执行

2.1 service()

  service() 方法是执行实际任务的主要方法。

  当请求来的时候,Servlet会调用service()方法来处理客户端(也就是浏览器)的请求。处理完后返回数据给客户端浏览器

  只要你写了service()方法不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有 service 方法,则优先调用 Service 方法。

  如果你在service() 方法中只写了这一句,super.service(req, resp);。那么service方法会自动调用doGet()或doPost()方法的。

方法:

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	// 执行实际任务...
} 
2.2 doGet() 和 doPost()

  doGet() 和 doPost() 方法是每次服务请求中最常用的方法。他们可以根据请求类型,get请求或post请求来分别调用。。

  在没有 service 方法的情况下如果是 get 方式的请求所调用的处理请求的方法是doGet()。
  在没有 service 方法的情况下如果是 post 方式的请求所调用的处理请求的方法是doPost()

方法:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	// get请求
}
	
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// post请求
}

3.销毁(destroy())

  destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。
  你想看一下destroy()的调用,是可以在服务器停止运行stop后看到的。你可以尝试在destroy()方法中加一句控制台输出,然后运行服务器,运行后再stop看一眼控制台就可以看到这个方法调用了。

方法:

@Override
public void destroy() {
	// 结束代码
}

一、示例代码

可以参考我前面创建项目的文章(Java EE基础(3):第一个Web项目)。
然后把下面代码敲进入。一定要自己敲!

1.Servlet代码

下面是Servlet代码,包含了即将体验的方法。
(post因为需要表单jsp文件,暂时先不体验,但是我们可以体验一下get方法。体验一下是怎么回事)

import java.io.IOException;

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

public class MyServlet extends HttpServlet{
	
	@Override
	public void init() throws ServletException {
		// 初始化代码...
		System.out.println("MyServlet init...");
	}
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		super.service(req, resp);
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("do get...");
		resp.getWriter().append("do get!");
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("do post...");
		resp.getWriter().append("do post!");
	}

	@Override
	public void destroy() {
		// 销毁...
		System.out.println("destroy MyServlet...");
	}
}

2.web.xml文件:

web.xml文件和

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
 
  	<!--配置Servlet --> 
	<servlet>
		<!-- servlet名字 -->
		<servlet-name>MyServlet</servlet-name>
		<!-- servlet类位置(包名加类名,写完后按住ctrl鼠标移到下面这行看能不能点击跳转,可以跳转说明写对了) -->
		<servlet-class>com.changsheng.servlet.MyServlet</servlet-class>
	</servlet> 
	<!--配置Sevlet访问方式 -->
	<servlet-mapping>
		<!-- 对应访问的servlet名 -->
		<servlet-name>MyServlet</servlet-name>
		<!-- 浏览器输入的地址 -->
		<url-pattern>/MyServlet</url-pattern>
	</servlet-mapping>
	
</web-app>

三、运行

部署项目可以参考我这篇文章:Java EE基础(4):优化第一个Web项目:Eclipse集成Tomcat并部署web项目

你问我为什么这样部署?原因很简单。这样Eclipse继承Tomcat后部署web项目简单,方便,快速。而且直接在控制台就可以看到信息,这多舒服。部署好了启动运行Tomcat

1.启动Tomcat

在这里插入图片描述
没有报错,启动成功!在这里插入图片描述

2.浏览器访问

直接使用URL访问的话是get请求的。
http://localhost:8080/MyServlet
在这里插入图片描述

3.看一眼控制台

看看我们的控制台打印出了什么。
在这里插入图片描述

4.停止服务器

在这里插入图片描述
在这里插入图片描述
总结一下:我们经过这个案例,了解了Servlet的生命周期。
如果你什么地方感觉理解欠佳,推荐再回头去看一下我之前的文章,如果我文章什么地方描述的不太容易理解可以私信我。

参考:

Servlet 生命周期菜鸟教程:https://www.runoob.com/servlet/servlet-life-cycle.html