前言
周期
说明
init
getServletConfig
service
destory
init方法的执行时期
周期总结
init
service
destory
前言
Servlet例子与注解配置
周期
创建web项目,写一个测试ServletDemo1类
package com.lingaolu.servlet; import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; @WebServlet("/demo1") public class ServletDemo1 implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init......"); } @Override public ServletConfig getServletConfig() { return null; } @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
摧毁方法,在服务器正常关闭是,执行,执行一次,用于释放资源