本系統為 EasyJF 開源團隊打造的線上會議室,採用 AJAX + J2EE 架構,模擬傳統會議模式:支援多主題會議室並發、訪問權限控制、排隊/自由發言模式切換、歷史記錄持久化與長期查閱。客戶端採純文字聊天,預留語音/視頻擴展接口;用戶體系支援遊客登入,並與 EasyJF 論壇帳號體系整合。
public class ChatRoom {
private String cid; // 主鍵
private String title; // 主題
private String intro; // 簡介
private String announce; // 公告
private String owner; // 創建人
private Integer maxUser; // 最大在線人數
private Integer intervals; // 刷新間隔
private String vrtype; // 訪問權限類型
private String vrvalue; // 訪問值
private Integer status; // 狀態
private Date inputTime; // 創建時間
}
Map service 存放所有活躍會議室,maxServices=10 限制並發室數。msgs(發言列表)、users(在線用戶)、talkers(排隊發言者)、manager(管理員)、currentTalker(當前發言人)。Runnable,run() 每 5 秒執行 Flash():持久化聊天記錄至文本文件(FlashChatMsg)、清理超時用戶(FlashChatUser)。create()/close()/get() 管理室生命週期;talk() 處理發言;exit() 處理退出並廣播系統消息。Chat:封裝發言人、接收人、內容、時間、類型、狀態。ChatUser:IP、端口、用戶名、最後訪問時間、狀態。Talker:當前發言人、開始時間、預計結束時間。xmlhttp.post 送至服務端 send 命令。setTimeout 定時器(如 5 秒),定期 xmlhttp.get 服務端 recive 命令拉取新消息,追加顯示並更新 lastReadId。loadConfig 獲取在線用戶列表、排隊列表、公告等元數據。// 跨瀏覽器創建 XMLHttpRequest
function newXMLHttpRequest() { ... }
// 統一回調處理:解析服務端返回 XML,調用指定處理函數
function handleAJaxResult(req, method) { ... }
// 發送 AJAX 命令
function executeAJaxCommand(url, postData, handleMethod) { ... }
// 發言
function DOSend() {
var url = "/chat.ejf?easyJWebCommand=send&cid=" + roomId + "&lastReadId=" + lastReadId;
var postData = "sender=" + myName + "&reciver=" + reciver + "&content=" + msg;
executeAJaxCommand(url, postData, "recive");
}
// 接收輪詢
function doRecive() {
var url = "/chat.ejf?easyJWebCommand=recive&cid=" + roomId + "&lastReadId=" + lastReadId;
executeAJaxCommand(url, "", "recive");
}
// XML 解析與頁面更新
function recive(list) {
for (var oNode = list.firstChild; oNode; oNode = oNode.nextSibling) {
chatContent.innerHTML += showMsg(oNode);
lastReadId = oNode.getAttribute("cid");
}
chatContent.scrollTop = chatContent.scrollHeight;
reciveTime = setTimeout("doRecive();", 5000);
}
繼承 EasyJWeb AbstractCmdAction,核心方法:
doBefore():從請求參數 cid 獲取 ChatService 實例。doMain():用戶進入會議室,創建 ChatUser,調用 chatRoom.join(),將室對象與用戶對象放入結果集轉發至 main 頁面。DOSend():接收發言數據,封裝 Chat 對象,調用 chatRoom.talk(),隨後轉發至 doRecive 返回最新消息。doRecive():根據 lastReadId 獲取增量消息列表,轉發至 msgList 頁面(生成 XML 片段)。doLoadConfig():返回在線用戶、排隊列表等配置數據,轉發至 config 頁面。doExit():調用 chatRoom.exit(),清除 Session,返回退出成功提示。演示地址:EasyJF 官網會議室
AJAX 本質是 JavaScript、DHTML、CSS、XMLDOM、XMLHttpRequest 等成熟技術的組合。關鍵在於將這些技術內化並靈活應用。建議:不要濫用 AJAX;高手應深耕業務與系統級算法設計,新手應夯實前後端基礎技術棧(DHTML/CSS/JS/XML、Servlet/JDBC/ORM/設計模式/UML/EJB/框架工具)。