<<<返回

聊天室应用
在这个部分以及后面部分，你会学到怎样利用Application对象进行实际应用的例子：一个聊天室和实时网络用户状态检测。这些只是对一些技术特点的讨论，不过很有可能这些例子适用于您的网站。 最能打动用户一次次进入你的网站的的是建立一种网络相互通讯的感觉。其中最能说明问题的就是多人聊天室。 注：下面这个例子当前服务器上用在NetScape4.0调试可能会有问题，但是正常使用不会出错（谁会从服务器上进入聊天室？反正访问者不可能采用这种途径） 这个聊天室允许多用户实时进行信息交流，所有用户可以看到彼此的信息，同样，可以增加这些信息。
你需要为这个聊天室创建三个文件，下面是你要创建和修改的文件列表：
·聊天室主页，也就是确立两个分屏及其名称，和分屏方式。
·显示页，显示共有信息并每隔5秒种进行更新。
·信息页，允许用户发出新的信息，这里面包括一个用于输入的文本框。
·Global.asa文件。将改变Application_OnStart事件脚本来进行初始化操作。
创建聊天室主页
首先要创建一个调用分屏的主页，当然这也是最简单的，由于这部分不需要脚本程序，只要命名为chatpage.htm就可以了，见例子17.1
<HTML>
<HEAD><TITLE>xxx聊天室示例</TITLE></HEAD>
<FRAMESET ROWS=”*,100”>
<FRAME SRC=”Display.asp” name=”Toppage”>
<FRAME SRC=”Message.asp” name=”Bottompage”>
</FRAMESET>
</HTML>
为什么一定要分屏呢？因为显示页每隔5秒就更新，而还需要进行信息输出，如果在一个主页上，那么用户肯定会因为信息总是只写了一半就刷新而气疯的。
修改Global.asa文件
为了让这个应用能够进行，必须对Global.asa进行相应修改来设置一些变量初值。这些变量必须是application类型的因为这需要多用户共享，第一个application变量名称是Talk，它其实是所有信息的队列，Talk队列的赋值就是TempArray ，同时Tplace是当前队列的位置，初值为0，脚本如下：
<Script Language=VBScript RUNAT=Server>
Sub Application_OnStart
Dim TempArray(5)
Application(“Talk”)=TempArray
Application(“Tplace”)=0
END SUB
</SCRIPT>
创建信息发送页
信息发送页的目的就是允许用户发送新的信息，用户在文本框中添入要发送的信息，然后按发送按钮就进行自身调用回到同样的页面（当然，脚本里面包括了信息的处理发送）。
这个脚本做两件事情，首先，检查是否有多于4个信息存在。如果多于的话，将Tplace置0，这样防止Talk队列的信息过于繁多。
然后，在Talk队列的Tplace位置中添加新的信息，同时将Tplace指向下一个位置。
下面是该例子完整的脚本程序
例17.2
<%
IF not Request.Form(“message”)=”” THEN
Application.Lock
IF Application(“Tplace”)>4 THEN
Application(“Tplace”)=0
END IF
TempArray=Application(“Talk”)
TempArray(Application(“Tplace”))=Request.Form(“Message”)
Application(“Talk”)=TempArray
Application(“Tplace”)=Application(“Tplace”)+1
END IF
%>
<HTML>
<HEAD><TITLE>xxx聊天室应用示例之信息发送</TITLE></HEAD>
<BODY BGCOLOR=”LIGHTBLUE”>
<FORM Method=”POST” Action=”message.asp”>
<Input Name=”message” Type=Text SIZE=50>
<input type=submit Value=”发送”>
</form>
</Body>
</html>
创建显示页
最后需要创建一个显示这些信息的页面，这个页面将所有的访问者提交的信息显示出来。这个页面每隔5秒钟自动刷新，这使用了客户段牵引请注意这里面HTML的<META>标记所包含的语句，（在Active Server Page中添加一个Refresh的Header）
下面的第一个脚本用来确认当前ASP文件的全部URL地址，这里面还是使用了ServerVariable集合并将得到的全部路径加文件名赋值给MySelf的变量。这个变量就用于在<META>标记包含的语句中指示更新的文件名称及路径。
后面的主要脚本用来显示Talk队列，即所有人发送的信息，这里面用的是For…Next循环。例子17.3是显示页的全部Active Server Pages代码。
例17.3:
<%
MyServer=Request.ServerVariables(“SERVER_NAME”)
MyPath=Request.ServerVariables(“SCRIPT_NAME”)
MySelf=”Http://”&MyServer&MyPath
%>
<HTML>
<HEAD>
<META HTTP-EQUIV=”REFRESH” CONTENT=”5;<%=MySelf%>”>
<TITLE>xxx聊天室应用示例之显示页</TITLE>
</HEAD>
<BODY>
<P Align=Right><%=NOW%></P>
<%
TempArray=Application(“Talk”)
For i=0 to Application(“Talk”)-1
Response.Write(“<p>”&Temparray(i))
NEXT
%>
</BODY>
</HTML>
这样，就可以每隔5秒钟将队列中的消息显示一遍，达到近似于实时交流的目的。
扩展聊天室项目
有很多种方法可以使这种聊天室更加完备，比如说，现在每次只能显示5个信息，那么如果访问者比较多，这就很不够了，因此你可以在最初的Global.asa中将TempArray队列设得大一些，然后在发送信息页相应部分进行修改其限制数目。
这个聊天室的信息发送显然是允许HTML格式的，当然，你可以替访问者考虑一些，比如说，用CheckBox来允许访问者选择自己喜欢的信息发送颜色。
最后，相当重要的是，用户发送的信息应当含有用户代号，不过，这也并不困难，还记得Session变量是干什么的吗？给每个用户登录时创建一个Session变量记录其代号，然后每次信息发送时连同该Session变量一同发送。
注：本书的很多例子都可以在http://aspsite.com中找到。
谁在站上的应用
好的站长都有一个很明确的目的，那就是，希望更多的访问者进入他的站点。那么，如果能够了解当前有多少用户在站上以及在作什么就十分有必要了，这样可以根据观察的信息来完善自己的站点。
现在这个示例就是实时的统计当前访问者以及每一个访问者刚进行的主页请求。
见下面显示结果：
5/19/1998 5:38:45 PM
当前全部访问者一共7个
访问者ID
当前访问页
22856
/whoson.asp
22877
/examples/chapter16/ex3.asp
23012
/chat/chatpage.asp
23013
/chat/chatpage.asp
23014
/index.asp
23015
/chat/chatpage.asp
23016
/search/search_gb.asp
这个示例说明了怎样将一个对象赋值给一个application对象，一个字典对象用来储存访问者信息，当访问者发出了一个请求，这个对象就进行了更新，下面是这个应用所需要制作和修改的文件列表：
·Global.asa文件：针对这个应用Application_OnStart事件和Application_OnEnd事件都需要进行修改。
·GrabStates文件:：这个文件更新Dictionary对象，你需要在每一个想要跟踪的ASP文件首包含这个脚本。
·WhosOn页：就是显示目前站上用户以及目前状态。
修改Global.asa文件
做这个应用项目，你需要修改两个脚本，首先是创建一个Dictionary对象，用来存储访问者信息，由于这个对象的创建只需要一次，那么可以在application_OnStart事件中进行：
<SCRIPT LANGUAGE=VbScript RUNAT=Server>
SUB Application_OnStart
Set Application(“Stats”)=Server.CreateObject(“Scripting.Dictionary”)
END SUB
</SCRIPT>
只是添加了一句脚本语言。这个语句将新创建的一个Dictionary事例赋值给名字为stats的application变量，创建之后，在整个应用中就可以一直使用了。
注：在application的范围内创建对象的更多方法将在下一章中有详尽的讨论。
在一个用户的Session结束时，我们必须把他的信息清除，这就需要修改Session_OnEnd对象：
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnEnd
IF Application(“Stats”).Exists(Session.SessionID) THEN
Application.Lock
Application(“Stats”).Remove(Session.SessionID)
Application.UnLock
END IF
END SUB
</SCRIPT>
用户将根据他们的SessionID来被跟踪，字典中的名字为stats的键与相应的Session Ids相对应，首先检查字典中是否有有关这个已经离开的SessionID的信息，如果有，则进行删除（因为这个用户Session已经结束了）
创建GrabStats文件
想要决定当前页的浏览者，就必须在每一个要进行跟踪的页面前包含一个脚本文件。这个文件其实只有一行语句，见例子17.4
例子17.4 GrabStats.asp
<%
Application(“Stats”).item(“Session.SessionID)=Request.ServerVariables(“SCRIPT_NAME”)
%>
这个脚本将当前页的路径加入到Dictionary对象中去。当前路径依然是通过ServerVariable变量获得。然后，该变量值赋值给字典中对应当前用户ID的键中（如果不存在，则自动创建。）
将该脚本存为GrabStats.asp之后，那么在你需要进行跟踪的ASP文件首行加入这么一句代码<!--#INCLUDE VIRTUAL=”GrabStats.asp” à
创建显示谁在站上的页面
这个主页就是显示当前使用者。显示的是每一个使用者的SessionID和他的最后一次请求的页面，下面是这个显示页面的全部代码：
例17.5 WhosOn.asp
<!-- #INCLUDE VIRTUAL=”GrabStats.asp” -->
<%
MyServer=Request.ServerVariables(“SERVER_NAME”)
MyPath=Request.ServerVariables(“SCRIPT_NAME”)
MySelf=”Http://”&MyServer&MyPath
%>
<HTML>
<HEAD>
<META HTTP-EQUIV=”REFRESH” CONTENT=”20;<%=MySelf%>”>
<TITLE>xxx谁在站上应用示例之显示页</TITLE>
</HEAD>
<BODY>
<% Application.Lock
Set TempStats=Application(“Stats”)
Application.Unlock
%>
<Center>
当前访问者一共<%=TempStats.Count %>个
<table Border=1 cellspacing=10>
<tr><th>访问者ID</Th><th>当前访问页</th></tr>
<%
TempItems=TempStats.Items
TempKeys=TempStats.Keys
For I=0 to UBOND(TempKeys)
%>
<tr><td><%=tempKeys(i) %></td><td><%=TempItems(i) %></td></tr>
<% next %>
</center>
</table>
</Body>
</Html>
第一行包含的文件GrabStats.asp就是前面的那一部分所创建的，也就是说，该主页的访问情况也在跟踪统计之内。
第一个脚本就是接受当前路径，没有什么可以再解释的，只是这次更新时间改为20秒而已。
第二个脚本是将application的字典对象变量存在一个临时的TempStats字典对象中，这个对象会在该页结束时自动清除。
后面的脚本则是循环显示所有的键和值。显示结果见本节开始部分。
扩展这种应用
这种应用示例对于了解自己的网站访问情况是很有好处的，你可以了解当前网站上的访问者，也可以了解他们在浏览哪方面的内容。
有很多种方式来使这种应用功能更加完备，例如，想要从SessionID中了解用户信息太难了，如果你的网站有注册登录界面，那么在字典对象中完全可以用登录名来代替毫无表达意义的ID值。
另外，你完全可以跟踪用户访问的时间长度，这种对脚本的修改也不算复杂，例如，你只需要建立第二个application变量来包含另一个字典对象，专门存储用户停留时间的信息。