一
本會議室系統主要用於EasyJF開源團隊的成員網上會議使用
會議系統的用戶支持游客帳號參加會議
會議系統暫時使用文字聊天的方式
二
服務器端使用Java語言
客戶端使用AJAX技術與服務器端交互數據
會議歷史信息儲存格式使用文本格式
三
會議室服務器端是整個會議系統的核心部分
首先
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; }
需要一個管理會議室的類
public class ChatService implements Runnable {
private static final Map service=new HashMap();//會議室服務
該表集合中
private static final int maxServices=
會議發言信息也需要封裝成一個類
public class Chat { private String cid; private String sender; private String reciver; private String content; private Date vdate; private Integer types; private Integer status; }
還有表示參加會議的人的信息
public class ChatUser { private String ip; private String port; private String userName; private Date lastAccessTime; private Integer status; }
另外還需要一個表示當前發言人的Talker類
在服務器端的設計中
四
會議室客戶端包括兩個部分
客戶端的第二個部分也即會議系統的主要部分
Java Web程序中與服務器端交互數據主要有兩種方式
用戶發言的時候
另外還有一些操作
五
在EasyJF開源團隊的會議系統中
package com
存放到該表集合中
private static final int maxServices=
2、MVC處理部分的Action代碼
在EasyJF的會議系統中,由於使用EasyJWeb作為MVC框架,因此處理Ajax比較簡單,下面是會議室系統的核心Action主要代碼。tW.WinGWit.cOm
package com.easyjf.chat.action;
public class ChatAction extends AbstractCmdAction {
private ChatService chatRoom;
public Object doBefore(WebForm form, Module module) {
// TODO Auto-generated method stub
if(chatRoom==null)chatRoom=ChatService.get((String)form.get("cid"));
return super.doBefore(form, module);
}
public Page doInit(WebForm form, Module module) {
// TODO Auto-generated method stub
return doMain(form,module);
}
//用戶登錄進入會議室
public Page doMain(WebForm form, Module module) {
if(chatRoom!=null){
ChatUser user=getChatUser();
if(!chatRoom.join(user))form.addResult("msg","不能加入房間,可能是權限不夠!");
form.addResult("chatRoom",chatRoom);
form.addResult("user",user);
}
else
{
form.addResult("msg","會議未啟動或者會議室不存在!");
}
return module.findPage("main");
}
//處理用戶發言信息
public Page doSend(WebForm form, Module module) {
if(chatRoom==null)return new Page("err","/l","thml");//返回會議室不存在
的錯誤
Chat chat=(Chat)form.toPo(Chat.class);
chat.setCid(chatRoom.geneId());
chatRoom.talk(chat);
return doRecive(form,module);
}
//用戶接收發言信息
public Page doRecive(WebForm form, Module module) {
if(chatRoom==null)return new Page("err","/l","thml");//返回會議室不存
在的錯誤
String lastReadId=CommUtil.null2String(form.get("lastReadId"));
//System.out.println(lastReadId);
form.addResult("list", chatRoom.getNewestMsg(getChatUser(),lastReadId));
return module.findPage("msgList");
}
//用戶刷新會議狀態信息
public Page doLoadConfig(WebForm form, Module module) {
if(chatRoom==null)return new Page("err","/l","thml");//返回會議室不存
在的錯誤
form.addResult("userList", chatRoom.getUsers());
form.addResult("talkerList", chatRoom.getTalkers());
return module.findPage("config");
}
//用戶退出
public Page doExit(WebForm form, Module module) {
if(chatRoom==null)return new Page("err","/l","thml");//返回會議室不存在的
錯誤
hatRoom.exit(getChatUser());
form.addResult("msg","退出成功");
ActionContext.getContext().getSession().removeAttribute("chatUser");
return new Page("msg","/chat/xmlMsg.xml",Globals.PAGE_TEMPLATE_TYPE);
}
3、客戶端AJAX部分核心代碼
EasyJF會議系統中,服務器發送給客戶端的都是格式化的xml文檔數據。下面是核心的AJAX函數及發送接收會議信息的客戶端代碼。
function newXMLHttpRequest() {
var xmlreq = false;
if (window.XMLHttpRequest) {
xmlreq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
}
}
}
return xmlreq;
}
//處理返回信息
//xmlHttp返回值,
//method:方法名 方法必須帶一個參數如doRecive(xNode);
function handleAjaxResult(req,method) {
return function () {
if (req.readyState == 4) {
if (req.status == 200) {
// 將載有響應信息的XML傳遞到處理函數
var objXMLDoc=new ActiveXObject("Microsoft.XMLDOM");
objXMLDoc.loadXML(req.responseText);
eval("if(objXMLDoc.firstChild)"+method+
"(objXMLDoc.firstChild.nextSibling);");
} else {
//alert("HTTP error: "+req.status);
}
}
}
}
//執行客戶端Ajax命令
//url 數據post地址
//postData 發送的數據包
//handleMethod 處理返回的方法
function executeAjaxCommand(url,postData,handleMethod)
{
var req = newXMLHttpRequest();
req.onreadystatechange =handleAjaxResult(req,handleMethod);
req.open("PO ST", url, true);
req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
req.setRequestHeader("charset","utf-8");
req.send(postData);
}
//用戶發言
unction doSend()
{
if(!check())return false;
var msg=ntent.value;
var reciver=EditForm.reciver.value;
var url="/chat.ejf?easyJWebCommand=send&cid="+roomId+"&lastReadId=
"+lastReadId;
var postData="sender="+myName+"&reciver="+reciver+"&content="+msg;
clearTimeout(reciveTime);
executeAjaxCommand(url,postData,"recive");
ntent.value="";
}
//接收發言信息
function doRecive()
{
var reciver=EditForm.reciver.value;
var url="/chat.ejf?easyJWebCommand=recive&cid="+roomId+"&lastReadId=
"+lastReadId;
executeAjaxCommand(url,"","recive");
}
//處理接收到的發言信息
function recive(list)
{
var id="";
for(var oNode=list.firstChild;oNode;oNode=oNode.nextSibling) // 依次分析每個
節點
{
chatContent.innerHTML+=showMsg(oNode);
id=oNode.getAttribute("cid");
}
if(id!="") lastReadId=id;
chatContent.scrollTop=chatContent.scrollHeight;
reciveTime=setTimeout("doRecive();",5000);
}
六、系統演示
大家可以到EasyJF開源團隊的官方網站看程序演示效果,地址是:
?easyJWebCommand=show&ejid=2538093638804337
結束語
Ajax從技術上講主要就是javascript、dhtml、css、xmldom、xmlhttp等一些我們很早就接觸了的技術。而xmldom及xmlhttp也沒有什麼東西,寫程序的時候把參考文檔打開Copy就OK,dhtml及javascript涉及的東西就多了,不能只是看參考文檔,需要把他真正消化,並能靈活動用,這就需要大家都練習了。筆者建議大家不要濫用Ajax.對於高手建議多研究一些業務及系統級算法設計等,對於新手嘛,把基本的技術(客戶端的包括dhtml、css、javascript、xml等,J2EE服務器端的設計模式、UML建模、Servlet、JDBC或ORM系統、XML、EJB及一些框架、工具等)學好才是硬道理。
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25718.html