讲到servlet,我认为servlet的生命周期是一个逃不开的话题。何谓生命周期?就是一个servlet从被创建到用完被销毁(web容器停止,从web容器中被移除)中间经历的过程期间会执行这样四种方法:
1.init():初始化
2.service():转发请求
3.doGet()/ doPost()等:执行业务逻辑
4.destroy():web容器停止之后清理现场
init()方法:
该方法用于初始化servlet,于servlet第一次被调用时执行,目的是将我们的web.xml配置文件即部署描述文件封装一个ServletConfig对象传递给servlet,并通过ServletConfig对象得到某些初始化参数。该方法只会在web容器启动时执行一次。
service()方法:
该方法在用户调用servlet之后,执行业务逻辑之前执行,目的是判断用户的请求方式(get/post)并将不同的请求转发给不同的方法处理
doGet()/doPost()/doDelete()/doPut()等方法是用来处理业务逻辑的,在这些方法内我们可以接收客户端传来的参数并且可以给客户端返回参数,还可以连接数据库等等。至于以上四种请求类型,我们常用的无非是Get和Post请求,在收到用户请求之后,service()方法先对请求方式进行判断然后再将请求转发给本组方法中的其中一个。
destroy()方法主要用于web容器停止之后,清理内存,释放垃圾用,该方法也只会在web容器关闭时执行一次。
下面来实战,写一个servlet分别重写init()的无参构造函数,service()以及destroy()方法,并在下面打印一句话:
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = -3630074342607221298L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doGet");
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入doPost");
super.doPost(req, resp);
}
@Override
public void init() throws ServletException {
System.out.println("进入init方法");
}
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("进入service方法");
}
@Override
public void destroy() {
System.out.println("进入destroy方法");
}
}
我们启动之后来调用Get请求试试:
第一次调用你会发现执行了init sevice和doGet三个方法,
刷新一次:
本次只有service和doGet两个方法被调用
那么如果停止运行(不可以点控制台右边的红色按钮,必须找到server,然后右键点击stop),stop之后,我们可以在控制台中发现destroy被调用的痕迹: