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/10/1 21:14:36