4.6 application内置对象

application对服务器而言,可以视为一个所有联机用户共享的数据存取区,application中的变量数据在程序设置其值时被初始化,而当关闭网页服务器,或者超过预设时间而未有任何用户联机时将自动消失,图4-29所示说明了application的意义。

图4-29 application对象示意图

对于每一个联机浏览网页的用户来说,application对象用于存储其共享数据,无论是网站中任何一份网页,用户存取的数据内容均相同,可以将其视为传统应用程序中的全局共享数据。需要注意以下几个方面:

application对象保存了一份应用系统中的公有数据,一旦创建了application对象,除非服务器关闭,否则application对象将一直保存,并为所有客户共享。

服务器启动后就会自动创建application对象,当客户在所访问的网站的各个页面之间浏览时,这个application对象都是同一个,直到服务器关闭。但是与session不同的是,所有客户的application对象都是同一个,即所有客户共享这个内置的application对象。

在JSP服务器运行时,仅有一个application对象,它由服务器创建,也由服务器自动清除,不能被用户创建和清除。

4.6.1 存取application中的数据

application对象是通过ServletContext接口衍生而来的,利用此对象所提供的各种方法,便可处理application的数据,下面说明存取application中数据的方式。

1. 建立application变量

除了系统预设的application变量外,要在application中建立变量数据必须使用setAttribute()方法,建立application变量的语法如下:

     application.setAttribute("变量名称",变量内容)

其中“变量内容”可为字符串或者其他对象类型,下面是设置application变量数据的实例:

上述代码会在application中建立3个变量数据:id、expire与level。这3个application变量存在于系统当中,各个网页均能访问其内容。

2. 返回application中的变量

在设置了application中的变量数据之后,接着在各个网页中便可利用getAttribute()方法来取得所设置的application变量内容,使用语法如下:

     application.getAttribute("变量名称")

此方法返回的数据内容为对象(Object)类型,若在网页中加入下面的程序代码,则会在浏览器上显示objApp变量存储的内容。

3. 删除application变量

要删除application中的变量数据,必须引用removeAttribute(),语法如下:

     application.removeAttribute("变量名称")

4. 返回所有application变量

getAttributeNames()方法会返回application中所有变量名称的集合对象,数据类型为Enumeration。

getAttributeNames()语法如下:

     application.getAttributeNames()

4.6.2 使用application对象取得信息

application对象除了可设置application中的变量数据外,还可用来取得服务器或网页的信息,用来取得这些信息的常用方法如表4-7所示。

表4-7 使用application对象获取信息的常用方法

这些方法成员的使用方式相当直接,这里不再进行示范说明,与session的方式相同,其中的差异在于两者变量存在的有效范围,用户可以自行在JSP网页中进行引用,以了解其返回的结果。

4.6.3 application对象应用实例

【例4-15】存取application对象数据。

把【例4-12】稍作更改。将sessionData.jsp改为applicationData.jsp,采用application.setAttribute()方法设置两个application变量,usingSession.jsp改为usingApplication.jsp,采用application.getAttribute()方法获得两个变量的数据内容(代码不再详述)。

首先在浏览器中输入http://localhost:8080/ch04/application/usingApplication.jsp,结果如图4-30所示,表示未设置application变量。

图4-30 直接查看usingApplication.jsp的运行结果

在applicationInfo.jsp中输入数据,浏览applicationData.jsp网页,其中设置了application变量,并且显示超级链接,单击超级链接,将出现usingApplication.jsp,显示设置好了的数据内容,如图4-31所示。

图4-31 设置并获取application变量

由于application代表整个网站应用程序的共享数据,因此若是重新启动浏览器,当再次查看usingApplication.jsp时,将会看到相同的结果。

【例4-16】创建applicationCount.jsp页面,利用applicatin对象实现简单页面计数器。

applicationCount.jsp的代码如下:

在浏览器中输入http://localhost:8080/ch04/application/applicationCount.jsp,并不断刷新,会看到计数器不断增加。重新开启新的浏览器窗口,计数器也会增加。程序运行结果如图4-32所示。

图4-32 applicationCount.jsp执行结果

当然,如果把本例中的application改为sesssion,刷新页面也能实现页面计数器。但是开启新的浏览器,会重新从0开始计数,这就说明了session和apllication的作用域是不同的。但是,一般session做计数器是记录访问的用户数而不是访问的次数。

比较【例4-16】和【例4-14】会发现,用application实现的计数器时,Num采用局部变量;而用session实现的计数器,Num采用全局变量。

通过以上比较,读者应该能够掌握session对象和application的区别。

在JSP中application可以在整个应用运行期间保存共享数据,实现用户间数据的共享;application对象是应用程序级的,如果application中不存在String name,则通过方法Object getAttribute(String name)获得的对象是null;在同一个网站下的任何地方都可以对application对象进行操作,主要操作有两个,即下面的两个方法:Object getAttribute(String name),从application对象中提取指定的对象;void setAttribute(String name, Object value),将对象添加到application对象中。下面通过一个小的应用实例来实现用户间数据的共享。

【例4-17】application对象常用方法实现共享留言板。此例包括3个程序,代码分别如下。

inputMessage.jsp代码如下:

checkMessage.jsp代码如下:

showMessage.jsp代码如下:

通过运行inputMessage.jsp输入用户和留言信息,运行效果如图4-33所示。单击“留言”按钮,checkMessage.jsp把用户输入的信息及时间等保存在Vector对象v中,并且通过application.setAttribute("message", v);保存在application对象中,显示留言成功,如图4-44所示。经过多位用户留言,通过“查看留言板”,showMessage.jsp通过application.getAttribute ("message");取出所有留言信息,并通过循环显示所有用户的留言信息,如图4-35所示。

图4-33 inputMessage.jsp输入信息

图4-35 showMessage.jsp显示所有留言

图4-44 显示聊天内容

图4-34 checkMessage.jsp留言成功