正 文

用AJAX+J2EE实现一个网上会议室系统


www.7dspace.com 更新日期:2006-5-16 10:04:16 七度空间 免费5位qq号码 免费Q币


  五、核心代码说明

  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及一些框架、工具等)学好才是硬道理。

2页,页码:[1] [2] 

上一篇:网站收录多但访问量少怎么办?
下一篇:用Ruby+Builder创建XML应用
用AJAX+J2EE实现一个网上会议室系统 作者:easyjf 来源:java研究组织
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐