初學JSP編程,一般喜歡做做留言板、聊天室、購物網站或論壇等。下面我詳細說說如何?一個基於WEB的無重新整理聊天室。
註:參考了Struts版的 ajaxchat。
平台或技術:
Windows XP,JSP2.0,Servlet2.4,JSTL,Tomcat6,Ajax,Log4J,ant,eclipse等等。
思路:
1 頁面(資訊)重新整理
由於基於HTTP協議的WEB決定了伺服器與使用者端的串連不是一直保持著的,那WEB形式的聊天室,其局限性顯而易見。一句話:實現WEB形式的聊天室,首先要解決重新整理聊天資訊的問題。
一般做法有兩種:在ajax出現前,使用隱藏頁面(用iframe標籤)定時向伺服器發出請求,並將伺服器返回的資訊進行顯示;在ajax出現後,利用其非同步通訊原理,可以在頁面後台“悄悄”地向伺服器發現請求。這裡用的方式是後者。
2 功能分析
使用WEB聊天室的一般步驟:進入聊天室,進行聊天(向所有人發聊天資訊,向個人發送聊天資訊),退出聊天室。
這裡要實現的正是以上描述的最簡易功能的聊天室。但是,這還是一個多房間多使用者的聊天室。以物件導向的思路來分析,主要涉及三個對象,分別是:聊天資訊(Message)、聊天室(房間)(Room)、使用者(User)。
聊天資訊(Message)應該包含:聊天內容,所在房間,寄件者,接受者
聊天室(Room)應該包含:使用者(使用者列表)、聊天資訊(聊天資訊集)
使用者(User)應該包括:使用者名稱,所在房間
對以上三個基本對象分析後,就可以建立相應JAVA類。下面直接給出這三個類的代碼,具體分析待下回分解。
package org.jvk.chatroom.bean; publi c class Message { // 屬於某房間 (Room) private String room ; // 訊息內容 private String content ; // 發送到某使用者 (User) private String to ; // 由誰發送的 , 即屬於屬於 User private String from ; // 發送時間 private long date ; public long getDate() { return date ; } public void setDate( long date) { this . date = date; } public String getContent() { return content ; } public void setContent(String content) { this . content = content; } public String getFrom() { return from ; } public void setFrom(String from) { this . from = from; } public String getRoom() { return room ; } public void setRoom(String room) { this . room = room; } public String getTo() { return to ; } public void setTo(String to) { this . to = to; } } package org.jvk.chatroom.bean; import java.util.ArrayList; import java.util.List; public class Room { // 資訊 private List<Message> messages = new ArrayList<Message>(50) { public boolean add(Message message) { if ( this .size() > maxMessage ) this .clear(); boolean b = super .add(message); if (b) messageUpdateTime = System.currentTimeMillis(); return b; } }; // 使用者 private List<User> users = new ArrayList<User>(50) { public boolean add(User user) { if ( this .size() > maxUser ) this .clear(); boolean b = super .add(user); if (b) userListUpdateTime = System.currentTimeMillis(); return b; } public boolean remove(User user) { boolean b = super .remove(user); if (b) userListUpdateTime = System.currentTimeMillis(); return b; } }; private long userListUpdateTime = System.currentTimeMillis(); private long messageUpdateTime = userListUpdateTime ; // 房間名 private String name ; // 房間通告 private String notice ; // 房間保留最大聊天資訊數 private int maxMessage = 20; // 房間保留最大使用者數 private int maxUser = 20; private static List<User> NullUsers = new ArrayList<User>(0); private static ArrayList<Message> NullMessages = new ArrayList<Message>(0); public void setMaxMessage( int maxMessage) { this . maxMessage = maxMessage; } public String getName() { return name ; } public void setName(String name) { this . name = name; } public String getNotice() { return notice ; } public void setNotice(String notice) { this . notice = notice;