前言:本站為你精心整理了BBS系統畢業范文,希望能為你的創作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。
目錄
一、前言2
二、系統定義3
2.1系統分析3
2.1.1Internet以及Web技術的發展3
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.1ASP技術22
3.2.2.2ADO技術24
3.2.2.3數據庫技術26
3.2.2.4VBScript及JavaScript腳本語言28
3.2.2.5正則表達式技術32
3.2.3實現方法36
3.2.3.1ASP網頁數據庫的連接36
3.2.3.2ASP網頁數據庫的操作40
3.2.3.3ASP網頁安全性的實現方法45
3.2.3.4在貼子中實現超文本信息輸入和顯示51
四、系統的運行效果60
五、結束語61
參考文獻63
基于Web的通用BBS系統的建立與維護
作者:
關鍵詞
BBS、ASP、ADO、MSAccess、JavaScript、VBScript、RegExp
摘要
本文是一篇討論基于Web的數據庫管理的本科畢業論文,它詳細地講述了開發一個基于Web的通用BBS(BullitinBoardSystem)網站系統所用到的技術和方法。其中運用了ASP技術(AvtiveServerPage)、ADO技術(ActiveXDataObject)、MSAccess數據庫技術、RegExp技術(RegularExpression正則表達式)、VBScript及JavaScript腳本語言技術等等,并從幾個不同的方面來對上述技術的實現方法進行了討論。
一、前言
進入二十一世紀,計算機技術迅速向著網絡化、集成化方向發展。傳統的單機版應用軟件正在逐漸退出舞臺,取而代之的是支持網絡、支持多種數據信息(多媒體)的新一代網絡版應用軟件,而目前網絡版軟件中似乎存在著兩種不同的趨勢,一種是稱為客戶端——服務器的C/S結構應用系統,這類軟件具有結構嚴謹,運行效率高,服務器端壓力小,安全性好等優點,被廣泛運用于局域網中。而另一種,也是本畢業設計所采用的,是稱為瀏覽器——服務器的B/S結構應用系統,它的特點是在客戶端直接采用了功能強大的瀏覽器軟件作為界面,其優點在于軟件開發效率高,客戶端不受操作平臺的限制、也不受地域的限制,網絡傳輸量少,即適用于局域網,更適用于Internet,而且投資小、見效快,用戶可以不必進行服務器方面的投資,而是去租用,甚至是免費使用ISP的服務器資源,因而受到越來越多中小型單位的青睞。
本文討論的是一個基于Web的通用BBS網站,它具有BBS網站應該具有的所有功能。
二、系統定義
2.1系統分析
2.1.1Internet以及Web技術的發展
Internet起源于20世紀60年代末、70年代初,當時,美國國防部為了將充斥于軍事基地內各種廠商的電腦主機互連,讓它們可以進行數據交換以便研究工作順利進行,于是成立了ARPA網絡計劃。ARPA計劃嘗試建設一個網絡系統,它可將各種不同廠商的電腦連接起來。隨著這個計劃的成功,各學術單位,研究機構也紛紛與ARPA計劃所建立的ARPANet連接。到了20世紀80年代,Internet這個名詞因勢產生,它代表著這十年來所構建涵蓋全球各地的網絡系統。從1990年起,商業使用的Internet在美國急速地擴大,而Internet也從原來屬于少數人使用的網絡系統轉變為普通百姓也能夠使用的網絡系統。
最初的Internet資源服務都還停留在文本模式,1989年,量子物理實驗室(CERN)下的一個研究小組著手開發一種全新的Internet服務,它可以在網絡上傳送圖片、文本、影像、聲音等多媒體數據。于是由TimBernersLee領導的小組開發出了一種主從、分布式的網絡服務系統,這就是WWW,俗稱“萬維網”。
所謂WWW其實就是連上Web服務器訪問資源,取得的內容就是所謂的“主頁”(HomePage)。進入的網頁通常不會只有一頁,而是整個網站的內容。
“網站”是一種呈現在網絡上的新興媒體,通過Internet已經成為一個實時的,多媒體的信息傳播渠道。它的載體主要是電腦,范圍覆蓋全球各地,沒有國界,不分人種,時時刻刻地提供服務。目前,人們漸漸開始把網站稱之為廣播、電視、報刊以外的第四新聞媒體,以“共享、公平、公正、創新、國際化、團隊精神”為特征的網絡文明也已逐漸成為這個時代的標志,人們越來越習慣于通過Internet網絡獲取信息,通過Internet在網站上發表自已對社會對生活的理解和建議。
2.1.2基于Web的通用BBS系統技術可行性分析
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技術,用通用瀏覽器就實現了原來需要復雜專用軟件才能實現的強大功能,并節約了開發成本,是一種全新的軟件系統構造技術。隨著Windows98/Windows2000將瀏覽器技術植入操作系統內部,這種結構更成為當今應用軟件的首選體系結構。
將應用程序分成好幾個離散邏輯組件,就是多層式結構(N-Tier)應用程序。最常見的選擇是分成三個部分:表示層、事務邏輯層和數據層(3-Tier),不過也有其它的組合。多層式結構應用程序,在一開始是解決某些與傳統客戶端/服務器(主從式)應用程序相關的問題,但是隨著Web的出現,此結構已經成為主導新程序之開發的結構。下面就是3-Tier結構各層功能以及經常采用的技術作個簡介:
表示層主要運行于客戶端瀏覽器,采用Script(腳本)語言編寫。HTML、JavaScript、VBScript是此類應用系統中展示層最常用的腳本編制語言,結合CCS以及ActiveX技術,能設計出交互相當靈活功能又相當強大的客戶端網頁。
事務邏輯層設計通常有三個選擇:ASP網頁、COM或COM+組件、DBMS中所執行的預存程序。將程序代碼的一部分,建立成執行于數據庫管理系統(DBMS)中的預存程序,使數據與程序代碼儲存在相同的位置,有助于最佳化執行效率,但是,預存程序都依賴于特定的數據庫系統,在編寫和偵錯方面都相當復雜,只適宜于大型的商業應用系統。以COM對象的方式,編寫中間層(MiddleTier)事務邏輯,可以使用全功能的語言,來產生經過編譯的執行程序,執行效率也相當高,此外,在COM對象中包裝事務邏輯,還可以清楚地將此程序代碼與網頁內含的展示程序代碼分隔,這樣可以使應用程序更易于維護,但是,COM對象的部署也有一定的麻煩,新編寫的組件對象,只有在服務器重新啟動后才能被應用程序調用。用ASP網頁設計事務邏輯相對來說比較簡單,但是,ASP網頁采用腳本語言來編寫事務邏輯,比如VBScript,程序代碼只有在執行時才被翻譯,這樣會降低執行效能,此外,ASP網頁中的程序代碼也是難以維護的,因為事務邏輯程序代碼與建立使用者接口的展示程序代碼彼此混雜在一起。
數據層較為靈活,視系統規模可選擇Sybase、Oracle、MySQL、SQLserver或者MSAccess。
綜上所述,結合本系統實際需要,本BBS系統采用B/S結構,使用微軟公司的技術解決方案。開發環境采用微軟的FrontPage2000+PWS。引入WindowsDNA概念,將WindowsDNA應用到系統開發中。采用3-Tier軟件結構:表示層采用HTML、JavaScript或VBScript結合CSS、ActiveX技術來編寫;事務邏輯層,考慮到本系統為通用BBS系統,系統應該具備較大的可伸縮性,應該能適應最基本應用最廣泛的WEB平臺,特別是個人用戶想在一些免費主頁空間搭建自已的論壇,而這類免費主頁空間通常只支持ASP來處理服務器端數據或數據庫,另外,通用系統應該具備較大的可擴展性,目前,技術發展較快,未來應該能以較小的成本用重寫本系統,因此,本系統事務邏輯層設計采用ASP網頁;至于數據層,本系統采用最基本的MSAccess數據庫系統,視需要,系統作較小的改動就可以移植到其它大型數據庫系統。
本系統要求客戶端支持IE4.0以上或與之兼容的瀏覽器軟件,客戶端硬件最低要求對應于IE4.0的硬件平臺要求。服務器端要求支持ASP以及MSAccess數據庫。
本系統的開發環境和開發工具為:Windows98,PWS,FrontPage2000,MSAccess。
2.2需求分析
2.2.1系統的綜合要求
1、系統界面要求
系統的初始界面假定用戶是匿名登錄,用戶可以通過初始界面提供的統一的用戶登錄接口,登錄進入各自的操作界面
2、系統功能要求
本系統應具有通常BBS網站應該具有的所有功能,包括用戶注冊、用戶登錄、匿名登錄、發表文章、閱讀文章、回復別人的文章、分頁查找、主題查找、作者查找、多種方式排序、個人資料修改、在線人數統計等,此外,用戶在發表貼子時,能輸入帶格式文本,用戶在發表或回復一篇貼子時,能獲得相應的積分,其積分能反應此用戶在本論壇的活躍程度。
本系統操作用戶按不同級別依次可分為:匿名用戶、普通會員用戶、版主會員用戶、超級用戶。高級別的用戶可以繼承低級別用戶的公用功能。同時,各級別用戶具有一定的只有以本級別身分登錄才具有的私有功能。
匿名用戶功能要求---通用功能:查看各版面文章、查看系統版主列表、查看系統會員列表;私有功能:注冊為系統正式會員、會員找回遺失密碼、登錄為正式會員。
普通會員功能要求---通用功能:發表或回復貼子、個人資料維護、退出或重新以匿名身分登錄;私有功能:申請為版面版主、注銷會員資格。
版主會員功能要求---通用功能:貼子管理、張貼公告、友情鏈接管理
超級用戶功能要求---通用功能:論壇基本設定、版面管理、版主會員管理、普通會員管理
3、系統性能要求
對于貼子查看、發表貼子以及回復貼子這類頻繁發生的系統操作,要采取適當的技術優化這類數據操作,以提高數據存取效率。
4、安全性保密性可靠性等其它方面的要求
高級別用戶的所有管理操作要有針對低級別用戶的身分識別功能,以防止低級別的用戶越權執行高級別用戶才具有的操作功能。
2.2.2系統的數據要求
根據系統的功能需求,本系統管理和維護以下幾種數據元素(實體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圖)如下:
(圖轉下頁)
2.2.3系統的邏輯模型
系統邏輯模型數據流簡要說明:
1、匿名用戶與信息處理系統之間
系統的輸入數據流:注冊資料、登錄數據、找回密碼數據
系統的輸出數據流:用戶遺失密碼、某篇貼子內容、會員列表、版主列表、版面列表、人氣貼子列表、熱門話題列表
加工邏輯:注冊加工、登錄加工、用戶找回密碼加工
2、會員用戶與信息處理系統之間
系統的輸入數據流:版主資格申請、注冊資料修改、發表貼子、回復貼子
系統的輸出數據流:某篇貼子內容、會員列表、版主列表、版面列表、人氣貼子列表、熱門話題列表
加工邏輯:版主資格申請、注冊資料修改、發表貼子,回復貼
3、版主與信息處理系統之間
系統的輸入數據流:注冊資料修改、發表貼子、回復貼子、友情鏈接維護、公告、管理版面貼子維護
系統的輸出數據流:某篇貼子內容、會員列表、版主列表、版面列表、人氣貼子列表、熱門話題列表
加工邏輯:注冊資料修改、發表貼子、回復貼子、友情鏈接維護、公告、管理版面貼子維護
4、超級會員與信息處理系統之間
系統的輸入數據流:注冊資料修改、發表貼子、回復貼子、友情鏈接維護、添加版面、論壇基本信息維護、論壇所有貼子維護、版主申請批復
系統的輸出數據流:某篇貼子內容、會員列表、版主列表、版面列表、人氣貼子列表、熱門話題列表
加工邏輯:注冊資料修改、發表貼子、回復貼子、友情鏈接維護、添加版面、論壇基本信息維護、論壇所有貼子維護、版主申請批復
三、系統設計
3.1系統概要設計
3.1.1數據結構的設計
參照用戶與版面之間管理關系ER圖,可以將用戶、版面轉換成三個關系模式,設計如下:
論壇版面關系模式(版面ID#,版面中文名,版面英文名,版面簡介)
用戶關系模式(用戶名#,用戶密碼,用戶密碼提示問題,問題答案,用戶EMAIL,用戶真名,用戶性別,用戶出生年月,用戶主頁,用戶證件名稱,用戶證件號碼,用戶聯系方式,用戶積分)
管理員關系模式(管理員ID#,用戶名#,申請管理版面ID#,申請管理理由,申請被批示狀態)
參照用戶與貼子之間ER圖,可以將其轉換成二個關系模式,設計如下:
用戶關系模式(用戶名#,用戶密碼,用戶密碼提示問題,問題答案,用戶EMAIL,用戶真名,用戶性別,用戶出生年月,用戶主頁,用戶證件名稱,用戶證件號碼,用戶聯系方式,用戶積分)
貼子關系模式(貼子ID#,標題,貼子類型,主貼子ID,回復數量,點擊次數,標題圖像,貼子內容,貼子書寫時間)
按照上述轉換方法,再結合系統一些功能以及性能方面的需要,系統所有關系模式設計如下:
論壇基本信息(論壇信息ID#,論壇名,版權說明,論壇公告標題,公告內容,最后一次修改時間)
論壇版面信息(版面ID#,版面中文名,版面英文名,版面簡介)
用戶基本信息(用戶名#,用戶密碼,用戶密碼提示問題,問題答案,用戶EMAIL,用戶真名,用戶性別,用戶出生年月,用戶主頁,用戶證件名稱,用戶證件號碼,用戶聯系方式,用戶積分)
管理員基本信息(管理員ID#,用戶名#,申請管理版面ID#,申請管理理由,申請被批示狀態)
貼子基本信息(貼子ID#,版面ID#,用戶名#,標題,貼子類型,主貼子ID,回復數量,點擊次數,標題圖像,貼子內容,貼子書寫時間,最后一次更新貼子時間)
友情鏈接基本信息(鏈接ID#,用戶名#,鏈接名,鏈接URL,鏈接說明)
用戶訪問日志信息(日志ID#,用戶名#,用戶登錄IP,登錄時間,退出時間)
注:第一個帶“#”標志的屬性為本關系模式的主鍵,其它為外鍵
3.1.2系統結構的設計
系統主頁面自動進行身份判別,按照訪問者的身份自動進入其相應的操作界面,其流程如下所示:
各類用戶的操作界面所具有的功能如下表所示:
(表見下頁)
用戶
類型功能
類型功能過程
編號過程名
匿名
用戶私有登錄為正式會員P1.1Userlog.asp
注冊為正式會員P1.2Userreg.asp
會員找回遺失密碼P1.3Getpass.asp
公有查看系統會員列表P1.4Useradmin.asp
查看系統版主列表P1.5Adminorlist.asp
查看各版面文章列表P1.6Topic.asp?bid=XXX
查看熱門話題P1.7Topic.asp?method=hot
查看人氣貼子P1.8Topic.asp?method=hits
查看某篇文章P1.9Show.asp?id=XXX
普通
會員私有申請為版面版主P2.1Adminapply.asp?bid=XXX
注銷會員資格P2.2Userlogoff.asp
公有個人資料維護P2.3Usermodify.asp
發表貼子P2.4Post.asp?bid=XXX
回復貼子P2.5Post.asp?id=XXX&bid=XXX
重新以匿名身分登錄P2.6Quitbbs.asp
版主
會員公有貼子管理P3.1Articleadmin.asp
張貼公告P3.2Newspost.asp
友情鏈接管理P3.3Linkadmin.asp?bid=XXX
超級
會員公有論壇基本設定P4.1BBSset.asp
版面管理P4.2Boardadmin.asp
(注:私有功能為該級別用戶所獨有的功能,不能為其高級別用戶所繼承,而其公有功能則可以為比其級別高的用戶所繼承)
3.2系統詳細設計
3.2.1基本算法
基于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)。
3.2.2關鍵技術
3.2.2.1ASP技術
ASP技術是一種類似HTML(HypertextMarkupLanguage超文本標識語言)、Script與CGI(CommonGatewayInterface通用網關接口)的結合體,簡單的講它是一種運行于服務器的腳本語言,但是其運行效率比CGI更高、程序編制也比HTML更方便且更有靈活性,程序安全性及保密性也遠比Script好。
其特點歸納如下:
1.ASP可以和HTML或其他腳本語言(VBScript與JavaScript)互相嵌套。
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方法允許客戶端用戶建立一個ActiveXServer組件實例,其所建立組件實例會隨著服務器端完成ASP網頁的處理而自動被釋放。如果希望此對象實例可以跨多個ASP網頁,就要用到Session對象保留該組件實例,直到Session對象的運行時間到了,或是在其他ASP網頁調用Session對象的Abandon方法,此組件實例才會被釋放。
Session對象,Session對象在ASP程序編寫中占了相當重的份量,由于網頁是一種無狀態的程序,因此幾乎無法知道用戶的瀏覽狀態。必須通過Session對象記錄用戶的相關信息,以供用戶再次對此Web服務器提出要求時作確認,例如,在某些特定的網頁中,常需要用戶輸入確認的賬號和密碼,假如這些身份確認的結果無法保留,那豈不是每一個網頁都需要重新輸入一次密碼。換而言之,每一個Session的用戶,Web服務器均會自動的為它們建立一個Session。必須說明,Session對象只能適用于具備Cookie功能的瀏覽器。
3.2.2.2ADO技術
ADO(ActiveXDataObjects)是微軟公司提供給網頁開發者在網頁中存取數據庫的最新技術,它也是ASP內置的重要組件,ADO主要的目的是為了存取或修改數據源的數據、或增加數據到指定的數據源,數據源不僅包括數據庫,而且包括dBase、Excel、Foxpro、Access或文本文件等一些小型的數據表,所以,只要是ODBC驅動程序所能存取的數據源皆是ADO存取的對象。ADO主要是由Connection對象、Command對象、Parameter對象、Recordset對象、Field對象、Property對象及Error對象等七個對象與Fields數據集合、Properties數據集合、Parameters數據集合及Errors數據集合等四個數據集合所組合而成,其功能概述如下。
ADO提供的七個對象:
1.Connection對象負責與指定的數據源進行連接,除此之外,它還可以通過事物(Transaction)來確保在事物中所有的數據源變更的全部成功。
mand對象負責對數據庫提供請求,也就是傳遞指定的SQL命令。換而言之,Command對象必須經過一個已經建立的連接(Connection對象)發出數據操作語言(DML,DataManipulationLanguage)來操作數據源的數據,這些命令通常包括INSERT(增加記錄)、DELETE(刪除記錄)、UPDATE(更新記錄)、或是SELECT(以Recordset的形式選取數據)等。除此之外,也可以通過Command對象對數據庫發出數據定義語言(DDL,DataDefinitionLanguage),例如CREATETABLE(建立數據表)、DROPTABLE(刪除數據表)或ALTERTABLE(修改數據表結構)等。
3.Parameter對象負責傳遞Command對象所需要的SQL命令參數。
4.RecordSet對象負責瀏覽和操作從數據庫取出的數據,換而言之,RecordSet對象就象是一個二維的數組,數組的每一行表示一個數據記錄,而每個數劇列包含一個或多個數據字段,即Field對象。
5.Field對象表示指定RecordSet對象的數據字段。
6.Property對象表示ADO的各項對象屬性值,換而言之,每個ADO對象都會有一組描述和控制對象行的屬性。
7.Error對象負責記錄連接過程所發生的錯誤信息。
ADO提供的四個數據集合:
1.Connection對象包含Errors數據集合,在Errors數據集合中包含數劇源響應失敗時所建立的Error對象。
mand對象包含Parameters數據集合,在Parameters數據集合中包括Command對象所有的Parameter對象。
3.RecordSet對象包含Fields數據集合,在Fields數據集合中包含RecordSet對象的所有Field數據字段對象。
4.Connection對象、Command對象、RecordSet對象與Field對象皆包含一個Properties數據集合,在Properties數據集合中包含所對應Connection對象、Command對象、RecordSet對象與Field對象的Property對象。
ADO的七個對象及四個數據集合相互的關系圖如下:
ActiveXDataObject關系圖如下:
3.2.2.3數據庫技術
1、MSAccess數據庫
數據庫(Database)是一系列信息資源的集合。在一個數據庫中,與一個項目有關的所有信息都可以叫做一條記錄(Record)。每一條記錄都是由一系列的字段(Field)組成的。一系列記錄的集合就構成了數據表格(Table)。對于一個簡單的“平面文件”的數據庫來說,它僅包含了一個數據表格,而對一個“關系型”數據庫來說,它卻包含兩個或兩個以上的數據表格,表格的各字段之間存在這一種或多種關系(有時可以把這種關系叫做“鏈接”)。
簡單的平面文件數據庫的用途非常有限,而關系型數據庫卻能夠包含數據以百萬計甚至以億計的記錄,并可以利用復雜的標準對這些記錄進行操作,例如排序和統計。把它們叫做“關系型”數據庫,是因為需要在這些數據表格的字段之間建立特定的鏈接關系。關系型數據庫的優點在于:通過將一個表格中的字段與另一個表格中的字段聯系起來,兩個表格之間的信息可以相互調用,可以避免信息的重復記錄,也可以避免管理上的混亂。因此關系型數據庫可以減小數據庫的體積,這對于大型的數據庫來說具有非常重要的意義。
建立WEB站點時,可以使用兩種主要的數據庫:MicrosoftSQLServer和MicrosoftAccess。MicroSQLServer是一種功能齊全的客戶機/服務器數據庫產品,適用于系統經常被大量的用戶查詢的情況。對于查詢次數有限的情況,則可以采用中小型數據庫的代表產品MicrosoftAccess。MicrosoftAccess是理想的入門級產品,其中提供了大量的向導,可以輔助完成數據庫的創建和管理。
2、數據源(DSN)
ASP網頁通過DSN數據源或者DSN-less方式連接網頁數據庫。
DSN數據源方式:ASP網頁通過標準的ODBC(OpenDataBaseConnectivity)數據源DSN(DataSourceName)接口訪問數據庫數據。ODBC屬于一種標準的數據接口,提供各類應用程序一個數據訪問的標準方法。ODBC規范為應用程序提供了一套高層調用接口規范和基本于動態鏈接庫的運行支持環境。使用ODBC開發數據庫應用程序時,應用程序調用的是標準的ODBC函數和SQL語句,數據庫的底層操作由各個數據庫的驅動程序完成。使用DSN數據源方式,用戶必須以手工的方式進行ODBC配置,添加一個指向用戶數據庫的系統數據源DSN,ASP網頁使用DSN數據源字符串連接至用戶數據庫,例如:
strDB-DSN=”DSN=DSN名稱;uid=XXX;pwd=xxx”
DSN-less數據源方式:使用本方式連接數據庫,就必須自行提供DSN數據的相關信息,最重要的是驅動程序。例如:
strDBConn=”DRIVER={MicrosoftAccessDriver(.mdb)};DBQ=c:\userdb.mdb”
3、結構查詢語言(SQL)
SQL是結構查詢語言(StructureQueryLanguage)的英文縮寫,它是使用關系模型數據庫的應用語言,由IBM在七十年代開發出來的,實現了關系型數據庫中的信息檢索。1992年制定了SQL標準SQL-92,它的全名是“InternationalStandardISO/IEC9075:1992,DatabaseLanguageSQL”。SQL標準的確定使大多數數據庫廠家紛紛采用SQL語言作為其數據庫檢索語言。
利用SQL語言,可以查詢和管理自已的數據庫。它由大約30條命令構成,但實際只需要少數的幾個命令就可以完成相當多的工作,常用的SQL查詢命令有:Select、Insert、Delete、Update等。
3.2.2.4VBScript及JavaScript腳本語言
Script(腳本)是由一組可以在客戶端瀏覽器上運行的命令組合而成的語言,你可以把它想像成一個運行于客戶端上的可執行程序。目前在網頁編制上比較流行的腳本語言包括VBScript及JavaScript。它們都是一種與HTML語言相似的描述性語言,也是以文本形式存在,不像C語言或Java語言那樣,需要編譯連接成字節碼形式的可執行程序。Script語句可以單獨存成文檔,也可以被嵌入到HTML的文件之中,與HTML語句結合在一起。當需要將Script語句直接加入到HTML文件中時,只要使用一個HTML標記符號<Script>即可。例如:
<HTML>
<HEAD>
<TITLE>temp</TITLE>
</HEAD>
<ScriptLanguage="JavaScript">
vari=10;
document.write(i);
</Script>
<BODY>
<H1>ThisisaJavaScriptexample.</H>
</BODY>
</HTML>
另外,Script程序在HTML中的位置也比較自由,它可以在HTML文件中的任何位置。
腳本語言是一種解釋性語言,可以直接由瀏覽器來解釋執行。并且可以直接訪問瀏覽器中的各種對象,如窗口對象、文檔對象、框架對象、超鏈接對象等。腳本語言可以實現的功能很多,可以用于定義網頁、在網頁中加入動畫、對網頁中的各種元素進行處理,特別是在處理表單方面有很強功能。不僅如此,它還可以很方便地控制瀏覽器中的各對象的屬性。例如,可以實現打開或關閉瀏覽器窗口、設置窗口狀態、改變窗口中的超鏈接位置等。總之,一些常用的功能都可以用腳本語言實現。
本BBS系統中就運用了大量的腳本語言,一方面用來完成表單提交前的數據驗證任務,另一方面用來完成打開新的窗口、關閉當前窗口、返回前一頁及下拉菜單等功能。通過使用腳本語言既防止了大量錯誤數據被提交到服務器,進而節約了寶貴的系統資源;也使網頁更加美觀、操作更加方便。大大提高了系統的性能。
1、JavaScript
Java語言的功能很強大,在網頁設計中非常的有效,但是它要求創建APPLET的人員必須是程序設計員。SunMicrosystems(太陽微系統)公司為了消除對于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公司也在其非常流行的VisualBasic的基礎上,推出了另一種腳本設計語言VBScript。MicrosoftVisualBasicScriptingEdition是程序開發語言VisualBasic家族的最新成員,它將靈活的Script應用于更廣泛的領域,包括MicrosoftInternetExplorer中的WEB客戶機Script和MicrosoftInternetInformationServer中的WEB服務器Script。
JavaScript可以支持大多數的平臺,而VBScript目前只能在Windows環境下的瀏覽器中運行。但是由于大多數用戶的操作系統都選用Windowst系列,因此,許多WEB站點的開發人員研始大量的使用VBScript。VBScript流行的主要原因是它將ActiveX對象的使用變得非常的簡單。ActiveX是Microsoft推出的一種新技術,它支持WEB頁面調用類似OLE的對象。
VBScript使用ActiveXScript與宿主應用程序對話。使用ActiveXScript,瀏覽器和其他宿主應用程序不再需要每個Script部件的特殊集成代碼。ActiveXScript使宿主可以編譯Script、獲取和調用入口點及管理開發者可用的命名空間。通過ActiveXScript,語言廠商可以建立標準Script運行時語言。Microsoft將提供VBScript的運行時支持。Microsoft正在與多個Internet組一起定義ActiveXScript標準以使Script引擎可以互換。ActiveXScript可用在MicrosoftInternetExplorer和MicrosoftInternetInformationServer中。因此對VBScript腳本語言的使用也變得重要起來。
3.2.2.5正則表達式技術
正則表達式(RegularExpression)最早是由數學家StephenKleene于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"Willmatch"berd","herd",etc.and"erd"
"n.rd"Willmatch"nerd","nrd","neard",etc.
"[n]+erd"Willmatch"nerd","nnerd",etc.,butnot"erd"
"[a-z]{2}erd"Willmatch"cherd","blerd",etc.butnot"nerd","erd","buzzerd",etc.
".{2,}erd"Willmatch"cherd"and"buzzerd",butnot"nerd"
"n[e]{1,2}rd"Willmatch"nerd"and"neerd"
錨
錨是指它所要匹配的格式,使用它能方便你查找通用字符的合并。
"^blah"-匹配以blah為行首單詞的一行文本;
$blah"–匹配以blah為行尾單詞的一行文本;
"\<blah"–匹配以blah為首的單詞,如:blahcake;
"\>blah"–匹配以blah為尾的單詞,如:cakeblah;
"\bblah"–匹配blah在這個單詞的開頭或結尾的字符串,如blahcake;
"\Bblah"–匹配blah在這個單詞的中間的字符串,如asblahaaa。
間隔
Res中的另一可便之處是間隔(或插入)符號。實際上,這一符號相當于一個OR語句并代表|符號。下面的語句返回一段文本中象"nerd"和"merd"的句柄:"(n|m)erd"。間隔功能非常強大,特別是當你尋找文件不同拼寫的時候。下面的例子能得到相同的結果:"[nm]erd"。當你使用間隔功能與Res的高級特性連接在一起時,它的真正用處更能體現出來。
一些保留字符
Res的最后一個最重要特性是保留字符(也稱特定字符)。例如,如果你想要查找"nerd"和"nird"的字符,格式匹配語句"n[ei]rd"與"neeeeerd"和"nieieierd"相符合,但并不是你要查找的字符。因為''''''''(星號)是個保留字符,你必須用一個反斜線符號來替代它,即:"n[ei]\rd"。其它的保留字符包括:
^、.、[、]、$、(、)、|、、+、?、{、}、\等。
3.2.3實現方法
3.2.3.1ASP網頁數據庫的連接
網頁數據庫的連接方法有兩種,一種是DSN數據源,另一種是DSN-less方式,即不建立DSN連接數據。我們考慮最簡單的BBS系統應用環境,使用互聯網上免費資源,通常互聯網上免費主頁空間只支持簡單的ASP應用以及Access數據庫應用,Access數據庫通常要求放置在固定的虛擬目錄位置,譬如:[\db]目錄位置,數據庫的連接也只支持DSN-less方式,這也是自然的,既然是免費資源,總不能要求人家還特別幫你設置一個DSN數據源。另外,BBS通常只作為Web應用的一部分,或者說作為你個人主頁或商業網站提供的一個附加功能,這個時候,你的BBS論壇系統通常都安裝在主頁空間一個單獨的目錄下,我們假定為[\BSS]。
所有要進行數據庫存取的ASP網頁都要以DSN-less方式進行數據庫連接,由此我們可以將執行數據庫連接的ASP代碼單獨形成一個插入文件,通常插入文件都是以[.inc]作為擴展名,考慮到安全性的需要,防止用戶直接輸入文件名下載此插入文件,所以我們仍然以[.asp]作為插入文件的擴展名,比如,我們將一個用作數據讀操作的數據庫連接插入文件名命名為[dbconr.asp],下面就是其典型代碼:
<%
''''adModeUnknown0default
''''adModeRead1
''''adModeWrite2
''''adModeReadWrite3
''''adModeShareDenyRead4
''''adModeShareDenyWrite8
''''adModeShareExclusive12
''''adModeShareDenyNone16
strDBPath=Server.MapPath("dbconr.asp")
strDBPath=replace(strDBPath,"\bbs\dbconr.asp","\db\bbsdata.mdb")
strDBConn="DRIVER={MicrosoftAccessDriver(.mdb)};DBQ="&strDBPath
SetobjDBConn=server.createobject("adodb.connection")
objDBConn.ConnectionTimeOut=20
objDBConn.Mode=1‘讀模式
objDBConn.openstrDBConn
%>
注意,其中的objDBConn.Mode既為我們所做的數據庫連接將用于操作的模式是讀、寫、或是讀寫。至于為什么需要設置Mode屬性?設置Mode屬性可以節省ADO組件的處理時間。另外,數據用戶的權限管理十分重要,設置Mode屬性能夠有效率地規劃整個Web應用程序的用戶權限。所以,從安全性和代碼執行效率方面考慮,我們將讀與寫數據庫連接插入文件分別開來,分別命名為[dbconr.asp]和[dbconrw.asp]。
數據庫連接操作是一個相當頻繁的操作,我們可以采用適當的技術來進行數據庫連接優化,以提高數據庫連接性能。在ASP的數據庫編程中,connection對象是我們不可能離開的一個對象,在對數據庫進行任何的操作,比如更新記錄,插入,刪除,檢索等,都必須借助于connection對象來完成。形象地來說,connection對象就是程序與數據庫溝通的管道,所有對數據庫的操作,都必須經過它,因此,無論我們以何種方式連接數據庫前,總是少不了執行下列的代碼。
SetobjDBConn=Server.CreateObject("ADODB.Connection")
建立一個connection對象的實例變量,然后才能在它的基礎上建立recordset對象或是command對象來操作數據庫。既然connection對象是如此的重要,那么如何優化和管理好connection對象對數據庫程序來說是極其重要的,它關系到程序的性能。
每當一個客戶執行數據庫操作時,就需要借助一個connection對象,而每個connection對象就會占用服務器的一部分資源,而數據庫的同時連接數不可能是無限的,因此。在考濾要提供高性能的數據庫Web程序時,我們需要考慮如何去減少服務器的開銷。一般來說。每個ASP頁面中建立一個connection對象,都會在服務器中產生一個對數據庫的連接。而不同的頁面的connection對象是不能共享的。那么。我們可不可以使同一個用戶所訪問的不同頁面共享一個connection連接通道呢。
我們來回顧一下ASP六大內置對象的session對象,它可以為某個特定的用戶來保存私有的數據,如果我們把connection對象保存在session對象中,是否可以使不同的ASP頁面都使用同一個連接通道呢?看看下面的這段程序。
<%
SetobjDBConn=Server.CreateObject("ADODB.Connection")
objDBConn.Mode=?
objDBConn.Open"[DSN-less串]"
session("dbconn")=objDBConn
Setrs=Server.CreateObject("ADODB.Recordset")
Commandtext="selectfromuserlist"
connstr=session("dbconn")
rs.openCommandtext,connstr,3,2
%>
在這個數據庫連接中。我們使用了session對象,首先,建立一個objDBConn的連接對象,然后連接到數據表userlist中,取得連接句柄后,把它保存在session("dbconn")這個session變量中,在打開記錄集前,從session("dbconn")中取出句柄,借助于session對象。我們可以使不同的ASP頁面共用一個連接對象,減少了對服務器內存的開銷,而我們也不需要擔心,當一個客戶因為錯誤操作導致服務器不能釋放該被占用的session連接對象,因為我們知道每個客戶的session對象是有一定的生存期限的,過了這個期限,服務器就會自動把它釋放掉。
然而,數據庫連接性能的提高是以一定的服務器資源消耗為代價的,所以,我們就要在其中權衡利弊。通常,利用別人的主機空間來作為自已BBS系統的平臺,就應該盡諒避免使用過多的服務器資源,諸如APPLICATION以及SESSION變量,反之,主機資源豐富,而應用系統相對較少,則可以考慮采用上述優化方式。
3.2.3.2ASP網頁數據庫的操作
關于網頁數據庫的操作,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="INSERTINTOuserlist(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&"'''')"
%>
<!---#includefile="dbconrw.asp"--->
<%
objDBConn.ExecutestrSQL
%>
<!---#includefile="dberror.asp"--->
這是最基本的數據庫操作方式,特別是對于表的插入、刪除和更新記錄以及單條數據的查詢操作,是三種方式中最為簡單有效的一種。本系統中,用戶身份驗證、發表貼子以及回復貼子等相關數據庫操作相當頻繁,對數據存取效率有相當的要求,至于在數據存取的靈活性方面要求不高,因此,大部分都是采取ADO組件Connection對象配合SQL語法這種數據庫操作方式。
2、ADO組件的Command對象執行SQL語法
Command對象和Connection對象的Execute方法一樣能夠執行SQL指令。在建立Command對象前一樣需要建立和打開數據連接,假設活動連接objDBConn已經建立好,其后步驟如下所示:
Step1:建立Command對象,其程序代碼如下:
SetobjDBCommand=Sever.CreateObject(“mand”)
Step2:接著指定ActiveConnection屬性為目前打開的數據連接,代碼如下:
ObjDBCommand.AvtiveConnection=objDBConn
Step3:指定CommandText屬性為要執行的SQL指令,程序代碼如下:
mandText=“Selectfromuserlist”
Step4:使用Execute方法執行SQL指令,objRS就是取得的記錄集合,代碼如下:
SetobjRS=objDBCommand.Execute
上述步驟可以取得所有注冊會員的詳細注冊資料,至于添加、刪除和更新記錄只需下達不同的SQL指令。需要注意的是,Command對象并不支持Close方法,所以關閉Command對象,只需設為Nothing即可。
建立復雜的SQL語句,通常得事先進行許多復雜的數據類型轉換,使用Command對象配合Parameters數據集合建立SQL指令則相對來說比較簡單,因為對象本身就能夠自已處理復雜的數據類型轉換,另外,比較Connection對象直接執行SQL語句來說,操作要靈活。
Command對象主要的目的是用在存儲程序(StoreProcedure),簡單地說,存儲程序是一些默認的處理程序。這個部分需用要數據源本身擁有指令處理的能力,象MSSQLServer就支持存儲程序,但MSAccess這類中小型數據庫系統就不支持存儲程序。
應該說,使用存儲程序來操作數據庫,具有較其它方式較明顯的優點,首先,數據存取效率最高,因為存儲過程經過了優化和編譯,并且在第一次執行以后,就駐留在緩存中,另外,用戶不必在網絡上發送有時數以百計的SQL語句,只需通過執行一個簡單的存儲過程,就能夠完成復雜的操作,減少了客戶和DB服務器間傳遞的請求數目,減少了網絡通信量。
本系統采用MSAccess數據庫,所以本方法作為未來系統擴展升級時數據庫操作的首選方法。
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數據操作方式。
3.2.3.3ASP網頁安全性的實現方法
我們知道在用瀏覽器瀏覽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源代碼如下:
<!--#includefile="dbconrw.asp"-->
<%
response.expires=0
OnErrorResumeNext
DimstrUserName
DimstrSQL,objRS
strUserName=Request.Form("username")
strUserPassword=Request.Form("password")
strSQL="SELECTFROMuserlistWHEREusername=''''"&strUserName&"''''"
setobjRS=objDBConn.Execute(strSQL)
session("username")=""
session("adminboard")=""
DimbLogSucc,repmsg,reptxt,repurl
IfobjRS.EOFThen
''''UserDoesn''''tExists
bLogSucc=0
repmsg="此用戶不存在"
repurl="userlog.asp"
reptxt="請重新登錄"
Else
''''UserExists
IfobjRS("password")=strUserPasswordThen
bLogSucc=1
session("username")=strUserName
repmsg="歡迎"&strUserName&",您已登錄成功"
repurl="main.asp"
reptxt="返回論壇首頁"
Else
bLogSucc=0
repmsg="密碼輸入錯誤"
repurl="userlog.asp"
reptxt="請重新登錄"
Endif
EndIf
%>
<!--#includefile="dberror.asp"-->
<%
objRS.Close
''''Judgeifsuperadministratororboardmanager
ifbLogSucc=1then
strSQL="SELECTFROMadminorlistWHEREusername=''''"&strUsername&"''''"
setobjRS=objDBConn.Execute(strSQL)
iferr.number<>0then
response.write"數據庫操作失敗:"&err.description
endif
IfNotobjRS.EOFThen
ifobjRS("status")="Y"then
session("adminboard")=Cint(objRS("manbid"))
endif
endif
''''WriteLog
objRS.close
strSQL="INSERTINTOloginfo(userid,userip,intime)"
strSQL=strSQL&"VALUES(''''"&strUserName&"'''',''''"
strSQL=strSQL&request.servervariables("remote_host")&"'''',''''"
strSQL=strSQL&now()&"'''')"
setobjRS=objDBConn.execute(strSQL)
iferr.number<>0then
response.write"數據庫操作失敗:"&err.description
endif
endif
objRS.close
objDBConn.Close
SetobjRS=Nothing
SetobjDBConn=Nothing
%>
<html><body>
<tablealign=''''center''''>
<tr><tdalign=''''center''''><%=repmsg%></td></tr>
<tr><tdalign=''''center''''>
<fontcolor="#336699">
<aid="reinput"href="http://<%=repurl%>"><%=reptxt%></a></font>
<SCRIPTlanguage="javascript"type="text/javascript">
setTimeout("location.href=reinput.href",1000);
</SCRIPT>
</td></tr>
</table>
</body></html>
確定了用戶的會員身份以后,在每個需要進行身份識別的ASP網頁插入身份識別代碼,如果此用戶具有訪問這個ASP網頁的權限,則輸出其相應的HTML文件,否則,系統轉到用戶登錄網頁要求用戶重新登錄以取得訪問此ASP功能網頁的合法身份。例如,論壇基本信息設置ASP網頁需要訪問者具有超級會員身份,在本網頁前必須插入以下一段代碼:
<%
''''ChecktheSuperAdministratorRight
Response.Expires=0
ifSession("adminboard")<>"0"Then
Response.redirect"userlog.asp?errmsg=您沒有超級用戶管理權限,請重新登錄或退出!"
EndIf
%>
3.2.3.4在貼子中實現超文本信息輸入和顯示
論壇可以由管理員設置是否支持UBB標簽,UBB標簽就是不允許使用HTML語法的情況下,通過論壇的特殊轉換程序,以至可以支持少量常用的、無危害性的HTML效果顯示。而對于那類帶有惡意代碼的文本予以屏蔽。下面為本系統支持的UBB具體使用說明:
[B]文字[/B]:在文字的位置可以任意加入您需要的字符,顯示為粗體效果明。
[I]文字[/I]:在文字的位置可以任意加入您需要的字符,顯示為斜體效果。
[U]文字[/U]:在文字的位置可以任意加入您需要的字符,顯示為下劃線效果。
[URL][/URL]
[EMAIL]my0661@[/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][/DIR]:為插入shockwave格式文件,中間的數字為寬度和長度
[RM=500,350][/RM]:為插入realplayer格式的rm文件,中間的數字為寬度和長度
[MP=500,350][/MP]:為插入為midiaplayer格式的文件,中間的數字為寬度和長度
[QT=500,350][/QT]:為插入為Quicktime格式的文件,中間的數字為寬度和長度
[URL=]潮陽網絡[/URL]:有兩種方法可以加入超級連接,可以連接具體地址或者文字連接。
[align=center]文字[/align]:在文字的位置可以任意加入您需要的字符,center位置center表示居中,left表示居左,right表示居右。
[EMAIL=MAILTO:my0661@]feng[/EMAIL]:有兩種方法可以加入郵件連接,可以連接具體地址或者文字連接。
[glow=255,red,2]文字[/glow]:在標簽的中間插入文字可以實現文字發光特效,glow內屬性依次為寬度、顏色和邊界大小。
[shadow=255,red,2]文字[/shadow]:在標簽的中間插入文字可以實現文字陰影特效,shadow內屬性依次為寬度、顏色和邊界大小。
1、超文本信息的輸入
用戶在書寫貼子內容時,可以輸入這類帶格式文本,例如,用戶希望輸入一段紅色文字“警告:SARS有可能卷土重來!”,則應照這種格式輸入文本“[color=’red’]警告:SARS有可能卷土重來[/color]”。系統在用戶輸入貼子界面應提供UBB使用幫助鏈接,對于一些常用的UBB標簽,系統應提供其快捷輸入方式。例如,界面提供一個輸入飛行文字UBB標簽快捷按鈕,用戶單擊此按鈕,系統則彈出一個文本輸入框,用戶在其中輸入文字,完成提交后,系統將自動在貼子內容輸入滾動文本框內文字的末尾添加帶有飛行文本標簽的這段文字。其實現代碼如下(采用JavaScript編寫):
……
<title>……</title>
<SCRIPTlanguage="JavaScript">
……
functionfontchuli(){
if((document.selection)&&(document.selection.type=="Text")){
varrange=document.selection.createRange();
varch_text=range.text;
range.text=fontbegin+ch_text+fontend;
}
else{
document.kbbs.body.value=fontbegin+document.kbbs.body.value+fontend;
document.kbbs.body.focus();
}
}
functionfly(){
fontbegin="[fly]";
fontend="[/fly]";
fontchuli();
}
……
</SCRIPT>
……
<formmethod="?"action="?"name="kbbs">
……
功能按鈕:<IMGonclick=fly()alt=飛行字src="pic/fly.gif"border=0>
……
</form>
文本在提交后,系統在保存此貼子之前,應該將提交的貼子的標題、貼子內容作適當的轉換,比如,用戶輸入的‘<’以及‘>’等字符,應該轉換成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]”,系統應該將其轉換成“<I>備注:中國載人航空火箭于2003年10月15日成功升空</I>”。對貼子內容中超文本信息的正確轉換我們用到了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,其示例代碼如下:
DimregEx,str1''''建立變量。
str1="Thequickbrownfoxjumpedoverthelazydog."
SetregEx=NewRegExp''''建立正則表達式。
regEx.Pattern="fox"''''設置模式。
regEx.IgnoreCase=True''''設置是否區分大小寫。
ReplaceTest=regEx.Replace(str1,replStr)''''作替換。
在本系統中,假設Body變量為用戶保存的貼子內容,其中包含有UBB標簽文本,我們要將其轉換成用戶瀏覽器可以識別的格式,比如,飛行文字的UBB代碼文本為“[fly]輕舞飛揚[/fly]”,其轉換示例代碼如下:
dimre
Setre=newRegExp
re.IgnoreCase=True
re.Global=True
re.Pattern="\[fly\](.[^\[]]\[\/fly\]"
body=re.Replace(body,"<marqueewidth=90%behavior=alternatescrollamount=3>$1</marquee>")
我們可以照此方法,實現對另外的UBB標簽的正確轉換,轉換的關鍵是構造出正確的正則表達式。在本系統中,系統支持的所有UBB標簽轉換正則表達式全部包括在ubb.asp文件中的code_jk函數中。
四、系統的運行效果
采用最基本的應用環境:
1、硬件環境
100M以太網;PentiumIIIIA服務器;支持WIN98以上的PC客戶機
2、軟件環境
服務器端安裝了WindowsNT4.0系統、IIS4.0Web服務器、MSAccess2000數據庫等;客戶端安裝了Windows98系統、IE5.0瀏覽器等。
把本系統布置在如上所述最基本的應用環境下,本系統的運行是非常理想的。在經過超級會員一系列的論壇基本設置以后,就可以開始在論壇上發表貼子查看貼子回復貼子及進行其它論壇操作。系統的反應很快,讀出頁面基本上不需要多少時間,一晃就能出來。經過本系統各項功能操作測試,系統具有較好的穩定性。
把本系統布置在互聯網上(),本網站提供的基本功能有:支持ASP或,支持Access數據庫,但此數據庫文件必須放置在[db]。但是,此網站不支持FTP網站維護,只提供WEB方式的網站內容更新,而且每次不能超5個文件。
因本網站主機在北美,連接數據較慢,此外因數據更新較繁雜,只布置了一些論壇的基本功能,但是經過試運行,盡管速度有些慢,其系統運行相當穩定。
五、結束語
完成這次設計任務總共用了六個星期時間,前三個星期用來收集資料、學習要用到的各項開發技術、進行論壇的系統分析,中間兩個星期用來設計系統,后一個星期用來測試及修改。論文的撰寫一直貫穿其中。
為本系統總共設計近六十個ASP網頁,近萬行代碼,七個數據表。通過這次畢業設計,我從中學到了許多新的知識,而且通過這次畢業設計,培養了我綜合多門學科中的知識、迅速規劃并開發出目標系統的能力,以及編程能力也有了很大的提高。另外也有許多心得體會,所謂系統開發如人生百味,酸甜苦辣皆有之。
嚴格按工程的方法來設計系統相當重要,不能認為基于Web的數據庫管理的BBS系統很小,可以無需花太多的時間來做系統分析,甚至可以無需經過系統定義而直接進入系統編碼階段。這種想法很天真,最小的系統,你若想保證質量,把系統做得更可靠更有效率功能越強,應該考慮的方方面面就越多越復雜。系統分析過于簡單,系統定義過于抽象,則在系統設計與編碼階段遇到的困難就越多,特別是其中若不得不做一些功能性甚至系統結構性方面的變動,將面對許多重復性的工作。在系統開發過程中重復工作過多,將會極大地影響系統開發的積極性,進而影響整個系統的質量。在這一點上,我體會尤深,我化了三個星期,即接近系統開發一半的時間用在系統分析與系統定義上,也就是在開始浪費了一周多的時間,即邊編碼邊分析,邊分析邊編碼,后來越來越亂越來越復雜,不得不重新考慮系統開發計劃的合理性。總之,在這一點上,我的體會是,系統分析越充分,系統定義越具體,那么后續的系統設計與開發工作就越有效率,且系統的質量也越有保障。
本系統是一個最基本的基于WEB的BBS系統,可擴展性很大,科學的開發過程也極有利于系統的擴充與擴展。系統現在采用的是MSAccess數據庫,視需要可以移植到MSSQLServer或者其它大中型數據庫系統環境下,只需改動少數幾個ASP功能模塊文件。系統的分析與定義都結合了現在流行的面向對象方法以及傳統的結構分析與設計方法,如果想采用似有流行趨勢的技術重寫系統,最多也只需二個星期甚至更少的時間來作系統編碼以及測試,效率相當高。
回顧這一個半月的系統開發工作,總結起來那就是,軟件的開發是相當辛苦的,但成功以后的喜悅也是非常美妙的,而且我發現,其中你投入的心血越多,成功以后你所獲得的快樂與充實感也更多更強。難道人越辛苦就會越幸福快樂嗎?對,軟件系統開發就是這樣!
參考文獻
陳會安《ASP網頁制作徹底研究》2000/10
林金霖《ASP實務經典》,中國鐵道出版社,1999/12
胡偉《FrontPage2000中文版技巧與實例》1999/9
黃敏如,《FrontPage2000中文版入門與提高》1999/7
JeffryDwight《CGI開發使用手冊》1999/5
黃斯偉《CSS網頁樣式設計》1999/5
王春森《程序設計》1999/10
王映雪、肖平、佟秋利《HTML網頁制作》1998/10
薩師煊、王珊《數據庫系統概論(第二版)》1991/4
趙彤、楊玉《VBScript制作實例》1999/3
六木工作室《VisualBasic6.0中文版使用編程技巧》1999/9
沈建強、夏耘《Photoshop圖像處理速成培訓》1999/7