Servlet对象的生命周期(All)

此文章包含有的文章内容
web服务器启动阶段实例化Servlet对象
Servlet对象实例化之后存储到哪里了
web服务器启动阶段解析的web.xml文件,做了什么?
Servlet接口中的方法写什么代码?何时使用?

Servlet对象的生命周期

Servlet类中的方法

servlet() 构造方法
void init(ServletConfig config) 初始化方法
void service(ServletRequest req, ServletResponse res) Servlet响应请求
void destroy() 销毁对象前的准备

ServletConfig getServletConfig() 返回一个ServletConfig对象,其中包含此Servlet的初始化和启动参数
String getServletInfo() 返回有关servlet的信息,例如作者,版本和版权

关于servlet对象的生命周期

什么是生命周期?

生命周期表示一个Java对象从最初被创建到最终被销毁,经历的所有过程

Servlet对象的生命周期是谁来管理的?程序员可以干涉吗?

  • Servlet对象的生命周期,javaweb程序员是无权干涉的,包括Servlet对象的相关方法调用,程序员也是无权干涉的
  • Servlet对象从最初的创建,方法的调用,以及最后被销毁,是由web容器来管理的
  • Web Container管理Servlet对象的生命周期
  • 默认情况 下,Servlet对象在Web容器启动阶段不会被实例化。【若希望在web服务器启动阶段实例化Servlet对象,可以进行特殊设置】

描述Servlet对象生命周期

1)浏览器访问URL:http://localhost:8080/web_war_exploded/hello
2)web容器截取请求路径:/web_war_exploded/hello
3)web容器在容器上下文中找请求路径/web_war_exploded/hello对应的Servlet对象
4.1)若没有找到对应的Servlet对象

  • 会通过web.xml文件中的相关信息,得到请求路径/web_war_exploded/hello对应的Servlet完整类名
  • 通过反射机制,调用Servlet类的无参构造方法完成Servlet对象的实例化
  • web容器调用Servlet对象的init()方法完成初始化
  • web容器调用Servlet对象的service()方法提供服务

4.2)若找到对应的Servlet对象

  • web容器直接调用Servlet对象的service()方法提供服务

5)Servlet对象销毁

  • web容器关闭的时候、webApp重新部署的时候、该Servlet对象长时间没有用户访问的时候,web容器会将Servlet对象销毁,在销毁Servlet对象前,会调用对象的destroy()方法进行销毁前的准备

总结

  • Servlet对象的构造方法只执行一次
  • Servlet对象的init()方法只执行一次
  • Servlet对象的service()方法,只要用户请求一次,则执行一次
  • Servlet对象的destroy()方法只执行一次

注意

  • init()方法执行的时候,Servlet对象已经被创建好了
    destroy()方法执行的时候,Servlet对象还没被销毁,即将销毁

  • Servlet对象是单例,只实例化一个Servlet对象,多用户多线程访问是,使用的是一个Servlet对象;
    Tomcat是支持多线程的,所以Servlet对象是在单实例多线程的环境下运行的;
    那么Servlet对象中若有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量(类的属性),尽量使用局部变量;

web服务器启动阶段实例化Servlet对象

如希望在web服务器启动阶段实例化Servlet对象,需要在web.xml文件中进行相关的配置,例如:
servlet标签中使用load-on-startup标签

注意:使用load-on-startup标签,数字越小,优先级越高

<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>Hello</servlet-class>
    <!--此处设置Servlet对象在服务器启动阶段实例化的优先级-->
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>welcome</servlet-name>
    <servlet-class>Welcome</servlet-class>
    <!--此处设置Servlet对象在服务器启动阶段实例化的优先级-->
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>welcome</servlet-name>
    <url-pattern>/welcome</url-pattern>
</servlet-mapping>

Servlet对象实例化之后存储到哪里了

大多数的Web容器都是将该Servlet对象以及对应的url-pattern存储到Map集合中了
在web容器中有这样一个Map集合
Map<String, Servlet>

key             value
--------------------------------------
/login          LoginServlet对象的引用
/delete         DeleteServlet对象的引用
/insert         InsertServlet对象的引用

启动阶段解析的web.xml文件,做了什么

服务器启动阶段会解析各个webapp中的web.xml文件,做了什么?

在web容器中有这样一个集合
Map<String, String>

key             value
---------------------------------------------------------
/login          cn.qkmango.javaweb.servlet.LoginServlet
/delete         cn.qkmango.javaweb.servlet.DeleteServlet
/insert         cn.qkmango.javaweb.servlet.InsertServlet

实际上,服务器启动时会解析web.xml文件,并且将解析的数据存放在Map集合中,当在浏览器中输入请求的路径时,web容器在容器会找请求路径对应的Servlet对象,如果没有找到,实际上不是去web.xml文件中找此路径对应的完整类名,而是去此Map集合中查找

Servlet接口中的方法写什么代码?何时使用?

Servlet接口中的这些方法中写什么代码?什么时候使用这些方法?

  1. 无参构造方法【以后就不需要考虑构造方法了,尽量别动构造方法】

  2. init()
    无参构造方法和init(),两个方法执行时间几乎是相同的,都只执行一次
    若系统要求对象在创建时刻执行一段特殊的程序,这段程序尽量写到init()方法中
    为什么不建议将代码写到构造法中呢?
    存在风险!当程序员编写构造方法的时候,可能会导致无参构造方法不存在
    Servlet中的init()方法是SUN公司为程序员专门提供的一个初始化时刻,若希望初始化时刻执行一段程序,这个程序可以编写在inti()方法中,将来会被自动调用

  3. service()
    这个方法是必然重写的,因为这个方法需要完成业务逻辑的处理,请求的处理,以及完成响应

  4. destroy()
    这个方法是为程序员提供的一个特殊时刻,这个特殊时刻被成为对象销毁时刻;若希望在销毁时刻执行一段特殊代码,需要将这段代码写到destroy()方法中,会被自动调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值