当前位置:首页 > x保养 >

servlet的生命周期

  • x保养
  • 2021-12-11

谈到生命周期,大多数人都知道,有朋友问servlet的生命周期,当然了,还有人问servlet的生命周期,这到底怎么回事呢?事实上servlet的生命周期呢,下面小编就为大家说说servlet的生命周期,希望大家会喜欢。

servlet的生命周期

Servlet被服务器实例化后器运init,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

分为4个:

1.实例化

客户端发送请求时,Servlet会查询容器否存在此Servlet的实例,如果在,就创建一个实例.如果存在,就取出来.

2.初始化

当Servlet实例化完毕后,Servlet会调用init()方法进行初始化操作.初始化的目的是:建立jdbc连接,连接数据库,设置一些初始化参数等

3.服务

当Servlet初始化之后,就处于能响应的就绪阶段.如果请求到来时,这时候Servlet容器会调用service()方法进行处理用户请求.

4.销毁

当Servlet需要销毁的时候或者容器关闭的时候,Servlet会调用destroy()方法进行销毁,destroy方法指定那些需要销毁, 但是destroy不会自己去销毁.而是交给容器销毁.

简述servlet的生命周期

servlet:它的作用就是一个桥作用,相当于mvc结的c→control控制层,它可以获得前台数并调用后台方法对数据进行处理之后再将结果发回给前台。

在容器tomcat启动之后,servlet不会立即被访问,除非在配置文件中加上了启动即初始化,否则,servlet将会在第一次被访问的时候被初始化,然后用这个初始化对象响应用户请求,当该请求结束了,servlet将不会被销毁,等到第二次,第三次....之后所有的请求都将是同一个servlet对象在处理,知道tomcat容器关闭,servlet被销毁。

简述Servlet的运行原理与生命周期

Servlet生命周为三个阶段:

 1,初始化阶段 :调用init()方法

  2,响应请求阶段:调用service()方法

  3止阶段:调用destroy()方法

Servlet初始化阶段:

  在下列时刻Servlet容器装载Servlet:

    1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:

<loadon-startup>1</loadon-startup>

    2,在Servlet容器启动后,客户首次向Servlet发送请求

    3,Servlet类文件被更新后,重新装载Servlet

  Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

    

Servlet工作原理:

  首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见,service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。

  每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。

  Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。

public void service(ServletRequest req,ServletResponse res)

throws ServletException,IOException

{

HttpRequest request;

HttpResponse response;

try

{

req = (HttpRequest)request;

res = (HttpResponse)response;

}

catch(ClassCastException e)

{

throw new ServletException("non-HTTP request response");

}

service(request,response);

}

代码的最后调用了HTTPServlet自己的service(request,response)方法,然后根据请求去调用对应的doXXX方法,因为HttpServlet中的doXXX方法都是返回错误信息,

protected void doGet(HttpServletRequest res,HttpServletResponse resp)

throws ServletException,IOException

{

String protocol = req.getProtocol();

if(protocol.equals("1.1"))

{

resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg);

}

esle

{

resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);

}

}

servlet的生命周期中哪些方法只调用一次

servlet的初始化销servlet的整个生命周只发生一次因此,init()和destroy()方法在servlet的生命周期中只调用一次。

其中init()方法在首次创建servlet时调用,在处理每个用户的请求时不再调用。因此,init()方法主要用于一次性初始化操作。

例如:创建或加载一些将在servlet生命周期中使用的数据(如果有的话),或者执行一些一次性计算(如果必要的话)。同样在服务器删除或破坏servlet的实例,调用servlet的销毁方法。

所以servlet有机版本将关闭数据库连接(如果需要)停止线程后台正在运行的权利(如果需要的话),或执行其他清理。

其他方法:

1.服务()方法

service()方法是Servlet的核心。每次客户端请求一个HttpServlet对象时,将调用该对象的service()方法,并将一个“ServletRequest”对象和一个“ServletResponse”对象作为参数传递给该方法。

service()方法已经存在于HttpServlet中。默认的服务函数是调用与HTTP请求方法对应的do函数。

2.DoGet()方法

当客户端通过HTML表单发出HTTPGET请求或直接请求URL时,就会调用doGet()方法。与GET请求相关的参数被添加到URL的末尾,并与请求一起发送。当不修改服务器端的数据时,应该使用doGet()方法。

3.DoPost()方法

当客户通过HTML表单发出HTTPPOST请求时,将调用doPost()方法。与POST请求相关的参数作为单独的HTTP请求从浏览器发送到服务器。当需要修改服务器端数据时,应该使用doPost()方法。

servlet的生命周期,什么情况下调用doGet()和doPost()?

至于它方法,就看方式 <form action="myServlet" method="get" > method属性的值是get,它调用对应servlet的doGet方法。 同理,method属性的值是get,它就去调用对应servlet的doPost方法。 一般来说,不管采用那种提交方式,在servlet里要做的事情是一样的。所以,我们很多情况下,在一个方法里面调用另一个方法,这样随你那种方式提交的,都可以转去做一种处理

servlet的生命周期分为几个阶段

Servlet生命周期分为三个阶段:

1、初始化阶段 , 调用init()方法;

2、响应客户请求阶段, 调用service()方法;

3、终止阶段, 调用destroy()方法

servlet的生命周期有哪几个阶段

Servlet生命周期分为三个阶段:

1、初始化阶段 , 调用init()方法;

2、响应客户请求阶段, 调用service()方法;

3、终止阶段, 调用destroy()方法。

servlet的生命周期

1.装载Servlet。这作一般是动态执行的。然而,Server通提供一个的选项,用于在Server启动时强制装载和初始化特定的Servlet。

2.Server创建一个Servlet的实例

3.Server调用Servlet的init()方法

4.一个客户端的请求到达Server

5.Server创建一个请求对象

6.Server创建一个响应对象

7.Server激活Servlet的service()方法,传递请求和响应对象作为参数

8.service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息

9.service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet()或doPost()或程序员自己开发的新的方法。

10.对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用init()方法。一般Servlet只初始化一次(只有一个对象),当Server不再需要Servlet时(一般当Server关闭时),Server调用Servlet的Destroy()方法。

Servlet生命周期

Servlet生命Servlet运行在Servlet容器中,其生期由容器来。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法示。Servlet的生命周期包含了下面4个阶段:(1)加载和实例化Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。(2)初始化在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立,Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可用。(3)请求处理Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可用)响应。如果UnavailableException异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂时忙,不能处理请求)响应。(4)服务终止当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。

猜你喜欢