目 录
一、前言... 2
二、系统定义... 3
2.1 系统分析... 3
2.1.1 Internet以及Web技术的发展... 3
2.1.2 基于Web的通用BBS系统技术可行性分析... 4
2.2 需求分析... 8
2.2.1 系统的综合要求... 8
2.2.2 系统的数据要求... 9
2.2.3 系统的逻辑模型... 13
三、系统设计... 15
3.1 系统概要设计... 15
3.1.1 数据结构的设计... 15
3.1.2 系统结构的设计... 17
3.2 系统详细设计... 19
3.2.1 基本算法... 19
3.2.2 关键技术... 22
3.2.2.1 ASP技术... 22
3.2.2.2 ADO技术... 24
3.2.2.3 数据库技术... 26
3.2.2.4 VBScript及JavaScript脚本语言... 28
3.2.2.5 正则表达式技术... 32
3.2.3 实现方法... 36
3.2.3.1 ASP网页数据库的连接... 36
3.2.3.2 ASP网页数据库的操作... 40
3.2.3.3 ASP网页安全性的实现方法... 45
3.2.3.4 在贴子中实现超文本信息输入和显示... 51
四、系统的运行效果... 60
五、结束语... 61
参考文献... 63
基于Web的通用BBS系统的建立与维护
作者:
关键词
BBS、ASP、ADO、MS Access、JavaScript、VBScript、RegExp
摘要
本文是一篇讨论基于Web的数据库管理的本科毕业论文,它详细地讲述了开发一个基于Web的通用BBS(BullitinBoard System)网站系统所用到的技术和方法。其中运用了ASP技术(Avtive Server Page)、ADO技术(ActiveX Data Object)、MS Access数据库技术、RegExp技术(RegularExpression 正则表达式)、VBScript及JavaScript脚本语言技术等等,并从几个不同的方面来对上述技术的实现方法进行了讨论。
进入二十一世纪,计算机技术迅速向着网络化、集成化方向发展。传统的单机版应用软件正在逐渐退出舞台,取而代之的是支持网络、支持多种数据信息(多媒体)的新一代网络版应用软件,而目前网络版软件中似乎存在着两种不同的趋势,一种是称为客户端——服务器的C/S结构应用系统,这类软件具有结构严谨,运行效率高,服务器端压力小,安全性好等优点,被广泛运用于局域网中。而另一种,也是本毕业设计所采用的,是称为浏览器——服务器的B/S结构应用系统,它的特点是在客户端直接采用了功能强大的浏览器软件作为界面,其优点在于软件开发效率高,客户端不受操作平台的限制、也不受地域的限制,网络传输量少,即适用于局域网,更适用于Internet,而且投资小、见效快,用户可以不必进行服务器方面的投资,而是去租用,甚至是免费使用ISP的服务器资源,因而受到越来越多中小型单位的青睐。
本文讨论的是一个基于Web的通用BBS网站,它具有BBS网站应该具有的所有功能。
Internet起源于20世纪60年代末、70年代初,当时,美国国防部为了将充斥于军事基地内各种厂商的电脑主机互连,让它们可以进行数据交换以便研究工作顺利进行,于是成立了ARPA网络计划。ARPA计划尝试建设一个网络系统,它可将各种不同厂商的电脑连接起来。随着这个计划的成功,各学术单位,研究机构也纷纷与ARPA计划所建立的ARPANet连接。到了20世纪80年代,Internet这个名词因势产生,它代表着这十年来所构建涵盖全球各地的网络系统。从1990年起,商业使用的Internet在美国急速地扩大,而Internet也从原来属于少数人使用的网络系统转变为普通百姓也能够使用的网络系统。
最初的Internet资源服务都还停留在文本模式,1989年,量子物理实验室(CERN)下的一个研究小组着手开发一种全新的Internet服务,它可以在网络上传送图片、文本、影像、声音等多媒体数据。于是由TimBerners Lee领导的小组开发出了一种主从、分布式的网络服务系统,这就是WWW,俗称“万维网”。
所谓WWW其实就是连上Web服务器访问资源,取得的内容就是所谓的“主页”(HomePage)。进入的网页通常不会只有一页,而是整个网站的内容。
“网站”是一种呈现在网络上的新兴媒体,通过Internet已经成为一个实时的,多媒体的信息传播渠道。它的载体主要是电脑,范围覆盖全球各地,没有国界,不分人种,时时刻刻地提供服务。目前,人们渐渐开始把网站称之为广播、电视、报刊以外的第四新闻媒体,以“共享、公平、公正、创新、国际化、团队精神”为特征的网络文明也已逐渐成为这个时代的标志,人们越来越习惯于通过Internet网络获取信息,通过Internet在网站上发表自已对社会对生活的理解和建议。
BBS系统就是提供给注册用户一个平台,会员用户可以通过Internet接入,登录本系统,在这个平台上发表文章、阅读文章、回复文章等等。
此类系统通常有以下四种类型的操作用户:匿名用户、普通用户、版面管理员、超级管理员。每类用户有其不同的操作集,系统通常提供一个统一的登录页面,此页面应能自动识别不同级别的用户,并提供不同的操作界面。与之相应,此类系统通常应具有以下功能:用户注册、用户登录、发表文章、阅读文章、回复文章、分页查找、主题查找、作者查找、个人资料维护、找回密码、版面管理、版主管理、用户管理、友情链接管理等等,所有操作都可以由用户在客户端浏览器中完成,而服务器端程序会按用户的要求来完成对系统数据的操作,并将结果传给Web服务器,再由Web服务器处理成HTML文件后发送到客户端浏览器。这就是所谓的B/S结构应用系统,B/S结构即Browser/Server(浏览器/服务器)结构,是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。
C/S结构,即Client/Server(客户机/服务器)结构,是大家熟知的软件系统体系结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,可以充分利用两端硬件环境的优势。早期的软件系统多以此作为首选设计标准。
B/S结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,形成所谓N-Tier结构。B/S结构,主要是利用了不断成熟的WWW浏览器技术,结合浏览器的多种Script语言(VBScript、JavaScript…)和ActiveX技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。随着Windows 98/Windows 2000将浏览器技术植入操作系统内部,这种结构更成为当今应用软件的首选体系结构。
将应用程序分成好几个离散逻辑组件,就是多层式结构 (N-Tier) 应用程序。最常见的选择是分成三个部分:表示层、事务逻辑层和数据层(3-Tier),不过也有其它的组合。多层式结构应用程序,在一开始是解决某些与传统客户端/服务器 (主从式) 应用程序相关的问题,但是随着 Web 的出现,此结构已经成为主导新程序之开发的结构。下面就是3-Tier结构各层功能以及经常采用的技术作个简介:
表示层主要运行于客户端浏览器,采用Script (脚本)语言编写。HTML、JavaScript、VBScript是此类应用系统中展示层最常用的脚本编制语言,结合CCS以及ActiveX技术,能设计出交互相当灵活功能又相当强大的客户端网页。
事务逻辑层设计通常有三个选择:ASP网页、COM或COM+组件、DBMS中所执行的预存程序。将程序代码的一部分,建立成执行于数据库管理系统 (DBMS) 中的预存程序,使数据与程序代码储存在相同的位置,有助于最佳化执行效率,但是,预存程序都依赖于特定的数据库系统,在编写和侦错方面都相当复杂,只适宜于大型的商业应用系统。以 COM 对象的方式,编写中间层 (Middle Tier) 事务逻辑,可以使用全功能的语言,来产生经过编译的执行程序,执行效率也相当高,此外,在 COM 对象中包装事务逻辑,还可以清楚地将此程序代码与网页内含的展示程序代码分隔,这样可以使应用程序更易于维护,但是,COM对象的部署也有一定的麻烦,新编写的组件对象,只有在服务器重新启动后才能被应用程序调用。用ASP 网页设计事务逻辑相对来说比较简单,但是,ASP网页采用脚本语言来编写事务逻辑,比如VBScript,程序代码只有在执行时才被翻译,这样会降低执行效能,此外,ASP 网页中的程序代码也是难以维护的,因为事务逻辑程序代码与建立使用者接口的展示程序代码彼此混杂在一起。
数据层较为灵活,视系统规模可选择Sybase、Oracle、My SQL、SQLserver或者MS Access。
综上所述,结合本系统实际需要,本BBS系统采用B/S结构,使用微软公司的技术解决方案。开发环境采用微软的FrontPage2000+PWS。引入Windows DNA 概念,将Windows DNA 应用到系统开发中。采用3-Tier软件结构:表示层采用HTML、JavaScript或VBScript结合CSS、ActiveX技术来编写;事务逻辑层,考虑到本系统为通用BBS系统,系统应该具备较大的可伸缩性,应该能适应最基本应用最广泛的WEB平台,特别是个人用户想在一些免费主页空间搭建自已的论坛,而这类免费主页空间通常只支持ASP来处理服务器端数据或数据库,另外,通用系统应该具备较大的可扩展性,目前,ASP.NET技术发展较快,未来应该能以较小的成本用ASP.NET重写本系统,因此,本系统事务逻辑层设计采用ASP网页;至于数据层,本系统采用最基本的MS Access数据库系统,视需要,系统作较小的改动就可以移植到其它大型数据库系统。
本系统要求客户端支持IE4.0以上或与之兼容的浏览器软件,客户端硬件最低要求对应于IE4.0的硬件平台要求。服务器端要求支持ASP以及MS Access数据库。
本系统的开发环境和开发工具为:Windows98,PWS,FrontPage2000,MSAccess。
1、 系统界面要求
系统的初始界面假定用户是匿名登录,用户可以通过初始界面提供的统一的用户登录接口,登录进入各自的操作界面
2、 系统功能要求
本系统应具有通常BBS网站应该具有的所有功能,包括用户注册、用户登录、匿名登录、发表文章、阅读文章、回复别人的文章、分页查找、主题查找、作者查找、多种方式排序、个人资料修改、在线人数统计等,此外,用户在发表贴子时,能输入带格式文本,用户在发表或回复一篇贴子时,能获得相应的积分,其积分能反应此用户在本论坛的活跃程度。
本系统操作用户按不同级别依次可分为:匿名用户、普通会员用户、版主会员用户、超级用户。高级别的用户可以继承低级别用户的公用功能。同时,各级别用户具有一定的只有以本级别身分登录才具有的私有功能。
匿名用户功能要求---通用功能:查看各版面文章、查看系统版主列表、查看系统会员列表;私有功能:注册为系统正式会员、会员找回遗失密码、登录为正式会员。
普通会员功能要求---通用功能:发表或回复贴子、个人资料维护、退出或重新以匿名身分登录;私有功能:申请为版面版主、注销会员资格。
版主会员功能要求---通用功能:贴子管理、张贴公告、友情链接管理
超级用户功能要求---通用功能:论坛基本设定、版面管理、版主会员管理、普通会员管理
3、 系统性能要求
对于贴子查看、发表贴子以及回复贴子这类频繁发生的系统操作,要采取适当的技术优化这类数据操作,以提高数据存取效率。
4、 安全性保密性可靠性等其它方面的要求
高级别用户的所有管理操作要有针对低级别用户的身分识别功能,以防止低级别的用户越权执行高级别用户才具有的操作功能。
根据系统的功能需求,本系统管理和维护以下几种数据元素(实体Entity):会员、管理员、论坛、论坛版面、贴子、友情链接、日志。
1、会员实体
会员用户包含这样一些基本属性:用户名、用户密码、用户密码提示问题、用户密码提示问题答案、用户EMAIL、用户真名、性别、出生年月日、主页URL、联系方式、证件名称、证件号码、积分。其中,用户名为用户唯一标志,不允许重名。积分为此用户在本论坛发表文章以及文章被其它用户关注程度所累积的分数,作为衡量此用户在本论坛活跃程度的一个标志。
2、管理员
管理员实际上派生于会员用户,意味着只有会员用户才有资格申请本论坛各版面的管理权限,因此,他除了包含会员用户所有的基本属性以外,还应包含以下几个属性:申请管理版面、申请理由、申请被批准状态。一个管理员可以管理几个版面,一个版面可以由几个管理员管理,所以,应该有一个管理员序号来唯一标志这个实体。另外,管理员也分为两类,一类是超级管理员,具有管理和维护本论坛所有数据信息的权限,另一类是普通版主,只能管理与某版面相关的数据信息,可以用申请管理版面以及申请被批准状态来区分这两类管理员,如果申请管理版面为零用申请被批准通过,则此会员就为超级管理员,如果申请管理版面在本论坛存在且申请被批准通过,则此会员就为版主管理员,否则,此会员仍为普通会员。
3、论坛
论坛基本信息比较稳定,只能为超级管理员所维护,此实体包括以下一些基本属性:论坛名称、论坛版权信息、论坛公告、公告内容。
4、版面
论坛版面包含这样一些基本属性:中文名称、英文名称、版面简介、版面公告。此外,论坛版面实体与管理员实体有联系,与贴子实体也有联系。
5、贴子
贴子包含以下一些基本属性:所属版面,作者,标题,贴子类型,所属主贴,回复数量,点击次数,标题图像,贴子内容,贴子书写时间,最后一次更新贴子时间。贴子包括两种类型:主贴和回复。贴子序号为此贴子唯一标志。
6、友情链接
友情链接实体包含以下一些基本属性:添加本链接管理员,链接名,链接URL,链接说明。一个管理员可以添加多条友情链接。除超级管理员外,已添加的友情链接只能由添加作者修改或删除。链接名,链接URL不可重复,可作主键。
7、日志
日志包括以下一些基本属性:登录会员,登录IP,登录时间,退出时间。
本系统实体之间主要有以下几类联系(Relation):用户与论坛版面之间存在管理联系(M:N)、用户与贴子之间(1:M)、用户与友情链接(1:M)、用户与日志(1:M)、论坛版面与贴子(1:M)
几个基本实体-联系图(ER图)如下:
(图转下页)
*系统逻辑模型数据流简要说明:
1、匿名用户与信息处理系统之间
系统的输入数据流:注册资料、登录数据、找回密码数据
系统的输出数据流:用户遗失密码、某篇贴子内容、会员列表、版主列表、版面列表、人气贴子列表、热门话题列表
加工逻辑:注册加工、登录加工、用户找回密码加工
2、会员用户与信息处理系统之间
系统的输入数据流:版主资格申请、注册资料修改、发表贴子、回复贴子
系统的输出数据流:某篇贴子内容、会员列表、版主列表、版面列表、人气贴子列表、热门话题列表
加工逻辑:版主资格申请、注册资料修改、发表贴子,回复贴
3、版主与信息处理系统之间
系统的输入数据流:注册资料修改、发表贴子、回复贴子、友情链接维护、发布公告、管理版面贴子维护
系统的输出数据流:某篇贴子内容、会员列表、版主列表、版面列表、人气贴子列表、热门话题列表
加工逻辑:注册资料修改、发表贴子、回复贴子、友情链接维护、发布公告、管理版面贴子维护
4、超级会员与信息处理系统之间
系统的输入数据流:注册资料修改、发表贴子、回复贴子、友情链接维护、添加版面、论坛基本信息维护、论坛所有贴子维护、版主申请批复
系统的输出数据流:某篇贴子内容、会员列表、版主列表、版面列表、人气贴子列表、热门话题列表
加工逻辑:注册资料修改、发表贴子、回复贴子、友情链接维护、添加版面、论坛基本信息维护、论坛所有贴子维护、版主申请批复
参照用户与版面之间管理关系ER图,可以将用户、版面转换成三个关系模式,设计如下:
论坛版面关系模式(版面ID#,版面中文名,版面英文名,版面简介)
用户关系模式(用户名#,用户密码,用户密码提示问题,问题答案,用户EMAIL,用户真名,用户性别,用户出生年月,用户主页,用户证件名称,用户证件号码,用户联系方式,用户积分)
管理员关系模式(管理员ID#,用户名#,申请管理版面ID#,申请管理理由,申请被批示状态)
参照用户与贴子之间ER图,可以将其转换成二个关系模式,设计如下:
用户关系模式(用户名#,用户密码,用户密码提示问题,问题答案,用户EMAIL,用户真名,用户性别,用户出生年月,用户主页,用户证件名称,用户证件号码,用户联系方式,用户积分)
贴子关系模式(贴子ID#,标题,贴子类型,主贴子ID,回复数量,点击次数,标题图像,贴子内容,贴子书写时间)
按照上述转换方法,再结合系统一些功能以及性能方面的需要,系统所有关系模式设计如下:
论坛基本信息(论坛信息ID#,论坛名,版权说明,论坛公告标题,公告内容,最后一次修改时间)
论坛版面信息(版面ID#,版面中文名,版面英文名,版面简介)
用户基本信息(用户名#,用户密码,用户密码提示问题,问题答案,用户EMAIL,用户真名,用户性别,用户出生年月,用户主页,用户证件名称,用户证件号码,用户联系方式,用户积分)
管理员基本信息(管理员ID#,用户名#,申请管理版面ID#,申请管理理由,申请被批示状态)
贴子基本信息(贴子ID#,版面ID#,用户名#,标题,贴子类型,主贴子ID,回复数量,点击次数,标题图像,贴子内容,贴子书写时间,最后一次更新贴子时间)
友情链接基本信息(链接ID#,用户名#,链接名,链接URL,链接说明)
用户访问日志信息(日志ID#,用户名#,用户登录IP,登录时间,退出时间)
*注:第一个带“#”标志的属性为本关系模式的主键,其它为外键
系统主页面自动进行身份判别,按照访问者的身份自动进入其相应的操作界面,其流程如下所示:
各类用户的操作界面所具有的功能如下表所示:
(表见下页)
用户 类型 |
功能 类型 |
功能 |
过程 编号 |
过程名 |
|
匿名 用户 |
私有 |
登录为正式会员 |
P1.1 |
Userlog.asp |
|
注册为正式会员 |
P1.2 |
Userreg.asp |
|||
会员找回遗失密码 |
P1.3 |
Getpass.asp |
|||
公有 |
查看系统会员列表 |
P1.4 |
Useradmin.asp |
||
查看系统版主列表 |
P1.5 |
Adminorlist.asp |
|||
查看各版面文章列表 |
P1.6 |
Topic.asp?bid=XXX |
|||
查看热门话题 |
P1.7 |
Topic.asp?method=hot |
|||
查看人气贴子 |
P1.8 |
Topic.asp?method=hits |
|||
查看某篇文章 |
P1.9 |
Show.asp?id=XXX |
|||
普通 会员 |
私有 |
申请为版面版主 |
P2.1 |
Adminapply.asp?bid=XXX |
|
注销会员资格 |
P2.2 |
Userlogoff.asp |
|
||
公有 |
个人资料维护 |
P2.3 |
Usermodify.asp |
|
|
发表贴子 |
P2.4 |
Post.asp?bid=XXX |
|
||
回复贴子 |
P2.5 |
Post.asp?id=XXX&bid=XXX |
|
||
重新以匿名身分登录 |
P2.6 |
Quitbbs.asp |
|
||
版主 会员 |
公有 |
贴子管理 |
P3.1 |
Articleadmin.asp |
|
张贴公告 |
P3.2 |
Newspost.asp |
|
||
友情链接管理 |
P3.3 |
Linkadmin.asp?bid=XXX |
|
||
超级 会员 |
公有 |
论坛基本设定 |
P4.1 |
BBSset.asp |
|
版面管理 |
P4.2 |
Boardadmin.asp |
|
(注:私有功能为该级别用户所独有的功能,不能为其高级别用户所继承,而其公有功能则可以为比其级别高的用户所继承)
基于WEB的通用BBS系统其系统定义部分采用面对对象的系统分析方法,并结合传统的结构化分析方化,设计出其系统模型,如果采用面向对象的程序设计语言开发系统,则可以很方便地从系统分析阶段平滑地过渡到设计阶段。但是,本系统采用ASP技术,我们知道ASP不支持继承和强类型转换等面向对象程序设计所必需的功能,只能采用一定的技术措施,用传统的结构型程序设计方式实现诸如继承等这类功能。下面就部分系统实现做一下简要说明:
1.系统主页面 Main.asp
这是BBS网站的HomePage,程序首先进行用户身份判断。
本系统用户身份信息经登录后保存在SESSION对象的USERNAME和ADMINBOARD两个变量里。匿名用户(既Guest)这两个变量为空或没有定义;普通用户USERNAME变量有用户在本系统注册的会员昵称,但其ADMINBOARD变量没有定义或为空;版主用户其ADMINBOARD变量保存有他管理版面的ID;如果ADMINBOARD变量为“0”则为超级会员。
依据程序对用户所做的判断,插入相应用户的功能操作菜单。这就实现了不同层次对象的同一方法的不同功能。譬如Guest::main.asp载入的功能菜单为genhead.asp,Super::main.asp载入的功能菜单则为superhead.asp。注意:功能菜单文件其实就是普通的HTML文件,按照各自所属的操作对象列示其相应的功能链接。
2. 各级别用户私有功能的实现方法
私有功能是不能为比其级别高的用户所继承的功能。因此,私有功能ASP网页应进行具体某个级别身份的识别,非这个级别层次的用户则被拒绝访问。
3. 各级别用户公有功能的实现方法
公有功能是可以为比其级别高的用户所继承的功能。因此,公有功能ASP网页只进行比其级别低的用户身份的识别,如果此用户级别低则拒绝继续访问。此外,高级别的用户可以进行功能重载,譬如,匿名用户只能查看本系统会员列表,但是,超级会员在查看的同时,还可以进行管理操作,如修改,删除等。下面是所有公用功能的重载列表:
Guest::useradmin.asp 查看本论坛注册会员列表
Super::useradmin.asp 查看并管理本论坛注册会员列表
Guest::adminorlist.asp 查看本论坛版主列表
Super::adminorlist.asp 查看并管理本论坛版主列表
Adminor::articleadmin.asp 自已管理辖版面范围内的贴子维护
Super::articleadmin.asp 本论坛所有版面贴子维护
Adminor::linkadmin.asp 添加或维护自已曾添加的友情链接
Super::linkadmin.asp 维护所有友情链接列表
Adminor::newpost.asp 在自已管理版面发布公告
Super::newpost.asp 在任一版面发布公告
4. 会员用户积分的计算模型
会员用户每提交一篇文章,可以积十分。回复某篇文章,则可以积五分,同时原文作者积三分。
5. 版主申请条件以及计算模型
版主申请条件:为正式注册会员;一个会员最多管理二个版面;一个版面最多五个管理员。
计算机模型:用户提出申请,超级用户审批。审批完成前此会员不能再次就同一版面申请版主权限。
6.超文本信息输入
具有普通会员身份以上级别的用户,发表贴子或回复贴子时,可以在其贴子内插入诸如滚动文字,字体大小颜色不同的文字,以及超链接等等。系统接受用户输入时对带格式文本应进行相应的编码(Encode),系统显示带超文本信息的贴子时则应进行相应的解码(Decode)。
ASP技术是一种类似HTML(HypertextMarkup Language超文本标识语言)、Script与CGI(Common Gateway Interface通用网关接口)的结合体,简单的讲它是一种运行于服务器的脚本语言,但是其运行效率比CGI更高、程序编制也比HTML更方便且更有灵活性,程序安全性及保密性也远比Script好。
其特点归纳如下:
1. ASP可以和HTML或其他脚本语言(VB Script与Java Script)互相嵌套。
2. ASP是一种在Web服务器端运行的脚本语言,因此,程序代码完全保密。
3. ASP以对象为基础,因此可以使用ActiveX控件继续扩充其功能。
4. ASP内置ADO组件,因此可以轻松地存取各种数据库,大大缩短了程序开发时间。
5. ASP可以将运行结果以HTML的格式传送至客户端浏览器,因此ASP可以适用于各种浏览器。
下面来介绍一下ASP的几个内置对象。
Request对象,我们知道HTTP通讯协议是一种请求与响应(Request/Response)的通讯协议,因此通常由客户端向Web服务器提出请求,Web服务器才会响应信息。因此在ASP中,特别将“客户端提出的要求”与“Web服务器响应的信息”等动作封装成Request对象与Response对象。换而言之,Request对象通常包含了用户端的相关信息,如浏览器的种类、表头信息、表单参数及cookies等等。
Response对象,每一种程序语言或开发工具一定都有与用户沟通的界面或函数,ASP也不例外。在ASP中负责将信息传达到用户的对象就是Response对象。
Server对象,Server对象允许用户取得服务器提供的各项功能,例如,Server对象的CreateObject方法允许客户端用户建立一个ActiveX Server组件实例,其所建立组件实例会随着服务器端完成ASP网页的处理而自动被释放。如果希望此对象实例可以跨多个ASP网页,就要用到Session对象保留该组件实例,直到Session对象的运行时间到了,或是在其他ASP网页调用Session对象的Abandon方法,此组件实例才会被释放。
Session对象,Session对象在ASP程序编写中占了相当重的份量,由于网页是一种无状态的程序,因此几乎无法知道用户的浏览状态。必须通过Session对象记录用户的相关信息,以供用户再次对此Web服务器提出要求时作确认,例如,在某些特定的网页中,常需要用户输入确认的账号和密码,假如这些身份确认的结果无法保留,那岂不是每一个网页都需要重新输入一次密码。换而言之,每一个Session的用户,Web服务器均会自动的为它们建立一个Session。必须说明,Session对象只能适用于具备Cookie功能的浏览器。
ADO(ActiveX Data Objects)是微软公司提供给网页开发者在网页中存取数据库的最新技术,它也是ASP内置的重要组件,ADO主要的目的是为了存取或修改数据源的数据、或增加数据到指定的数据源,数据源不仅包括数据库,而且包括dBase、Excel、Foxpro、Access或文本文件等一些小型的数据表,所以,只要是ODBC驱动程序所能存取的数据源皆是ADO存取的对象。ADO主要是由Connection对象、Command对象、Parameter对象、Recordset对象、Field对象、Property对象及Error对象等七个对象与Fields数据集合、Properties数据集合、Parameters数据集合及Errors数据集合等四个数据集合所组合而成,其功能概述如下。
ADO提供的七个对象:
1. Connection对象负责与指定的数据源进行连接,除此之外,它还可以通过事物(Transaction)来确保在事物中所有的数据源变更的全部成功。
2. Command对象负责对数据库提供请求,也就是传递指定的SQL命令。换而言之,Command对象必须经过一个已经建立的连接(Connection对象)发出数据操作语言(DML,Data Manipulation Language)来操作数据源的数据,这些命令通常包括INSERT(增加记录)、DELETE(删除记录)、UPDATE(更新记录)、或是SELECT(以Recordset的形式选取数据)等。除此之外,也可以通过Command对象对数据库发出数据定义语言(DDL,Data Definition Language),例如CREATETABLE(建立数据表)、DROP TABLE(删除数据表)或ALTER TABLE(修改数据表结构)等。
3. Parameter对象负责传递Command对象所需要的SQL命令参数。
4. RecordSet对象负责浏览和操作从数据库取出的数据,换而言之,RecordSet对象就象是一个二维的数组,数组的每一行表示一个数据记录,而每个数剧列包含一个或多个数据字段,即Field对象。
5. Field对象表示指定RecordSet对象的数据字段。
6. Property对象表示ADO的各项对象属性值,换而言之,每个ADO对象都会有一组描述和控制对象行的属性。
7. Error对象负责记录连接过程所发生的错误信息。
ADO提供的四个数据集合:
1. Connection对象包含Errors数据集合,在Errors数据集合中包含数剧源响应失败时所建立的Error对象。
2. Command对象包含Parameters数据集合,在Parameters数据集合中包括Command对象所有的Parameter对象。
3. RecordSet对象包含Fields数据集合,在Fields数据集合中包含RecordSet对象的所有Field数据字段对象。
4. Connection对象、Command对象、RecordSet对象与Field对象皆包含一个Properties数据集合,在Properties数据集合中包含所对应Connection对象、Command对象、RecordSet对象与Field对象的Property对象。
ADO的七个对象及四个数据集合相互的关系图如下:
ActiveX Data Object关系图如下:
1、MS Access数据库
数据库(Database)是一系列信息资源的集合。在一个数据库中,与一个项目有关的所有信息都可以叫做一条记录(Record)。每一条记录都是由一系列的字段(Field)组成的。一系列记录的集合就构成了数据表格(Table)。对于一个简单的“平面文件”的数据库来说,它仅包含了一个数据表格,而对一个“关系型”数据库来说,它却包含两个或两个以上的数据表格,表格的各字段之间存在这一种或多种关系(有时可以把这种关系叫做“链接”)。
简单的平面文件数据库的用途非常有限,而关系型数据库却能够包含数据以百万计甚至以亿计的记录,并可以利用复杂的标准对这些记录进行操作,例如排序和统计。把它们叫做“关系型”数据库,是因为需要在这些数据表格的字段之间建立特定的链接关系。关系型数据库的优点在于:通过将一个表格中的字段与另一个表格中的字段联系起来,两个表格之间的信息可以相互调用,可以避免信息的重复记录,也可以避免管理上的混乱。因此关系型数据库可以减小数据库的体积,这对于大型的数据库来说具有非常重要的意义。
建立WEB站点时,可以使用两种主要的数据库:Microsoft SQL Server 和 Microsoft Access。Micro SQL Server是一种功能齐全的客户机/服务器数据库产品,适用于系统经常被大量的用户查询的情况。对于查询次数有限的情况,则可以采用中小型数据库的代表产品Microsoft Access。Microsoft Access是理想的入门级产品,其中提供了大量的向导,可以辅助完成数据库的创建和管理。
2、数据源(DSN)
ASP网页通过DSN数据源或者DSN-less方式连接网页数据库。
DSN数据源方式:ASP网页通过标准的ODBC(Open DataBase Connectivity)数据源DSN(Data Source Name)接口访问数据库数据。ODBC属于一种标准的数据接口,提供各类应用程序一个数据访问的标准方法。ODBC规范为应用程序提供了一套高层调用接口规范和基本于动态链接库的运行支持环境。使用ODBC开发数据库应用程序时,应用程序调用的是标准的ODBC函数和SQL语句,数据库的底层操作由各个数据库的驱动程序完成。使用DSN数据源方式,用户必须以手工的方式进行ODBC配置,添加一个指向用户数据库的系统数据源DSN,ASP网页使用DSN数据源字符串连接至用户数据库,例如:
strDB-DSN=”DSN=DSN名称;uid=XXX;pwd=xxx”
DSN-less数据源方式:使用本方式连接数据库,就必须自行提供DSN数据的相关信息,最重要的是驱动程序。例如:
strDBConn=”DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=c:\userdb.mdb”
3、结构查询语言(SQL)
SQL是结构查询语言(StructureQuery Language)的英文缩写,它是使用关系模型数据库的应用语言,由IBM在七十年代开发出来的,实现了关系型数据库中的信息检索。1992年制定了SQL标准SQL-92,它的全名是“International Standard ISO/IEC9075:1992, Database Language SQL”。SQL标准的确定使大多数数据库厂家纷纷采用SQL语言作为其数据库检索语言。
利用SQL语言,可以查询和管理自已的数据库。它由大约30条命令构成,但实际只需要少数的几个命令就可以完成相当多的工作,常用的SQL查询命令有:Select、Insert、Delete、Update等。
Script(脚本)是由一组可以在客户端浏览器上运行的命令组合而成的语言,你可以把它想像成一个运行于客户端上的可执行程序。目前在网页编制上比较流行的脚本语言包括VBScript及JavaScript。它们都是一种与HTML语言相似的描述性语言,也是以文本形式存在,不像C语言或Java语言那样,需要编译连接成字节码形式的可执行程序。Script语句可以单独存成文档,也可以被嵌入到HTML的文件之中,与HTML语句结合在一起。当需要将Script语句直接加入到HTML文件中时,只要使用一个HTML标记符号< Script >即可。例如:
var i = 10;
document.write (i);
另外,Script程序在HTML中的位置也比较自由,它可以在HTML文件中的任何位置。
脚本语言是一种解释性语言,可以直接由浏览器来解释执行。并且可以直接访问浏览器中的各种对象,如窗口对象、文档对象、框架对象、超链接对象等。脚本语言可以实现的功能很多,可以用于定义网页、在网页中加入动画、对网页中的各种元素进行处理,特别是在处理表单方面有很强功能。不仅如此,它还可以很方便地控制浏览器中的各对象的属性。例如,可以实现打开或关闭浏览器窗口、设置窗口状态、改变窗口中的超链接位置等。总之,一些常用的功能都可以用脚本语言实现。
本BBS系统中就运用了大量的脚本语言,一方面用来完成表单提交前的数据验证任务,另一方面用来完成打开新的窗口、关闭当前窗口、返回前一页及下拉菜单等功能。通过使用脚本语言既防止了大量错误数据被提交到服务器,进而节约了宝贵的系统资源;也使网页更加美观、操作更加方便。大大提高了系统的性能。
1、JavaScript
Java语言的功能很强大,在网页设计中非常的有效,但是它要求创建APPLET的人员必须是程序设计员。Sun Microsystems(太阳微系统)公司为了消除对于WEB站点的开发人员的特殊要求,专门发布了JavaScript。
JavaScript脚本语言是一种解释性,基本对象的脚本语言。虽然,它没有那些真正意义上的面向对象语言那么多的特性,但是对于它的预期功能而言,它能够实现的功能已经够大了。
Javascript并不是任何一种语言的删节版(它只是与Java语言的关系很接近),它也不是任何一种语言的简化版。然而,它的使用是有限的。不能使用它创建一个独立的应用,比如,它几乎不能进行文件的读写。此外,Javascript脚本只能运行在解释性语言的环境下,或是WEB服务器和WEB浏览器上。
Javascript是一种比较随意的语言,这就并不意味着不一定必须明确地声明变量的类型。此外,在很多情况下,Javascript脚本语言在需要的时候可以进行自动转换。
JavaScript是Java与HTML结合的产物,HTML文档中可以嵌套JavaScript命令,但是JavaScript语句不需要编译,浏览器可以直接执行JavaScript语句。利用JavaScript结合CCS可以创建交互能力很强的WEB界面。
2、VBScript语言
当在设计WEB站点中使用JavaScript时,Microsoft公司也在其非常流行的Visual Basic的基础上,推出了另一种脚本设计语言VBScript。Microsoft Visual Basic ScriptingEdition是程序开发语言Visual Basic家族的最新成员,它将灵活的Script应用于更广泛的领域,包括Microsoft InternetExplorer中的WEB客户机Script和Microsoft Internet Information Server中的WEB服务器Script。
JavaScript可以支持大多数的平台,而VBScript目前只能在Windows环境下的浏览器中运行。但是由于大多数用户的操作系统都选用Windowst系列,因此,许多WEB站点的开发人员研始大量的使用VBScript。VBScript流行的主要原因是它将ActiveX对象的使用变得非常的简单。ActiveX是Microsoft推出的一种新技术,它支持WEB页面调用类似OLE的对象。
VBScript使用ActiveX Script与宿主应用程序对话。使用ActiveX Script,浏览器和其他宿主应用程序不再需要每个Script部件的特殊集成代码。ActiveX Script使宿主可以编译Script、获取和调用入口点及管理开发者可用的命名空间。通过ActiveX Script,语言厂商可以建立标准Script运行时语言。Microsoft将提供VBScript的运行时支持。Microsoft正在与多个Internet组一起定义ActiveX Script标准以使Script引擎可以互换。ActiveX Script可用在Microsoft Internet Explorer和Microsoft Internet Information Server中。因此对VBScript脚本语言的使用也变得重要起来。
正则表达式(Regular Expression)最早是由数学家Stephen Kleene于1956年提出,他是在对自然语言的递增研究成果的基础上提出来的。具有完整语法的正则表达式使用在字符的格式匹配方面上,后来被应用到熔融信息技术领域。自从那时起,正则表达式经过几个时期的发展,现在的标准已经被ISO(国际标准组织)批准和被OpenGroup组织认定。
正则表达式并非一门专用语言,但它可用于在一个文件或字符里查找和替代文本的一种标准。它具有两种标准:基本的正则表达式(BRE),扩展的正则表达式(ERE)。ERE包括BRE功能和另外其它的概念。
许多程序中都使用了正则表达式,包括xsh,egrep,sed,vi以及在UNIX平台下的程序。它们可以被很多语言采纳,如HTML 、XML、JavaScript以及VBScript等等,这些采纳通常只是整个标准的一个子集。
很多正则表达式的语法看起来很相似,这是因为你以前你没有研究过它们。通配符是RE的一个结构类型,即重复操作。让我们先看一看ERE标准的最通用的基本语法类型。我们以VBScript为例,说明正则表达式的应用范畴及其构造方法。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。
可以通过在一对分隔符之间放入表达式模式的各种组件来构造一个正则表达式。对VBScript 而言,则采用一对引号 ("") 来确定正则表达式的边界。例如:"expression"。正则表达式模式 (expression) 存储在RegExp 对象的Pattern 属性中。
*字符匹配
正则表达式的关键之处在于确定你要搜索匹配的东西,如果没有这一概念,Res将毫无用处。
每一个表达式都包含需要查找的指令,如下所示:
".ord"-匹配象"ford", "lord", "2ord"等等之类的文本;
"[cng]ord"-只匹配"cord", "nord", 以及 "gord"的文本;
"[^cn]ord"-匹配开头字母不包括c以及n,后面字符串为ord的文本;
"[a-zA-Z]ord"-匹配开头字母为英文字母,后面字符串为ord的文本;
"[^0-9]"-匹配开头字母不包括数字,后面字符串为ord的文本。
*重复操作符
重复操作符,或数量词,都描述了查找一个特定字符的次数。它们常被用于字符匹配语法以查找多行的字符,参见下面例子:
"?erd" Will match "berd","herd", etc. and "erd"
"n.*rd" Will match "nerd","nrd", "neard", etc.
"[n]+erd" Will match "nerd","nnerd", etc., but not "erd"
"[a-z]{2}erd" Will match "cherd","blerd", etc. but not "nerd", "erd","buzzerd", etc.
".{2,}erd" Will match "cherd" and"buzzerd", but not "nerd"
"n[e]{1,2}rd" Will match "nerd"and "neerd"
*锚
锚是指它所要匹配的格式,使用它能方便你查找通用字符的合并。
"^blah " - 匹配以blah为行首单词的一行文本;
$ blah" –匹配以blah为行尾单词的一行文本;
"\ "\>blah" – 匹配以blah为尾的单词,如:cakeblah; "\bblah" – 匹配blah在这个单词的开头或结尾的字符串,如blahcake; "\Bblah" – 匹配blah在这个单词的中间的字符串,如asblahaaa。 *间隔 Res中的另一可便之处是间隔(或插入)符号。实际上,这一符号相当于一个OR语句并代表|符号。下面的语句返回一段文本中象"nerd" 和 "merd"的句柄:"(n|m)erd"。间隔功能非常强大,特别是当你寻找文件不同拼写的时候。下面的例子能得到相同的结果:"[nm]erd"。当你使用间隔功能与Res的高级特性连接在一起时,它的真正用处更能体现出来。 *一些保留字符 Res的最后一个最重要特性是保留字符(也称特定字符)。例如,如果你想要查找"ne*rd"和"ni*rd"的字符,格式匹配语句"n[ei]*rd"与"neeeeerd" 和 "nieieierd"相符合,但并不是你要查找的字符。因为'*'(星号)是个保留字符,你必须用一个反斜线符号来替代它,即:"n[ei]\*rd"。其它的保留字符包括: ^ 、 . 、[、] 、$ 、( 、) 、 | 、* 、+ 、? 、{ 、}、\ 等。 网页数据库的连接方法有两种,一种是DSN数据源,另一种是DSN-less方式,即不建立DSN连接数据。我们考虑最简单的BBS系统应用环境,使用互联网上免费资源,通常互联网上免费主页空间只支持简单的ASP应用以及Access数据库应用,Access数据库通常要求放置在固定的虚拟目录位置,譬如:[\db]目录位置,数据库的连接也只支持DSN-less方式,这也是自然的,既然是免费资源,总不能要求人家还特别帮你设置一个DSN数据源。另外,BBS通常只作为Web应用的一部分,或者说作为你个人主页或商业网站提供的一个附加功能,这个时候,你的BBS论坛系统通常都安装在主页空间一个单独的目录下,我们假定为[\BSS]。 所有要进行数据库存取的ASP网页都要以DSN-less方式进行数据库连接,由此我们可以将执行数据库连接的ASP代码单独形成一个插入文件,通常插入文件都是以[.inc]作为扩展名,考虑到安全性的需要,防止用户直接输入文件名下载此插入文件,所以我们仍然以[.asp]作为插入文件的扩展名,比如,我们将一个用作数据读操作的数据库连接插入文件名命名为[dbconr.asp],下面就是其典型代码: <% 'adModeUnknown 0 default 'adModeRead 1 'adModeWrite 2 'adModeReadWrite 3 'adModeShareDenyRead 4 'adModeShareDenyWrite 8 'adModeShareExclusive 12 'adModeShareDenyNone 16 strDBPath = Server.MapPath("dbconr.asp") strDBPath =replace(strDBPath,"\bbs\dbconr.asp","\db\bbsdata.mdb") strDBConn= "DRIVER={Microsoft Access Driver(*.mdb)};DBQ=" & strDBPath SetobjDBConn=server.createobject("adodb.connection") objDBConn.ConnectionTimeOut=20 objDBConn.Mode=1 ‘读模式 objDBConn.open strDBConn %> 注意,其中的objDBConn.Mode既为我们所做的数据库连接将用于操作的模式是读、写、或是读写。至于为什么需要设置Mode属性?设置Mode属性可以节省ADO组件的处理时间。另外,数据用户的权限管理十分重要,设置Mode属性能够有效率地规划整个Web应用程序的用户权限。所以,从安全性和代码执行效率方面考虑,我们将读与写数据库连接插入文件分别开来,分别命名为[dbconr.asp]和[dbconrw.asp]。 数据库连接操作是一个相当频繁的操作,我们可以采用适当的技术来进行数据库连接优化,以提高数据库连接性能。在ASP的数据库编程中,connection对象是我们不可能离开的一个对象,在对数据库进行任何的操作,比如更新记录,插入,删除,检索等,都必须借助于connection对象来完成。形象地来说,connection对象就是程序与数据库沟通的管道,所有对数据库的操作,都必须经过它,因此,无论我们以何种方式连接数据库前,总是少不了执行下列的代码。 Set objDBConn=Server.CreateObject("ADODB.Connection") 建立一个connection对象的实例变量,然后才能在它的基础上建立recordset对象或是command对象来操作数据库。既然connection对象是如此的重要,那么如何优化和管理好connection对象对数据库程序来说是极其重要的,它关系到程序的性能。 每当一个客户执行数据库操作时,就需要借助一个connection对象,而每个connection对象就会占用服务器的一部分资源,而数据库的同时连接数不可能是无限的,因此。在考滤要提供高性能的数据库Web程序时,我们需要考虑如何去减少服务器的开销。一般来说。每个ASP页面中建立一个connection对象,都会在服务器中产生一个对数据库的连接。而不同的页面的connection对象是不能共享的。那么。我们可不可以使同一个用户所访问的不同页面共享一个connection连接通道呢。 我们来回顾一下ASP六大内置对象的session对象,它可以为某个特定的用户来保存私有的数据,如果我们把connection对象保存在session对象中,是否可以使不同的ASP页面都使用同一个连接通道呢?看看下面的这段程序。 <% Set objDBConn=Server.CreateObject("ADODB.Connection") objDBConn.Mode=? objDBConn.Open"[DSN-less串]" session("dbconn")=objDBConn Setrs=Server.CreateObject("ADODB.Recordset") Commandtext = "select * from userlist" connstr=session("dbconn") rs.open Commandtext , connstr , 3 , 2 %> 在这个数据库连接中。我们使用了session对象,首先,建立一个objDBConn的连接对象,然后连接到数据表userlist中,取得连接句柄后,把它保存在session("dbconn")这个session变量中,在打开记录集前,从session("dbconn")中取出句柄,借助于session对象。我们可以使不同的ASP页面共用一个连接对象,减少了对服务器内存的开销,而我们也不需要担心,当一个客户因为错误操作导致服务器不能释放该被占用的session连接对象,因为我们知道每个客户的session对象是有一定的生存期限的,过了这个期限,服务器就会自动把它释放掉。 然而,数据库连接性能的提高是以一定的服务器资源消耗为代价的,所以,我们就要在其中权衡利弊。通常,利用别人的主机空间来作为自已BBS系统的平台,就应该尽谅避免使用过多的服务器资源,诸如APPLICATION以及SESSION变量,反之,主机资源丰富,而应用系统相对较少,则可以考虑采用上述优化方式。 关于网页数据库的操作,ASP拥有三种方法:ADO组件的Connection对象配合SQL语法;ADO组件的Command对象执行SQL语法;使用ADO组件的RecordSet。每种方法各有特点。 1、ADO组件Connection对象配合SQL语法 在网页上使用SQL指令处理数据的访问,需要使用ADO组件的Connection对象建立数据连接,以便让我们下达SQL指令到服务器端的数据库,处理表中的记录。参照3.2.3.1ASP网页数据库的连接所介绍的方法,首先建立一个Connection对象;然后再打开DSN-less,同时,根据将要进行数据操作的类型,设置其Mode属性;最后,使用Connection对象的Execute方法下达SQL指令,通常在使用Execute方法执行SQL指令前,应该指定其CommandTimeOut属性。以会员注册为例,用户填写完注册资料以后,提交系统,系统进行用户资料插入操作: <% ’读取用户提交的资料至各变量 strSQL="INSERT INTOuserlist(username,password,question,answer, " strSQL= strSQL &"email,realname,sex,zjname,zjnumber, " strSQL= strSQL &"lxway,birthday,homepage,quantity)" strSQL=strSQL & "VALUES('" strSQL=strSQL & strUsername & "','" strSQL=strSQL & strPassword & "','" strSQL=strSQL & strQuestion & "','" strSQL=strSQL & strAnswer & "','" strSQL=strSQL & strEmail & "','" strSQL=strSQL & strRealname & "','" strSQL=strSQL & strSex & "','" strSQL=strSQL & strZjname & "','" strSQL=strSQL & strZjnumber & "','" strSQL=strSQL & strLxway & "','" strSQL=strSQL & strBirthday & "','" strSQL=strSQL & strHomepage & "','" strSQL=strSQL & strQuantity & "')" %> <% objDBConn.Execute strSQL %> 这是最基本的数据库操作方式,特别是对于表的插入、删除和更新记录以及单条数据的查询操作,是三种方式中最为简单有效的一种。本系统中,用户身份验证、发表贴子以及回复贴子等相关数据库操作相当频繁,对数据存取效率有相当的要求,至于在数据存取的灵活性方面要求不高,因此,大部分都是采取ADO组件Connection对象配合SQL语法这种数据库操作方式。 2、ADO组件的Command对象执行SQL语法 Command对象和Connection对象的Execute方法一样能够执行SQL指令。在建立Command对象前一样需要建立和打开数据连接,假设活动连接objDBConn已经建立好,其后步骤如下所示: Step1:建立Command对象,其程序代码如下: Set objDBCommand=Sever.CreateObject(“ADODB.Command”) Step2:接着指定ActiveConnection属性为目前打开的数据连接,代码如下: ObjDBCommand.AvtiveConnection=objDBConn Step3:指定CommandText属性为要执行的SQL指令,程序代码如下: ObjDBCommand.CommandText=“Select * from userlist” Step4:使用Execute方法执行SQL指令,objRS就是取得的记录集合,代码如下: Set objRS=objDBCommand.Execute 上述步骤可以取得所有注册会员的详细注册资料,至于添加、删除和更新记录只需下达不同的SQL指令。需要注意的是,Command对象并不支持Close方法,所以关闭Command对象,只需设为Nothing即可。 建立复杂的SQL语句,通常得事先进行许多复杂的数据类型转换,使用Command对象配合Parameters数据集合建立SQL指令则相对来说比较简单,因为对象本身就能够自已处理复杂的数据类型转换,另外,比较Connection对象直接执行SQL语句来说,操作要灵活。 Command对象主要的目的是用在存储程序(Store Procedure),简单地说,存储程序是一些默认的处理程序。这个部分需用要数据源本身拥有指令处理的能力,象MS SQL Server就支持存储程序,但MS Access这类中小型数据库系统就不支持存储程序。 应该说,使用存储程序来操作数据库,具有较其它方式较明显的优点,首先,数据存取效率最高,因为存储过程经过了优化和编译,并且在第一次执行以后,就驻留在缓存中,另外,用户不必在网络上发送有时数以百计的SQL语句,只需通过执行一个简单的存储过程,就能够完成复杂的操作,减少了客户和DB服务器间传递的请求数目,减少了网络通信量。 本系统采用MS Access数据库,所以本方法作为未来系统扩展升级时数据库操作的首选方法。 3、使用ADO组件的RecordSet RecordSet对象为ADO组件最重要的对象,从英文名字看来就是“记录集合”。它将表全部或部分的记录内容,象使用容器一样暂放所需的记录,RecordSet对象能够显示表的内容或进行记录数据的分析处理。 数据的目的是在访问、建立和处理记录,表的内容是由记录所组成。当我们在表中查询所需的数据时,其实就是在表的记录间寻找,RecordSet对象的记录集合可以把所需的记录取出,使用表格的方式,每一行就是一条记录,提供ASP程序一致的数据处理方式。 数据本身其实就是一个虚拟的表格,为什么一定要将它取出放入RecordSet对象容器,然后再进行处理呢?这是因为ADO组件数据源不见得就是数据库表,它可能是一个文本文件,而且所需的数据可能只有几笔,并不需要打开整个表提供全部的记录。直接在表中处理并没有效率,不如在RecordSet记录集合处理后,再更新表的记录,反而较有效率。 总之,不论数据源到底是什么,通过RecordSet对象的记录集合,就可以在ASP程序使用一致的方法处理数据,不论是文本文件、Excel还是数据库,它都是一个表格的记录集合。 在使用ADO组件的RecordSet对象时,因为处理的对象是记录集合,不是表的记录本身,所以,如果记录改变了,一定在用Update方法更新表,才能真正修改表的记录内容。 在数据的查询方面,RecordSet对象的使用相当灵活,虽然RecordSet对象一样可以插入、更新和删除记录,此时直接使用SQL指令反而较有效率。例如:只是插入一条记录,为什么需要建立RecordSet对象的记录集合,然后再更新记录?这在实际操作时,反而多此一举。但是,如果是从表中提取记录集合,然后要对记录进行相对较为复杂的分组分页显示,则使用RecordSet对象来操作数据比起SQL方式来要简单得多。本系统中象会员列表查询或是版主列表查询都采用ADO组件的RecordSet数据操作方式。 我们知道在用浏览器浏览HTML网页时,浏览器会将HTML文件原封不动地全部下载下来,然后再由浏览器解释执行,因而很容易就能看到HTML文件的全部源代码,这对于那些含有保密内容的网页来说是十分不安全的。为了提高网页的安全性,我们采用了ASP网页,前面说过,ASP网页是一种动态网页,它是由服务器中的ASP程序运行产生的动态页面,而ASP的源代码又是全部保存在服务器上的,所以从客户端的角度,ASP源代码是保密的。所以,我们可以利用ASP网页ASP源代码的保密性来实现ASP网页只能被具有相应权限的合法用户访问。 本BBS论坛系统有会员身份权限限制的功能网页相当多,频繁地要求用户输入用户名以及密码,然后比较数据库中会员注册表数据以确认用户身份,再根据用户的身份来确定是否具有本网页的访问权,将会消耗大量的服务器资源,极大地增加Web服务器的负担。此时,我们可以利用ASP的内置对象Session。 当一位尚未建立Session对象的用户浏览到WEB站点的ASP程序时,ASP就会自动产生一个新的Session对象,并且指定唯一的SessionID编号。此后,在浏览此ASP程序和即将在站点内浏览其它ASP程序的过程,我们称为一个Session期间。WEB服务器可以凭借读取ASP程序时传送的SessionID判断用户是否仍在Session期间,直到Session对象TimeOut属性所设置的时间,默认为20分钟或执行Abandon方法。每当读取新的ASP程序后,TimeOut属性都会归零,重新计算,所以除非没有浏览站点,否则Session期间绝对超过20分钟。 每一位用户都可以拥有一组专用的Session变量。虽然每位用户的Session变量名称相同,但是其内容可就不同,而且只有该用户拥有权利读写自已的Session变量,我们可以利用Session的这个特性来实现ASP网页的安全保护。 在本系统设计了一个ASP网页userlog.asp,如果用户想以普通会员的身份发表贴子,或以版主身份管理版面,或以超级管理员身份进行论坛管理,则用户在进入系统之前必须通过userlogin.asp进行登录,login.asp会将用户输入的用户名及密码拿来与数据库中的资料相对比,以确定用户的合适身份,否则,用户只能以匿名用户身份浏览本论坛贴子,却不能发表贴子或回复贴子,当然更不能进行论坛的相关管理操作了。用户的身份将被写入Session对象的username以及adminboard变量,username保存其会员名称,adminboard保存其操作权限,为“0”则其为超级会员,为空则为普能会员,为版面ID则为版主。 userlog.asp源代码如下: <% response.expires=0 On Error Resume Next Dim strUserName Dim strSQL,objRS strUserName=Request.Form("username") strUserPassword=Request.Form("password") strSQL="SELECT * FROM userlist WHEREusername='" & strUserName & "'" set objRS=objDBConn.Execute(strSQL) session("username")="" session("adminboard")="" Dim bLogSucc,repmsg,reptxt,repurl If objRS.EOF Then 'User Doesn't Exists bLogSucc=0 repmsg="此用户不存在" repurl="userlog.asp" reptxt="请重新登录" Else 'User Exists IfobjRS("password")=strUserPassword Then bLogSucc=1 session("username")=strUserName repmsg="欢迎" & strUserName &",您已登录成功" repurl="main.asp" reptxt="返回论坛首页" Else bLogSucc=0 repmsg="密码输入错误" repurl="userlog.asp" reptxt="请重新登录" End if End If %> <% objRS.Close 'Judge if super administrator or board manager if bLogSucc=1 then strSQL="SELECT * FROM adminorlist WHERE username='" &strUsername & "'" setobjRS=objDBConn.Execute(strSQL) iferr.number<>0 then response.write "数据库操作失败:"&err.description end if If NotobjRS.EOF Then ifobjRS("status")="Y" then session("adminboard")=Cint(objRS("manbid")) end if end if 'Write Log objRS.close strSQL="INSERT INTO loginfo(userid,userip,intime)" strSQL=strSQL & "VALUES('" & strUserName &"','" strSQL=strSQL& request.servervariables("remote_host") & "','" strSQL=strSQL & now() & "')" setobjRS=objDBConn.execute(strSQL) iferr.number<>0 then response.write "数据库操作失败:"&err.description end if end if objRS.close objDBConn.Close Set objRS=Nothing Set objDBConn=Nothing %>3.2.3 实现方法
3.2.3.1 ASP网页数据库的连接
3.2.3.2 ASP网页数据库的操作
3.2.3.3 ASP网页安全性的实现方法
setTimeout("location.href =reinput.href",1000); |
确定了用户的会员身份以后,在每个需要进行身份识别的ASP网页插入身份识别代码,如果此用户具有访问这个ASP网页的权限,则输出其相应的HTML文件,否则,系统转到用户登录网页要求用户重新登录以取得访问此ASP功能网页的合法身份。例如,论坛基本信息设置ASP网页需要访问者具有超级会员身份,在本网页前必须插入以下一段代码:
<%
'Check the Super Administrator Right
Response.Expires=0
if Session("adminboard") <>"0" Then
Response.redirect "userlog.asp?errmsg=您没有超级用户管理权限,请重新登录或退出!"
End If
%>
论坛可以由管理员设置是否支持UBB标签,UBB标签就是不允许使用HTML语法的情况下,通过论坛的特殊转换程序,以至可以支持少量常用的、无危害性的HTML效果显示。而对于那类带有恶意代码的文本予以屏蔽。下面为本系统支持的UBB具体使用说明:
[B]文字[/B]:在文字的位置可以任意加入您需要的字符,显示为粗体效果明。
[I]文字[/I]:在文字的位置可以任意加入您需要的字符,显示为斜体效果。
[U]文字[/U]:在文字的位置可以任意加入您需要的字符,显示为下划线效果。
[URL]HTTP://WWW.my0661.NET[/URL]
[EMAIL][email protected][/EMAIL]
[img][/img]:在标签的中间插入图片地址可以实现插图效果。
[flash]Flash连接地址[/Flash]:在标签的中间插入Flash图片地址可以实现插入Flash。
[code]文字[/code]:在标签中写入文字可实现html中编号效果。
[quote]引用[/quote]:在标签的中间插入文字可以实现HTMl中引用文字效果。
[list]文字[/list] [list=a]文字[/list] [list=1]文字[/list]:更改list属性标签,实现HTML目录效果。
[fly]文字[/fly]:在标签的中间插入文字可以实现文字飞翔效果,类似跑马灯。
[move]文字[/move]:在标签的中间插入文字可以实现文字移动效果,为来回飘动。
[color=颜色代码]文字[/color]:输入您的颜色代码,在标签的中间插入文字可以实现文字颜色改变。
[size=数字]文字[/size]:输入您的字体大小,在标签的中间插入文字可以实现文字大小改变。
[face=字体]文字[/face]:输入您需要的字体,在标签的中间插入文字可以实现文字字体转换。
[DIR=500,350]http://[/DIR]:为插入shockwave格式文件,中间的数字为宽度和长度
[RM=500,350]http://[/RM]:为插入realplayer格式的rm文件,中间的数字为宽度和长度
[MP=500,350]http://[/MP]:为插入为midia player格式的文件,中间的数字为宽度和长度
[QT=500,350]http://[/QT]:为插入为Quick time格式的文件,中间的数字为宽度和长度
[URL=HTTP://WWW.my0661.NET]潮阳网络[/URL]:有两种方法可以加入超级连接,可以连接具体地址或者文字连接。
[align=center]文字[/align]:在文字的位置可以任意加入您需要的字符,center位置center表示居中,left表示居左,right表示居右。
[EMAIL=MAILTO:[email protected]]feng[/EMAIL]:有两种方法可以加入邮件连接,可以连接具体地址或者文字连接。
[glow=255,red,2]文字[/glow]:在标签的中间插入文字可以实现文字发光特效,glow内属性依次为宽度、颜色和边界大小。
[shadow=255,red,2]文字[/shadow]:在标签的中间插入文字可以实现文字阴影特效,shadow内属性依次为宽度、颜色和边界大小。
1、超文本信息的输入
用户在书写贴子内容时,可以输入这类带格式文本,例如,用户希望输入一段红色文字“警告:SARS有可能卷土重来!”,则应照这种格式输入文本“[color=’red’]警告:SARS有可能卷土重来[/color]”。系统在用户输入贴子界面应提供UBB使用帮助链接,对于一些常用的UBB标签,系统应提供其快捷输入方式。例如,界面提供一个输入飞行文字UBB标签快捷按钮,用户单击此按钮,系统则弹出一个文本输入框,用户在其中输入文字,完成提交后,系统将自动在贴子内容输入滚动文本框内文字的末尾添加带有飞行文本标签的这段文字。其实现代码如下(采用JavaScript编写):
……
……
function fontchuli(){
if((document.selection)&&(document.selection.type == "Text")) {
var range = document.selection.createRange();
var ch_text=range.text;
range.text = fontbegin + ch_text + fontend;
}
else {
document.kbbs.body.value=fontbegin+document.kbbs.body.value+fontend;
document.kbbs.body.focus();
}
}
function fly() {
fontbegin="[fly]";
fontend="[/fly]";
fontchuli();
}
……
……
文本在提交后,系统在保存此贴子之前,应该将提交的贴子的标题、贴子内容作适当的转换,比如,用户输入的‘<’以及‘>’等字符,应该转换成HTML非保留字符。我们采用Server对象的HTMLEncode方法。
HTML用一些特殊的字符(比如‘<’和‘>’)来定义HTML元素。这些字符叫做“保留字符”。如果想要在一个Web页中将它们作为普通的文本字符串来使用,HTML会将它们解释成HTML编码,这就违背了使用者的原意。HTMLEncode方法的作用就是将文本字符串中的保留字符转换成特殊字符,使其能够正确地显示出来,而且不被当作HTML编码的一部分来解释。经过编码,文本中的‘<’和‘>’分别被‘<’以及‘>’所取代。
假设贴子的标题以及内容分别被存放在title以及body这两个变量里,转换代码如下:
……
title=Server.HTMLEncode(title)
body=Server.HTMLEncode(body)
2、超文本信息的显示
保存在数据库贴子数据表中的相关贴子标题以及内容的数据,是经过了HTMLEncode方法处理过的数据,而且数据中包含了大量的UBB标签,在显示贴子之前,应该将那些UBB标签作适当转换,以使用户浏览器能对其进行正确解释。
比如,对于“[I]备注:中国载人航空火箭于2003年10月15日成功升空[/I]”,系统应该将其转换成“备注:中国载人航空火箭于2003年10月15日成功升空”。对贴子内容中超文本信息的正确转换我们用到了VBScript里的正则表达式对象RegExp。
RegExp提供简单的正则表达式支持功能,它包括一系列的属性和方法,用于从一段文本中进行正则表达式模式匹配,找出或用一段文字替代与之相匹配的文本。
在VBScript对象包含三个属性以及支持三个方法,下面分别说明如下:
I、Global属性
设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。使用语法:object.Global [= True | False ],object 参数总是 RegExp 对象。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 True。
II、IgnoreCase属性
设置或返回一个Boolean值,指明模式搜索是否区分大小写。使用语法:object.IgnoreCase [= True | False ]。object 参数总是一个 RegExp 对象。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为True。
III、Pattern属性
这是正则表达式对象最重要的一个属性,设置或返回被搜索的正则表达式模式。使用语法:object.Pattern [= "searchstring"]。正则表达式对象将根据其正则表达式进行相应的模式匹配。
VI、Replace方法
替换在正则表达式查找中找到的文本。使用语法为:object.Replace(string1,string2)。Replace 方法的语法包含以下几个部分:object是必需,总是一个 RegExp 对象的名称;string1是必需的,string1 是将要进行文本替换的字符串;string2是必需的,string2 是替换文本字符串。被替换的文本的实际模式是通过 RegExp 对象的 Pattern 属性设置的。Replace 方法返回 string1 的副本,其中的 RegExp.Pattern 文本已经被替换为 string2。如果没有找到匹配的文本,将返回原来的 string1 的副本。
V、Execute方法
对指定的字符串执行正则表达式搜索。使用语法为:object.Execute(string)。Execute 方法的语法包括以下几个部分:object是必需的,总是一个 RegExp 对象的名称;string也是必需的,要在其上执行正则表达式的文本字符串。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。
VI、Test方法
对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。使用语法为:object.Test(string)。Execute 方法的语法包括以下几个部分:object 必需的,总是一个 RegExp 对象的名称;string 必需的,要执行正则表达式搜索的文本字符串。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。如果找到了匹配的模式,Test方法返回True;否则返回False。
比如,我们要在将一段文本中所有fox或Fox字符串替换成cat,其示例代码如下:
Dim regEx,str1 ' 建立变量。
str1 ="The quick brown fox jumped over the lazy dog."
Set regEx =New RegExp ' 建立正则表达式。
regEx.Pattern= "fox" ' 设置模式。
regEx.IgnoreCase = True '设置是否区分大小写。
ReplaceTest =regEx.Replace(str1, replStr) ' 作替换。
在本系统中,假设Body变量为用户保存的贴子内容,其中包含有UBB标签文本,我们要将其转换成用户浏览器可以识别的格式,比如,飞行文字的UBB代码文本为“[fly]轻舞飞扬[/fly]”,其转换示例代码如下:
dim re
Set re=newRegExp
re.IgnoreCase=True
re.Global=True
re.Pattern="\[fly\](.[^\[]*]\[\/fly\]"
body=re.Replace(body,"")
我们可以照此方法,实现对另外的UBB标签的正确转换,转换的关键是构造出正确的正则表达式。在本系统中,系统支持的所有UBB标签转换正则表达式全部包括在ubb.asp文件中的code_jk函数中。
采用最基本的应用环境:
1、硬件环境
100M以太网;PentiumIII IA服务器;支持WIN98以上的PC客户机
2、软件环境
服务器端安装了Windows NT4.0系统、IIS4.0Web服务器、MS Access2000数据库等;客户端安装了Windows98系统、IE5.0浏览器等。
把本系统布置在如上所述最基本的应用环境下,本系统的运行是非常理想的。在经过超级会员一系列的论坛基本设置以后,就可以开始在论坛上发表贴子查看贴子回复贴子及进行其它论坛操作。系统的反应很快,读出页面基本上不需要多少时间,一晃就能出来。经过本系统各项功能操作测试,系统具有较好的稳定性。
把本系统布置在互联网上(http://www.brinkster.com),本网站提供的基本功能有:支持ASP或ASP.NET,支持Access数据库,但此数据库文件必须放置在[db]。但是,此网站不支持FTP网站维护,只提供WEB方式的网站内容更新,而且每次不能超5个文件。
因本网站主机在北美,连接数据较慢,此外因数据更新较繁杂,只布置了一些论坛的基本功能,但是经过试运行,尽管速度有些慢,其系统运行相当稳定。
完成这次设计任务总共用了六个星期时间,前三个星期用来收集资料、学习要用到的各项开发技术、进行论坛的系统分析,中间两个星期用来设计系统,后一个星期用来测试及修改。论文的撰写一直贯穿其中。
为本系统总共设计近六十个ASP网页,近万行代码,七个数据表。通过这次毕业设计,我从中学到了许多新的知识,而且通过这次毕业设计,培养了我综合多门学科中的知识、迅速规划并开发出目标系统的能力,以及编程能力也有了很大的提高。另外也有许多心得体会,所谓系统开发如人生百味,酸甜苦辣皆有之。
严格按工程的方法来设计系统相当重要,不能认为基于Web的数据库管理的BBS系统很小,可以无需花太多的时间来做系统分析,甚至可以无需经过系统定义而直接进入系统编码阶段。这种想法很天真,最小的系统,你若想保证质量,把系统做得更可靠更有效率功能越强,应该考虑的方方面面就越多越复杂。系统分析过于简单,系统定义过于抽象,则在系统设计与编码阶段遇到的困难就越多,特别是其中若不得不做一些功能性甚至系统结构性方面的变动,将面对许多重复性的工作。在系统开发过程中重复工作过多,将会极大地影响系统开发的积极性,进而影响整个系统的质量。在这一点上,我体会尤深,我化了三个星期,即接近系统开发一半的时间用在系统分析与系统定义上,也就是在开始浪费了一周多的时间,即边编码边分析,边分析边编码,后来越来越乱越来越复杂,不得不重新考虑系统开发计划的合理性。总之,在这一点上,我的体会是,系统分析越充分,系统定义越具体,那么后续的系统设计与开发工作就越有效率,且系统的质量也越有保障。
本系统是一个最基本的基于WEB的BBS系统,可扩展性很大,科学的开发过程也极有利于系统的扩充与扩展。系统现在采用的是MSAccess数据库,视需要可以移植到MS SQL Server或者其它大中型数据库系统环境下,只需改动少数几个ASP功能模块文件。系统的分析与定义都结合了现在流行的面向对象方法以及传统的结构分析与设计方法,如果想采用似有流行趋势的ASP.NET技术重写系统,最多也只需二个星期甚至更少的时间来作系统编码以及测试,效率相当高。
回顾这一个半月的系统开发工作,总结起来那就是,软件的开发是相当辛苦的,但成功以后的喜悦也是非常美妙的,而且我发现,其中你投入的心血越多,成功以后你所获得的快乐与充实感也更多更强。难道人越辛苦就会越幸福快乐吗?对,软件系统开发就是这样!
* 陈会安 《ASP网页制作彻底研究》2000/10
* 林金霖 《ASP实务经典》,中国铁道出版社,1999/12
* 胡伟 《FrontPage2000 中文版技巧与实例》 1999/9
* 黄敏如,《FrontPage2000中文版入门与提高》 1999/7
* Jeffry Dwight 《CGI开发使用手册》 1999/5
* 黄斯伟 《CSS网页样式设计》 1999/5
* 王春森 《程序设计》 1999/10
* 王映雪、肖平、佟秋利《HTML网页制作》 1998/10
* 萨师煊、王珊《数据库系统概论(第二版)》1991/4
* 赵彤、杨玉《VBScript制作实例》 1999/3
* 六木工作室《VisualBasic6.0中文版使用编程技巧》1999/9
* 沈建强、夏耘《Photoshop图像处理速成培训》 1999/7
* http://www.chinaprogrammer.com/webbuild/index.asp中国程序员网站