jsp是當前流行開發動態網頁語言。本文簡要介紹如何用jsp實現聊天室程式。
聊天室的設計思路
1. 功能、結構描述
使用者註冊登入,支援非註冊訪問。
使用者登入時,輸入使用者名稱和密碼,如果是第一次使用,會提示建立新使用者。若為非註冊使用者提示註冊,也可直接進入。驗證成功後進入聊天主介面,包括三個視窗:聊天資訊顯示,使用者列表,資訊發送。在資訊發送部分輸入資訊,並選擇相關選項進行資訊發送。退出時,自動刪除使用者列表中的相關資訊。
1.1 資訊顯示
由伺服器維護一個存放於application中的Vector類型的聊天資訊資料ChatMessage,單條資訊使用字串拼接,基本結構如下:
發言人+動作+接受者+發言內容,
資訊的拼接在發送方完成。
為實現私聊的功能,可在此結構基礎上增加一個接受者資料域,置於資訊結構開始並與特殊符號如"*,#"之類的組合分割。在接受顯示時首先提取出來,判斷本地是否應該顯示,預設為全體線上使用者。
當然可以專門新開視窗,只顯示私聊資訊,實現基本相同。
在使用者session中設定一個變數,它儲存使用者登入時已有聊天資訊最後一條的編號。本地顯示資訊時從這一條開始顯示。在伺服器清除聊天資訊時此變數置為0,此後所有資訊全部顯示(私聊資訊根據情況顯示)。為控制方便,資訊顯示使用倒序,即最後發出的資訊顯示在頁面最上方,省略了滾屏操作。
滾屏功能可以使用javascript指令碼完成。
1.2 資訊發送
完成資訊的提取與拼接。主要由表單構成,包括髮言人(hidden),動作、貼圖、字型顏色 (select),私聊(check),發言內容(text),發送(submit,button)以及退出(button或href)。採用request的getParameter()方法提取各個資料域內容,拼接成為單條資訊內容,根據是否私聊,添加接受者資訊。
1.3 使用者列表
顯示線上的使用者列表及各使用者的詳細資料。自動重新整理或手動重新整理。使用者詳細資料存於application中的一個Hashtable類型的結構userlist中,以使用者呢稱nick作為關鍵字key。Hashtable的好處在於使用者退出時可以很迅速的刪掉使用者資訊,操作簡單。在顯示時將其轉換為Enumeration,可以迴圈的顯示使用者資訊。
使用者的詳細資料由各部分拼接構成,在顯示前將各個部分提取出來即可。使用者資訊在使用者成功登陸後即加入Hashtable中。
1.4 使用者註冊
使用者在表單中相應的位置填寫相關資訊,註冊頁面提取資訊後根據nick在資料庫中查詢,如nick已存在,則提示重新填寫nick,相反的情況直接將比使用者資訊插入資料庫重中,並在頁面中顯示,使用者選擇登入或離開。
此處的檢查應該有還有很多細節,如呢稱不能使用特殊字元,emial的格式問題。
1.5 登入驗證
提取使用者nick和password,如為註冊使用者登入則使用nick在資料庫中查詢相關資訊,進行口令比較,成功後將其他資訊提取拼接,以nick作為關鍵字加入Hashtabel中。對於非註冊使用者,直接增加預設的其他資訊後加入Hashtable。注意在這種情況要判斷是否有重複的情況。Hashtable的特性很容易實現這一點。
2.具體設計要點
主要使用String類型的變數,這在Html語言中可以直接顯示省略類型轉換。
定時重新整理的頁面其Meta屬性設為refresh。
注意變數的null檢查,否則會在調試時出現不必要的異常。
本設計沒有使用Javabean,實際設計應該盡量將重要的代碼如資料庫訪問,使用者列表維護等封裝到bean之中。
kick功能可以如下實現:
1.為每個使用者記錄一個最後發言的時間,重新整理使用者列表室自動於目前時間比較,超過一定時間就kick, 同時發送提示資訊
2.簡單設定一個計數器儲存最後一次發言後的新增資訊數,當它大於某個數時即
kick,實際中這個數是可以與一個固定時間對應(可以根據機率知識得到)
全部源檔案如下:
login.jsp 完成使用者登入的輸入
apply.jsp 使用者註冊資訊輸入 ,修改使用者資訊
applyok.jsp 使用者註冊時資料庫操作
getinfo.jsp 得到當前的線上使用者的列表和詳細資料
frame.jsp 使用者登入時的口令驗證及初始化
send.jsp 發送資訊
scface.jsp 註冊時選擇頭像
reiceve.jsp 接收顯示聊天資訊
exit.jsp 使用者退出更新線上使用者
資料庫
使用jdbc:odbc橋串連資料庫,建立一個odbc資料來源chat
這裡資料庫採用常見的microsoft access
資料庫中包含表:
chat(Nickname,Password,Face,Sex,QQ,Email)
表中有Nickname,Password,Face,Sex,QQ,Email屬性,均設為文本類型
其中前兩個為必要欄位。注意各屬性的長度。
部署:
由於程式中沒有採用javabean,故在部署時可直接將其作為某個已存在的工程的一部分,可直接使用(將所有檔案拷貝到相應的檔案夾即可)。
也可以作為新的工程部署,詳細資料請參考相關文檔。在使用Apach Tomcat 4.1時修改安裝根目錄下conf檔案夾中的sever.xml檔案中的相關部分。此處不加詳述。
開發環境:
Apach Tomcat 4.1 + Editplus 2
更換環境,請自行參考相關文檔修改相關內容。
本程式屬學習時的練習,一些功能只有設計思路而沒有實際實現。提供所有源檔案,有興趣可以增加新的功能(發一份源碼給我)。介面的設計風格參考了網上的流行設計。大家可以進入某個聊天室自行獲得html代碼(大多數只能看到html代碼,由此可以分析出部分設計思路)。此為學習製作,設計中有關安全,各種異常情況的處理等很多東西或沒有給出實現代碼,或根本沒有涉及,jsp的很多特點在這裡也沒有體現,由於時間問題以後若有改進會加進去再貼出來。
高手請不吝賜教。
初學者一起進步。
me: JJ
Email: kensmail@yeah.net
有信必複。