Servlet的生命周期和变量范围

来源:互联网 发布:系统优化清理软件 编辑:程序博客网 时间:2024/06/13 09:50
 

Servlet的生命周期和变量范围

1、引出:为什么要了解变量声明周期

第一、               我们知道程序在运行时间都要加载到内存中执行,而变量也同样需要分配一定的内存,对于引用类型的变量,它引用的对象同样也占用内存。

第二、               内存不是无限的(内存2GB看似很大,但是也不是无限可用的),我们通常要同时运行很多程序,而且程序的规模是越来越大。

第三、               有些变量可能只需要短暂使用,有些只要程序不停止都需要使用,从节约内存角度看,在一个变量不需要时间,我们要及时释放该变量占用的内存,因而程序设计语言都具有对不同生命周期特性的支持

第四、               我们在定义变量时间要做到满足实际需求即可。如果一个短生命周期即满足要求,给它一个更长的生命周期虽然能满足要求,但是浪费了内存,内存是宝贵的。

第五、               变量的生命周期和可见性(范围或作用域)区别:变量的生命周期主要从变量存在时间考虑;而作用域主要从空间上考虑,在那个范围内可以访问到变量。

 

2、Java变量类型

在Java语言,Java是一切皆对象,对于声明一个对象类型的变量,当没有引用对象时间,该变量就进入垃圾回收,因而对于引用类型的变量,我们主要考虑它引用的对象生命周期。

Java变量的声明周期和可见性

1、类变量(静态域):一个类得实例变量前加上static,就是一个类变量,当类一加载,就会被进行初始化等操作。该变量对于该类的所有实例都可以访问到,都是同一个对象。

2、实例变量(实例域):实例变量在新建类得时间进行初始化等操作,根据访问修饰符不同,可见性不同,在一个类的实例中,该变量可以被该实例的所有方法访问。该类得不同实例间相同变量名变量分配不同的内存空间。

3、方法变量:该变量只能在方法内部访问,当方法退出时,该变量也被销毁了。

4、代码块变量:

 

3、 Servlet的生命周期

Servlet是一个类,想使用它的对象同样有创建,使用和销毁,只不过创建这个对象不是我们自己在程序中通过new HelloServlet(…)这样的语句来创建,它是基于HTTP协议来处理客户端请求,并给出客户端响应。而是由我们的Servlet引擎帮助我们创建,这时我们就需要了解引擎:

(1)什么时间帮助我们创建?在创建时间如何进行加入我们自己的对变量初始化操作?我们如何控制让它何时初始化?

(2)当客户端请求到来时,我们需要知道如何加入我们自己对响应的处理?(3)什么时间销毁,在销毁前如何加入一些对资源释放的操作

(4)是不是我们随便写一个类就能够成为一个Servlet呢?

对于以上问题,我们如果认真思考了,就会知道,我们和引擎之间需要首先沟通好,引擎要告诉我们它怎么调用我们写的初始化代码,怎么调用我们写的资源释放代码,当客户请求来的时间,如果调用我们对请求处理的代码等。这些工作都需要我们和引擎之间达成协议,通过方法完成,我们完成方法,引擎来调用方法,这样就解决了以上问题。实际上Servlet和我们是通过HttpServlet类来沟通的,我们实现HttpServlet的子类,重写HttpServlet的某个方法,这样引擎就会在初始化时间调用我们的Init方法,它按照HttpServlet中方法关于Init的方法声明去调用,由于我们我也实现了该方法,因而能调用成功。大家设想一下,就如同,你手机没有拍照功能,我让你用手机拍照就不可能。程序里也如此,完成某个功能是调用某个类的方法来完成的。

3.1 Servlet的生命周期

  要想使用Servlet类的实例,首先要加载该类得实例,调用类的构造函数创建类得实例。

  Servlet提供了一个Init方法让我们加入自己的初始化操作。

  当每次请求到来时间,它首先调用service方法,然后该方法根据我们的请求方式不同,接着调用doPost或doGet方法等,我们可以在doPost或doGet方法中加入我们对请求的处理代码。

  当要销毁Servlet对象时间,给我们提供了一个destroy方法,我们在该方法中加入资源释放等操作。

3.2 Servlet变量的可见性:HttpRequest、HttpSession和ServletContext,这里讲的可见性,其实就是Servlet之间共享或传递对象的范围。

  由于当我们处理完请求后,需要把请求转发到一个JSP或Servlet来作为响应或者在不同Servlet之间共享或传递一些对象,有些对象只需要在一次请求中可以访问(HttpRequest),有些需要针对客户从进入网站到离开网站发出的一系列请求间可以访问(HttpSession),有些需要我们对整个应用的所有Servlet实例可以访问(ServletContext)。