前言
周期
创建web项目,写一个测试ServletDemo1类
package com.lingaolu.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; /** * @author 林高禄 * @create 2020-07-06-10:46 */ @WebServlet("/demo1") public class ServletDemo1 implements Servlet { /** * 初始化方法,在Servlet被创建是执行,只会执行一次 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init......"); } @Override public ServletConfig getServletConfig() { return null; } /** * 提供服务方法,每一次Servlet被访问是执行,执行多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service......"); } @Override public String getServletInfo() { return null; } /** * 摧毁方法,在服务器正常关闭是,执行,执行一次 */ @Override public void destroy() { System.out.println("destroy......"); } }
运行访
一直刷新访问,控制台输出
可见init方法只执行一次,而service方法每次访问都执行
我们关闭项目
控制台输出
destory方法也执行了一次
说明
init
初始化方法,在Servlet被创建是执行,只会执行一次
getServletConfig
获取配置对象,不常用
service
提供服务方法,每一次Servlet被访问是执行,执行多次
destory
摧毁方法,在服务器正常关闭是,执行,执行一次
init方法的执行时期
我们运行项目,没有有init......输出,说明ServletDemo1还没有被创建,init方法还没有执行,直到我们第一次访问demo1,才执行init放发
那么 ServletDemo1能不能在项目启动的时候被创建呢,加载一下资源,可以,需要配置loadOnStartup
loadOnStartup为负数时,是访问才创建,loadOnStartup大于等于0时,是启动项目就创建
默认为-1,访问才创建
我们启动下项目
ServletDeme1被创建了,也执行了init方法
周期总结
init
- Servlet创建时执行,
- 可配置loadOnStartup的值来设置执行时期,loadOnStartup为负数时,是访问才创建,loadOnStartup大于等于0时,是启动项目就创建
- 只执行一次,可用于相关资源的初始化
- 因为只执行一次,说明只有一个实例,是单例的,在多用户访问时会存在线程安全问题
- 线程安全问题解决:不能加锁,会影响性能,所以尽量不要在servlet中定义成员变量,要定义局部变量,这样每个用户进来都是一个新的变量,如果要定义成员变量,也是不能修改这个成员变量。
service
提供服务方法,每一次Servlet被访问是执行,执行多次
destory
摧毁方法,在服务器正常关闭是,执行,执行一次,用于释放资源
本文详细解析了Servlet的生命周期,包括初始化(init)、提供服务(service)和摧毁(destory)三个阶段。重点介绍了init方法在Servlet创建时仅执行一次,适用于资源初始化;service方法在每次访问时执行,用于提供服务;destory方法在服务器关闭时执行,用于释放资源。







1470

被折叠的 条评论
为什么被折叠?



