ServLet工作原理图解和生命周期


Servlet的工作原理:

1、浏览器依据IP port建立连接;

2、浏览器要将要请求的输数据打包并发送;

3、Servlet容器解析请求数据包,将解析之后的结果封装到request对象中,并且同时创建一个response对象,用来封装响应信息;

4、Servlet容器创建Servlet对象,然后调用service方法,容器会事先将创建好的request,response对象作为参数传入。

注意:此处的创建的 servlet 对象不是单例,在默认情况下,容器收到请求的时候创建;在特殊的情况下,配置有<load-on-startup>参数的 servlet,容器在启动后机会自动创建。该参数是一个大于等于 0 的参数,这个值越小,优先级就越高,高度注意:Servlet 在容器中有一个实例对象,而且只要 request 就会被创建。

5.servlet 可以访问 request 对象获得请求的参数,也可以将处理的结果写到 response 对象上。

6.容器中 response 中获得处理结果,然后打包发送给浏览器

7.浏览器解析服务器响应的结果,生成新的页面输出Servlet 

生命周期Servlet:

容器如何创建 Servlet 对象、如何为 Servlet 对象分配、准备资源、如何调用对应的方法来处理请求以及如何销毁 Servlet 对象的整个过程即Servlet 的生命周期。

Servlet 的生命周期的四个阶段:

阶段一、实例化

1.什么是实例化?

容器在调用 servlet 的构造器来创建相应的对象

2.什么时候实例化?

默认情况下,容器一旦受到 request 请求,servlet 对象就会被创建;但是在特殊的情况下,在 web.xml 文件中配置有<load-on-startup>参数的servlet,容器在启动后就会自动创建。

注意该参数是一个大于等于 0 的参数,这个值越小,优先级就越高。

高度注意:Servlet 在容器中有一个实例对象,而且只要 request 就会被创建。

阶段二、初始化

1.什么是初始化?

实例化以后,容器就会立即调用 servlet 对象的 init 方法,注意:init 方法只会执行一次。一般情况下不用写 init 方法,因为 GenericServlet 已经提供了该方法的实现方法。 (将容器传递来的 ServletConfig 对象保存起来)

2.如何实现自己的初始化逻辑呢?

只需要覆盖/重写 override init()方法即可

阶段三、就绪/调用

1.什么是就绪?

容器收到请求后调用 Servlet 对象的 service 方法;

2.HttpServlet 的 service 方法是如何实现的?

依据请求的方式(get、post)调用对应当的 doGet 和 doPost 方法。

注意:我们写 Servlet 可以选择 override HttpServlet 提供的 doGet 和doPost 方法,也可以选择 override HttpServlet 的 service 方法。

阶段四、销毁Servlet 

容器在销毁 Servlet 对象时会调用 destroy 方法来释放资源。该方法只会执行一次;Servlet 容器也有自身管理 Servlet 对象的准则,整个生命周期并不需要人为进行干预。destroy 方法的作用是用来释放资源。 

(init 方法获得的资源如果需要在这里释放即可)

Servlet 生命周期中的接口:

Servlet 接口init(ServletConfig config)service(ServletRequest req,ServletResponse res)destroy( )GenericServlet 抽象类实现了 Servlet 接口中的几个方法:service、destroyHTTPServlet 抽象类继承自 GenericServlet 抽象类注意:HttpServlet 又是在继承 GenericServlet 的基础上进一步的扩展,一个是 public voidinit(ServletConfig config),另一个是 public void init()。他们有如下的关系: init(ServletConfig config)方法由 tomcat 自动调用,它读取 web 工程下的 web.xml,将读取的信息打包传给此参数,此方法的参数同时将接收的信息传递给 GenericServlet 类中的成员变量 config,同时调用init()。以后程序员想重写 init 方法可以选择 init(ServletConfig config)或者init(),但是选择 init(ServletConfig config)势必会覆盖此方法已实现的内容,没有为 config 变量赋值,此后若是调用 getServletConfig()方法返回 config时会产生空指针异常的,所以想重写 init(ServletConfig config)方法,必须在方法体中第一句写上 super.init(config) ,为了防止程序员忘记重写super.init(config)方法 sun 公司自动为用户生成一个 public void init()的方法。



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值