Servlet生命周期
1.生命周期表示一个java对象从最初被创建到最终被销毁,经历的所有过程。
2.Servlet对象的生命周期
Servlet对象的生命周期,javaweb程序员是无权干涉的,包括Servlet对象相关方法的调用,都是无权干涉的
Servlet对象从最初的创建,方法的调用,以及对象的销毁,整个过程,都是由web容器来管理的。
Web Container管理Servlet对象的生命周期。
3.“默认情况下”,Servlet对象在对象在WEB服务器启动阶段不会被实例化【想要启动时实例化,需要特殊配置web.xml】
4.描述Servlet对象生命周期
1) 用户在浏览器地址栏上输入URL: http://localhost:8080/prj_servlet_01_war_exploded/hello
2) WEB容器截取请求路径 /prj_servlet_01_war_exploded/hello
3)WEB容器在容器上下文中找请求路径 /prj_servlet_01_war_exploded/hello 对应的Servlet对象
4)若没有找到对应的Servlet对象-(没找到9中的容器,找10中的容器)
4.1) 通过web.xml文件中相关的配置信息,得到请求路径/hello 对应的Servlet完整类名
4.2)通过反射机制,调用Servlet类的无参构造方法完成Servlet对象的实例化
4.3)web容器调用Servlet对象的init()方法完成初始化操作
4.4)web容器调用Servlet对象的service()方法提供服务
5)若找到对应的Servlet对象-(找到9中的容器)
5.1)web容器直接调用Servlet对象的service()方法提供服务
6) web容器关闭的时候/webapp重新部署的时候/该Servlet对象长时间没有用户再次访问的时候
web容器会将该Servlet对象销毁,在销毁该对象之前,web容器会调用Servlet对象的destroy方法,
完成销毁之前的准备
5.总结
5.1 Servlet类的构造方法只执行一次
5.2 Servlet对象的init方法只执行一次
5.3 Servlet对象的service方法,只要用户请求一次,则执行一次
5.4 Servlet对象的destroy方法只执行一次
6.注意
init方法执行的时候,Servlet对象已经被创建好了。
destroy方法执行的时候,Servlet对象还没有被销毁,即将被销毁
7.Servlet对象是单例,但是不符合单例设计模式,只能称为伪装单例
单例模式的构造方法是私有化的
所以Servlet对象是在单实例多线程的环境下运行的。 那么Servlet对象中若有实例变量,
并且实例变量涉及到修改操作,Servlet对象一定会存在线程安全问题,
所以不建议在Servlet对象中使用实例变量,尽量使用局部变量
8.在服务器启动阶段,实例化Servlet对象,需要在web.xml文件中进行相关的配置,例如:
1//"1"表示运行的优先级,0最高
9.Servlet对象实例化后
大多数的WEB容器都是将Servlet对象以及对应的url-pattern存储到MAp集合中了
WEB容器中有这样一个Map集合
Map<String,Servlet>集合
key value
----------------
/login LoginServlet对象引用
/delete DeleteServlet对象调用
/save SaveServlet对象引用
10.服务器在启动的时候会解析各个webapp的web.xml文件
将web.xml文件中的url-pattern和对应Servlet完整类名存储到Map集合中了
在Web容器中有这样一个Map集合
Map<String,String>集合
key value
----------------
/login com.chif.loginServlet
/delete com.chif.deleteServlet
/save com.chif.saveServlet
8. Servlet3.0
*好处:支持注解配置,可以不写web.xml
*步骤:
1.创建项目,选择Servlet3.0以上的版本。
2.定义一个Servlet类。
3.复写方法
4.在类上使用@webServlet注解,进行配置
@webServlet("资源路径")