9章 application内置对象

 

  前面章节介绍的session对象可以记载特定客户的信息,与此相反本章所要介绍的appliaction对象可以记载所有客户的信息,这就好比session是教室中每个学生的储物箱,只有箱子的主人才能使用,而application是教室的公共储物箱,每个学生都可以使用。但是不同教室的学生无法使用各自的公共储物箱,这就是不同主机或虚拟主机的application是独立的,无法互相访问。简单来说不同的客户必须访问不同的session对象,但可以访问公共的application对象。

 

 

9.1 application对象保存和读取信息

application对象是让所有客户一起使用的对象,通过该对象所有客户都可以存取同一个application对象。application不象session有效期的限制,它是一直存在的,从服务器的启动直到服务器的停止。比如说服务器重新启动,那么application中的信息就丢掉了。

applicationsession对象相似,都是主要用于存取信息,本节介绍一下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用户指定的关键字。

 

 

注意:以上所有方法都是同步的,所以多个线程同时使用这些方法是安全的。

 

 

9.2 application对象实际应用

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>

 

  从上面源程序的67行可以看到此框架文件包含了chat1.dqmchat2.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(源程序1721行)。如果先前保存的聊天记录过多则只保存最近的40条发言(源程序2227行)。

 

显示发言信息的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秒钟自动刷新一次。刷新的目的是不断显示最新发言内容。源程序1017行是从application中读取ArrayList类型的content变量并将其中的发言内容显示出来。

 

  执行的画面如下:

9-2-1

 

可以通过从不同的客户端访问来显示多人聊天的情况。