Servlet生命周期
# 5.Servlet生命周期
本文讲讲一个Servlet从开始到结束的过程。
# Servlet中的生命周期方法
主要分为3个:
- 被创建,执行init方法;
- 提供服务,执行service方法
- 被销毁,执行destroy方法
我们新建一个Servlet来演示:
package com.peterjxl;
import javax.servlet.*;
import java.io.IOException;
public class ServletDemo2Circle implements Servlet {
//初始化方法 在Servlet被创建时,执行。只会执行一次
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.....");
}
//获取ServletConfig对象 ServletConfig:Servlet的配置对象
@Override
public ServletConfig getServletConfig() {
return null;
}
//提供服务的方法 每一次Servlet被访问时执行
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
//获取Servlet的一些信息,版本,作者等等。
@Override
public String getServletInfo() {
return null;
}
//销毁方法 在服务器正常关闭时,执行,执行一次。
@Override
public void destroy() {
System.out.println("destroy.....");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
然后在web.xml里增加如下配置:
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.peterjxl.ServletDemo2Circle</servlet-class>
</servlet>
<!--配置Servlet -->
<servlet-mapping>
<servlet-name>demo2</servlet-name> <!-- 访问路径时,使用哪个Servlet-->
<url-pattern>/demo2</url-pattern> <!-- 访问哪个路径-->
</servlet-mapping>
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
重启Tomcat,访问/demo2,可以看到控制台输出如下:
init.....
Hello Servlet!
1
2
2
然后关闭Tomcat:
destroy.....
1
在第一次访问 http://localhost:8080/hello/demo2 (opens new window) 时,会创建servlet对象,执行init和service方法。
多次访问,则执行多次service方法,并不会执行多次init方法,init在Servlet的生命周期中只执行一次。
# 深入理解生命周期
Servlet什么时候被创建?默认情况下,第一次被访问时,Servlet被创建
但我们可以配置执行Servlet的创建时机。在web.xml文件中的<servlet>
标签下配置<load-on-startup>
标签:
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>com.peterjxl.ServletDemo2Circle</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
1
2
3
4
5
2
3
4
5
<load-on-startup>
标签里的值是一个整数,其值的定义如下:
- 想要在第一次被访问时创建该Servlet:设置该值为负数
- 想要在服务器启动时创建该Servlet:设置值为0或正整数默认值是-1.
有时候我们需要在Web服务一启动的时候,就执行一些初始化的方法(例如创建数据库连接池等),此时可以定义一个初始化的Servlet,并在其init方法里编写初始化代码,这样其他Servlet就可以使用初始化好的资源。
其他注意点:
- Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的。**多个用户同时访问时,可能存在线程安全问题。**而加锁的话,性能太低。解决方法:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值。可以定义局部变量来区别各变量。
- destroy方法,只执行一次,在Servlet被销毁时执行。服务器被关闭时,Servlet会被销毁。但只有服务器正常关闭时,才会执行destroy。destroy方法在Servlet被销毁之前执行,一般用于释放资源(例如数据库连接池)
上次更新: 2024/5/19 09:33:34