整个聊天室页面chat.asp是由3个框架页组成。左上框架是display.asp,用于显示聊天信息;右上框架是online.asp,用于显示在线用户情况;下边的框架是talk.asp,用于输入聊天信息。聊天室主页面如图8-12所示。
图8-12 聊天室主页面
1.chat.asp页面
chat.asp页面首先判断用户是否通过了登录页面,然后对填写的昵称进行一定的重复性检查,判断是否为空及是否当前已经有相同昵称的用户在线上。如果都通过,则把该用户的昵称插入到online数据表,标识这个昵称目前正在线上,然后把聊天室的框架显示出来。聊天室页面chat.asp的程序代码如下:
〈%
′判断用户是否经过登录页面
If Isempty (Session (″isconnected″))Then
Response .redirect ″default .asp″
Response .end
End If
′判断用户填写的昵称是否为空串
nickname=trim(request (″nickname″))
If nickname=″″Then
Response .write ″昵称不能为空!″
Response .end
End If
′判断数据库中是否存在同样昵称的用户,并且该用户正在线上
Set Conn=Server .createobject (″adodb .connection″)
Conn.Connection String=″DRIVER={Microsoft Access Driver (*.mdb)};DBQ=″&_
Server .MapPath (″aspdb .mdb″)
Conn.open
Set objonliners=Server .createobject (″Adodb .recordset″)
sqlstring=″select*from online where name=′″&nickname&″′″
objonliners .open sglstring,Conn
If not objonliners .eof Then
Response .write ″重名,请换个昵称进入 !
Response .end
End If
Set objonliners=nothing
Set objonliners=server .createobject (″adodb .recordset″)
sqlstring=″insert into online (name)values (′″&nickname& ″′)″
Application.Lock
objonliners .open sglstring,conn
Application .Unlock
Session (″nickname″)=nickname
%〉
〈HTML〉
〈HEAD〉
〈TITLE〉聊天室〈/TITLE〉
〈META http-equiv=″Content-Type″content=″text/html;charset=gb2312″〉
〈/HEAD〉
〈FRAMESET rows=″*,80″ frameborder=″Yes″border=″0″ framespacing=″0″〉
〈FRAMESET cols=″*,201″frameborder=″Yes″border=″0″framespacing=″0″ rows=″*″〉
〈FRAME name=″mainframe″ src=″display.asp″〉
〈FRAME name=″rightframe″ scrolling=″NO″ noresize src=″online .asp″〉
〈/FRAMESET〉
〈FRAME name=″bottomframe″scrolling=″NO″noresize Src=″talk.asp″〉
〈/FRAMESET〉
〈NOFRAMES〉〈BODYbgcolor=″#FFFFFF″text=″#000000″〉
〈/BODY〉〈/NOFRAMES〉
〈/HTML〉
2.talk.asp页面
talk.asp 程序并不仅仅是一个简单的表单提交页面。由于处理talk.asp 表单的ASP 程序talkinsert.asp 不仅仅要获取用户填写的发言语句,还要知道这句话是谁说的。因此必须在用户提交发言语句的同时把该用户的昵称也传递到talkinsert.asp。这里使用了Form 表单的Hidden控件。Hidden控件并不会显示在浏览器窗口中,但是它可以像其他Form 的控件一样传递参数。
下面是talk.asp的具体代码。
〈HTML〉
〈HEAD〉
〈TITLE〉聊天室〈/TITLE〉
〈META http-equiv=″Content-Type″Charset=gb2312″〉
〈/HEAD〉
〈BODY bgcolor=″#FFFFFF″text=″#000000″〉
〈FORM name=″talk″method=″post″action=″talkinsert.asp″〉
〈p〉谈天内容:
〈INPUT type=″text″name=″content″〉
〈INPUT type=″hidden″name=″whotalk″value=〈%=Session(″nickname″)%〉〉
〈INPUT type=″submit″name=″submit″value=″我说完了″〉
〈/P〉
〈/FORM〉
〈/BODY〉
〈/HTML〉
注意
在chat.asp 中把该用户的昵称存储在一个Session 变量Session(″nickname″)中。这里把hidden控件的值设置为这个变量,即把该用户的昵称也传递到talkinsert.asp。
3. talkinsert.asp页面
下面是talkinsert.asp的具体代码。〈%
Dim content,conn,objchaters,sglstring
content=trim(request(″content″)) ′获取讲话内容
′如果讲话内容是空串.则不进行任何数据库操作。
If content〈〉″″Then
nickname=trim(request(″whotalk″)) ′获取讲话人的昵称
Set conn=Server.createobject(″adodb.connection″)
Conn.ConnectionString=″DRIVER={Microsoft Access Driver (*.mdb)};DBQ=″&
Server.MapPath(″aspdb.mdb″)
Conn.open
Set objchaters=Server .Createobject (″Adodb .recordset″)
sglstring=″Insert into chatroom(name,content)values (′″&nickname &″′,′″&content&″′)″
′将该发言语句插入到数据库中
Application.Lock
Objchaters .open sglstring,conn
Application.unlock
End If
Response .redirect ″talk.asp″
%〉
4.display.asp页面
显示聊天即时动态的页面display.asp。 设计该页面时需要考虑以下几个问题:(www.xing528.com)
(1)聊天内容需要刷新,每隔一个时间段刷新屏幕,显示最新的聊天信息。
(2)显示聊天内容应当按照时间降序,把最新的聊天信息显示到窗口最上端。
(3)注意显示聊天内容时要显示出发言人昵称。
刷新屏幕通常在HTML文件头〈HEAD〉...〈/HEAD〉之间插入下面的语句 。
〈META http-equiv=″refresh″Content=″timeout″;URL=″url″〉
●参数TimeOut代表刷新屏幕的时间间隔 ,以秒为单位 。
●参数URL代表需要将页面重定向到页面 。
如果把URL参数设置为该页面自身的路径 ,自然就实现了每隔一段时间就重新从服务器读取自身的功能。实际上在程序中,采用Request对象的服务器环境变量 Path-Info来获取当前程序相对服务器的虚拟路径。
下面是 display.asp的程序:
〈%
′连接数据库
Set Conn=Server .createobject (″adodb .connection″)
Conn.ConnectionString=″DRIVER={Microsoft Access Driver (*.mdb)};DBQ=″&
Server .MapPath (″aspdb .mdb″)
Conn.open
′每次在窗口中显示最新的20条聊天信息,并且按照时间降序从数据库中读取。这样,取出来的留言信息就是数据库中当前最新的20条聊天信息
Set objchaters=Server .Createobject (″Adodb .recordset″)
sqlstring=″select top 20 * from chatroom order by time desc″
′在窗口中打印出发言者的昵称和发言的内容
objchaters .open sglstring,conn
Do While not objchaters .Eof
Response .write ″[″& objchaters (″name″)&″说 :〈BR〉″
Response .write″ ; ; ; ;″&objchaters (″content ″)&″〈BR〉〈BR〉″
objchaters .Move Next
Loop
Response .write ″〈BR〉″
Conn.close
Set objchaters=nothing
%〉
〈HTML〉
〈HEAD〉
〈TITLE〉聊天室〈/TITLE〉
〈META http-equiv=″Content-Type″content=″text/html;charset=gb2312″〉
〈!--设置窗口刷新时间为5秒,重定向的URL--〉
〈META http-equiv=″refresh″ Content=″5″;URL=″〈%= request.servervariables
(″path_info″)%〉″〉
〈/HEAD〉
〈!- - 为当前程序所在虚拟路径- - 〉
〈BODY bgcolor=″#FFFFFF″text=″#000000″〉
〈/BODY〉
〈/HTML〉
这样, 用户在 talk.asp 中输入发言的内容, 提交后稍微等待几秒就可以在聊天内容显示窗 口中看 到 刚 才 的发 言 。
5. online.asp 页面
显示当前在线用户的程序比较简单, 从 online 数据库中把所有的数据读取出来并显示。
下面是 online.asp 的程序:
〈%
′连接数据库
Set conn=Server .createobject (″adodb .connection″)
Conn .ConnectionString=″DRIVER={Microsoft Access Driver (*.mdb)};DBQ=″&
Server .MapPath (″aspdb .mdb″)
Conn.open
Set rs=Server .CreateObject (″Adodb .recordset″)
sqlstring=″Select*from online
Rs .open sglstring,conn
%〉
〈HTML〉
〈HEAD〉
〈TITLE〉聊天室〈/TITLE〉
〈META http-equiv=″Content-Type″content=″text/html ;charset=gb2312″〉
〈/HEAD〉
〈BODY bgcolor=″#FFFFFF″text=″#000000″〉
〈H2〉在线用户〈/H2〉
〈HR color=blue〉
〈TABLE〉
〈%While not rs .Eof %〉
〈TR〉〈TD〉〈%=rs (″name″)%〉〈/TD〉〈/TR〉
〈%
Rs .movenext
wend
Conn.close
Set objchaters=nothing
%〉
〈/TABLE〉
〈/BODY〉
〈/HTML〉
但还有一个问题需要注意:用户退出聊天室后即不在线上,但是他的昵称还存储在数据库omine中。如果另外一个用户登录聊天室也会显示出其实已经退出聊天室的用户。
介绍Session对象时,曾提到过Session_OnEnd事件。该方法是用户退出网站或者一个会话超时时发生,因此就把删除该用户昵称的程序段写在这个事件中。下面是Session OnEnd事件。
Sub Session_ OnEnd()
′将该用户从在线用户表online中删除
Dim nickname
nickname=Session(″nickname″)
Set Conn=server .createobject (″adodb .connection″)
Conn.ConnectionString=″DRIVER={Microsoft Access Driver (*.mdb)};DBQ=″&_
Server .MapPath (″aspdb .mdb″)
conn.open
Set ObjOnliners=Server .CreateObject (″Adodb .recordset ″)
Sqlstring=″delete from online where name=′″& nickname &″′″
ObjOnliners .Open Sqlstringconn
Session (″nickname″)=″″
Session.Abandon
End Sub
至此,完成了这个简单的聊天室程序。读者在此基础之上加入其他功能,完全可以实现其他网站上的聊天室功能。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。