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()的方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值