前面章节介绍的session对象可以记载特定客户的信息,与此相反本章所要介绍的appliaction对象可以记载所有客户的信息,这就好比session是教室中每个学生的储物箱,只有箱子的主人才能使用,而application是教室的公共储物箱,每个学生都可以使用。但是不同教室的学生无法使用各自的公共储物箱,这就是不同主机或虚拟主机的application是独立的,无法互相访问。简单来说不同的客户必须访问不同的session对象,但可以访问公共的application对象。
application对象是让所有客户一起使用的对象,通过该对象所有客户都可以存取同一个application对象。application不象session有效期的限制,它是一直存在的,从服务器的启动直到服务器的停止。比如说服务器重新启动,那么application中的信息就丢掉了。
application和session对象相似,都是主要用于存取信息,本节介绍一下application的存取信息的方法。
1. public void setAttribute(String name, Object value)
将特定的值以特定的关键字存入当前主机或虚拟主机所对应的application对象中。关键字是唯一的,如果关键字已存在则此方法会覆盖先前所对应的值。如果value值为null,则此方法就等价于removeAttribute(name)方法。
参数:name用户指定的关键字。
value指定关键字所对应的值。
异常:如果关键字为null则此方法会抛出IllegalArgumentException异常。
2. public Object getAttribute(String name)
读取特定的关键字所对应的值。
参数:name用户指定的关键字。
返回:指定关键字所对应的值,如果关键字不存在则返回null。
3. public void removeAttribute(String name)
删除特定关键字所对应的值。如果指定的关键字不存在则本方法什么都不做。
参数:name用户指定的关键字。
注意:以上所有方法都是同步的,所以多个线程同时使用这些方法是安全的。 |
application对象最典型的应用就是聊天室,大家的发言都存放到一个application对象中,彼此就可以看到发言内容了。
下面来看一个简单的聊天室例子,该例子使用了上下框架,共3个文件。
框架文件chat.htm的源程序如下:
1 2 3 4 5 6 7 8 9 |
<html> <head> <title>聊天室</title> </head> <frameset cols="72%,*"> <frame name = "message" src="chat1.dqm"> <frame name = "say" src="chat2.dqm"> </frameset> <html> |
从上面源程序的6和7行可以看到此框架文件包含了chat1.dqm和chat2.dqm这二个动态文件。
保存发言信息的chat2.dqm动态文件源代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 |
<%@page import = "java.util.ArrayList;java.util.Date" %>
<html> <head> <title>发言</title> </head>
<body> <form name="form1" method="post" action=""> 请发言:<input type="text" name="pronunciation" size="30"> <input type="submit" value="send"> </form>
<% String tempLine; if ((tempLine = request.getParameter("pronunciation")) != null) { //如果有发言内容 ArrayList<String> content = (ArrayList)application.getAttribute("chatContent"); if (content == null) { content = new ArrayList<String>(); application.setAttribute("chatContent", content); } int overNo = content.size() - 39; if (overNo > 0) { //如果先前存放的对话太多,则把先前多余的发言删除 for (int i = 0; i < overNo; i++) { content.remove(i); } } Date date = new Date(); content.add(request.getRemoteAddr() + "<font color=\"#FF0000\">(" + date + ")</font><br>" + tempLine + "<br>"); } %>
</body> </html> |
从上面源程序29行可以看出每条聊天内容、此内容发言的时间和发出此内容用户的IP都会保存在一个ArrayList类型的content变量中。而content变量是与application相关联的,如果application中没有content则表明是第一次执行,于是新建一个content存入application中,而如果application中已有content则使用这个已存在的content(源程序17到21行)。如果先前保存的聊天记录过多则只保存最近的40条发言(源程序22到27行)。
显示发言信息的chat1.dqm动态文件源代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<%@page import = "java.util.ArrayList" %>
<html> <head> <title>内容</title> <meta http-equiv="refresh" content="5"> </head>
<body> <% ArrayList<String> content = (ArrayList)application.getAttribute("chatContent"); if (content != null) { for (int i = content.size() - 1; i >= 0; i--) { out.println(content.get(i) + "<br>"); } } %> </body> </html> |
第6行“<meta http-equiv="refresh" content="5">”表示该页面5秒钟自动刷新一次。刷新的目的是不断显示最新发言内容。源程序10到17行是从application中读取ArrayList类型的content变量并将其中的发言内容显示出来。
执行的画面如下:
图9-2-1
可以通过从不同的客户端访问来显示多人聊天的情况。