Servlet是运行在服务器的一段程序,所以Servlet的生命周期会受Servlet容器的控制。Servlet生命周期包括加载、初始化、服务、销毁、卸载5个部分。通常情况下,加载和卸载阶段可以由Servlet容器来处理,在此只需要关注初始化、服务、销毁三个阶段。与Servlet生命周期相关的方法如下:
public void init() throws ServletException : 初始化Servlet对象时调用此方法
public void init(ServletConfig config) throws ServletException : init()的重载方法,Servlet初始化时调用,并可以通过config来读取配置信息
public abstract void service(ServletRequest req,ServletResponse res) throws ServletException , IOException : 提供Servlet服务的方法。此方法是抽象方法,故实际使用的是此抽象方法的实现方法 doGet()或doPost()来处理get或post请求
public void destroy() : 销毁Servlet对象时调用此方法
(1)初始化
当一个Servlet被加载完毕并实例化以后,Servlet容器将调用 init() 方法初始化这个对象,执行一些初始化的工作,如读取资源配置信息等。如果初始化阶段发生错误,此Servlet实例将被容器直接卸载。
(2)服务
初始化完成以后,Servlet就会去调用service()的具体实现方法doGet()或doPost()来处理请求;并通过ServletRequest类型的参数接收客户端的请求,以及通过ServletResponse类型的参数处理响应信息。
(3)销毁
Servlet实例服务完毕以后,就可以通过destroy()方法来指明哪些资源可以被系统回收(注意,destroy()方法只是“指明”需要被回收的方法,并不会直接进行回收)
package com.lanqiao.shopping.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.jasper.tagplugins.jstl.core.Out;
/**
* Servlet implementation class dog
*/
@WebServlet("/dog")
public class dog extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
@Override
public void init() throws ServletException{
System.out.println("初始化init()");
}
public dog() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/* response.getWriter().append("Served at: ").append(request.getContextPath());*/
System.out.println("servlet服务doGet()..");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
/*doGet(request, response);*/
System.out.println("servlet服务doPost()..");
}
@Override
public void destroy(){
System.out.println("销毁destroy()");
}
}
通过浏览器的地址栏访问服务器,属于get方式的请求,现在直接访问 http://localhost:8080/shopping/dog
重复多次运行后
关闭服务器(注意是在Servers面板中单击红色的“关闭”按钮,而不是在Console控制台中),可以发现Servlet容器确实执行了destroy()方法:
不难发现,在Servlet生命周期中,初始化init()方法只在第一次访问时执行一次;而doGet()或doPost()方法会在服务器每次接收请求时都执行一次;销毁destroy()方法只会在关闭服务器时执行一次。需要说明,初始化方法init()默认会在客户端第一次调用Servlet服务让初始化init()方法在Tomcat容器启动时自动执行。
刚说了,通过浏览器的地址栏访问服务器,属于get方式的请求,现在通过一个表单来来试试post方式的请求:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/dog" method="post">
<input type="submit" value="提交">
</form>
</body>
</html>
运行结果:
点击提交按钮: