对于ASP程序来说,我们首先阅读的应该是Global.asa,因为这个文件中定义了在服务器启动和关闭时的动作以及每一个客户开始会话和结束会话时的动作。
但是,DVBBS没有Global.asa,所以,我们可以直接跳到它的入口点——index.asp——了。
该文件的一开头包含如下的文件:
<!--#include file="conn.asp"-->
<!--#include file="inc/const.asp"-->
<!--#include file="inc/dv_clsother.asp"-->
而inc/const.asp文件中还有一句包含:
<!--#Include File="Dv_ClsMain.asp"-->
也就是说,我们在阅读index.asp之前,还要阅读这四个被包含的文件。打开这四个文件一看,我的妈呀,几千行代码,吓死我了。
其实不用害怕,我们完全不用逐行研究这四个文件,因为这四个文件中主要是定义了一些全局的变量和类,而且conn.asp里面主要是管理和数据库的连接。对于这些变量和类,以及类的实例,我们可以在以后碰到的时候再到这四个文件中去找。但是,对于每碰到一个变量,我们都需要确定它的作用域,是Page范围的,还是Session范围的,还是Application范围的?
好了,下面可以开始进入index.asp了,打开一看,我的天,代码也不少啊。不用怕,其实index.asp的主要逻辑只有如下几行:
Const CachePage=false ''''''''是否做页面缓存
Const CacheTime=60 ''''''''缓存失效时间
Dim XMLDom,page,TopicMode,Cmd
If Request("w") = "1" Then
Passport_Main()
Response.End
End If
If (Not Response.IsClientConnected) and Dvbbs.userid=0 Then
Session(Dvbbs.CacheName & "UserID")=empty
Response.Clear
Response.End
Else
If Request("action")="xml" Then
Showxml()
Else
Main()
End If
End If
这几行的逻辑是这样的:
首先,定义几个变量,然后判断Request("w")是否为1,如果是的话,就执行Passport_Main()函数。说实话,我也不知道Passport_Main()函数是干什么的,因为我不知道什么时候才会给index.asp传递w=1这样的参数,可能要等到仔细阅读了Main()函数才会有答案吧。
下面的if(Not Response.IsClientConnected)语句是ASP开发中常用的一个技巧,就是判断浏览器是否和服务器有连接,为什么要用这个技巧呢?大部分情况下是防止用户还没有等待页面下载完就关闭浏览器。所以,这一句的意思是,如果用户关闭浏览器,就将这个用户的缓存清空,这里的缓存是Session范围的,以Dvbbs.CacheName加上UserID来标识。
关于Dvbbs对象,是在Conn.asp中定义的:
Set Dvbbs = New Cls_Forum
而Cls_Forum类在inc/dv_ClsMain.asp中定义,其中的CacheName成员如下初始化:
CacheName="DvCache" ''''如果一个虚拟目录或站点开多个论坛,则每个要错开,不能定义同一个名称
关于Dvbbs.UserID的初始化,我们可以在Cls_Forum的构造函数中找到
UserID = Trim(Request.Cookies(Forum_sn)("UserID"))
由此可见,UserID是从用户的Cookies中获得的
而Forum_sn是这样初始化的:
Forum_sn="DvForum" ''如果一个虚拟目录或站点开多个论坛,则每个要错开,不能定义同一个名称
如果用户没有关闭浏览器,那么就该显示首页了,如果用户是这样访问的首页:
http://localhost/MyOpenBBS/index.asp&action=xml
那么,调用Showxml()函数,显示的是一个XML文档,你可以这样访问编程中国的首页看看:
http://www.bc-cn.net/bbs/index.asp?action=xml
如果用户是按照常规模式访问首页,则调用Main()。
OK,将我们的注意力转移到Main()函数中来吧。