servlet的初始化、销毁等方法

时间:2022-08-07 19:42:07

1、init方法的调用

   当Servlet被装载并实例化后,容器会调用init方法对Servlet进行初始化,只有在init方法调用成功后,Servlet才处于service状态,能够处理客户端的请求。

   注意: 1) 在整个Servlet的生命周期中init方法仅被调用一次

         2) 用户定义的Servlet中可以覆盖有参或无参的init方法,但是若覆盖有参init方法,最好先调用super.init(config),对变量config进行赋值初始化。而覆盖无参init可以不调用super.init(),推荐覆盖无参init,为了使用方便。

         3) 用户定义的Servlet中可以不去覆盖init方法,覆盖只是为了使用方便(如:获得web.xml中描述的初始化参数。

2、service方法的调用

    当Servlet被装载实例化并初始化后,客户端发起请求,容器就会调用Servlet实例的service方法对请求进行处理。

    注意: service方法在生命周期中被调用多次,这跟请求的次数有关。

3、Servlet实例的销毁

     当容器在销毁Servlet实例前会先去调用destroy(),

     在此方法中可以作下列工作:

    1) 恢复一些初始化的变量

    2) 释放资源

    3) 控制所有运行在Servlet中的线程在Servlet实例被销毁之前能正常运行结束

    4) 记录日志信息

    注意: 1) destroy()在生命周期中仅被调用一次

          2) 用户定义的Servlet中可以不覆盖destroy()

4、doGet() 方法

当一个客户通过 HTML 表单发出一个 HTTP GET 请求或直接请求一个 URL 时,doGet() 方法被调用。

与 GET 请求相关的参数添加到 URL 的后面,并与这个请求一起发送。

当不会修改服务器端的数据时,应该使用 doGet() 方法。

5、doPost() 方法
当一个客户通过 HTML 表单发出一个 HTTP POST 请求时,doPost() 方法被调用。

与 POST 请求相关的参数作为一个单独的 HTTP 请求从浏览器发送到服务器。

当需要修改服务器端的数据时,应该使用 doPost() 方法。



生命周期

1) 客户端请求该 Servlet;

2) 加载 Servlet 类到内存;

3) 实例化并调用init()方法初始化该 Servlet;

4) service()

(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions());
5) destroy()。

加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server 通常会提供一个管理的选项,用于在                  Server启动时强制装载和初始化特定的 Servlet。Server 创建一个 Servlet的实例

第一个客户端的请求到达 Server,Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)

一个客户端的请求到达 Server

Server 创建一个请求对象,处理客户端请求
Server 创建一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。