| |
用AJAX+J2EE实现一个网上会议室系统 |
|
时间: 2006-05-15 来自:java研究组织 |
 |
|
五、核心代码说明
1、服务器端核心代码
在EasyJF开源团队的会议系统中,由于是以EasyJF官网的论坛系统、后台管理等是集成一起的。服务器ChatService与ChatRoom共同合并到了一个ChatService.java类中,实现会议室管理及会议服务功能。ChatService类的部分主要代码如下:
package com.easyjf.chat.business; public class ChatService
implements Runnable { private static final Map service=new
HashMap();//会议室服务,系统中的当前会议室存放到该表集合中 private static final int
maxServices=10;//可以同时开的最大会议室数 private static final SimpleDateFormat
df=new SimpleDateFormat("yyyy-MM-dd"); private final List
msgs;//聊天信息Chat private final List users;//在线用户,ChatUser private
final List talkers;//排队发言人数Talker private final List manager;//会议室管理员
private Talker currentTalker;//当前发言人 private String
cid;//会议室id private String title;//会议室主题 private String
intro;//会议室简介 private String owner;//会议室创建人 private int
maxUser;//最大在线人数 private int interval;//最大刷新时间间隔 private String
vrtype;//访问权限 private String vrvalue;//访问值 private String
announce; private String password;//房间进入密码 private int
status;//会议室状态 private String filePath; //private Thread
thread; private boolean isStop=false; public
ChatService() { this.msgs=new ArrayList(); this.users=new
ArrayList(); this.talkers=new ArrayList(); this.manager=new
ArrayList(); this.maxUser=1000;//最大1000人同时 this.interval=1000*60*5;//5分钟以前的信息 } /** *
停止所有会议室 * */ public static void
clear() { if(!service.isEmpty()) { Iterator
it=service.values().iterator(); while(it.hasNext()) { ChatService
chat=(ChatService)it.next(); chat.stop(); } } service.clear(); } /** *
创建一个会议室 * @param name 会议室ID * @return */ public static
ChatService create(String name) { ChatService
ret=null; if(service.containsKey(name)) { ChatService
s=(ChatService)service.get(name); s.stop(); service.remove(name); } if(service.size()<maxServices) { ret=new
ChatService(); service.put(name,ret); } return
ret; } /** * 停止某个会议室 *
@param name 会议室ID * @return */ public static boolean
close(String name) { ChatService
chatRoom=ChatService.get(name); if(chatRoom!=null) { chatRoom.stop(); service.remove(name); } return
true; } /** * 获得一个会议室信息 * @param name 会议室ID *
@return */ public static ChatService get(String
name) { if(service.containsKey(name))return
(ChatService)service.get(name); else return null; } public
void run() { // TODO Auto-generated method
stub //this.thread=Thread.currentThread(); while(!isStop) { //System.out.println("开始监控一个会议室!"+this.title); this.flash(); try{ Thread.sleep(5000); } catch(Exception
e) { e.printStackTrace(); }
} //System.out.println("结束!"); } public void
stop() { this.flashAll(); isStop=true; } //会议室中有人发言 public
boolean talk(Chat chat) { boolean
ret=false; if(canTalk(chat.getSender())) {
this.msgs.add(chat); ret=true; } return
ret; } public boolean exit(ChatUser user) {
talk(geneSystemMsg(user.getUserName()+"退出了会议室!")); return
this.users.remove(user); } } //刷新信息,保存会议信息 public void
flash() { flashChatMsg(); flashChatUser(); } } | 2、MVC处理部分的Action代码
在EasyJF的会议系统中,由于使用EasyJWeb作为MVC框架,因此处理Ajax比较简单,下面是会议室系统的核心Action主要代码。
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","/err.html","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","/err.html","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","/err.html","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","/err.html","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=EditForm.content.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"); EditForm.content.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开源团队的官方网站看程序演示效果,地址是:
http://www.easyjf.com/chatRoom.ejf?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及一些框架、工具等)学好才是硬道理。
133
|
|
|
|
|
|
|
|