使用AJAX+J2EE实现一个网上会议室系统.docx
- 文档编号:25117528
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:16
- 大小:20.86KB
使用AJAX+J2EE实现一个网上会议室系统.docx
《使用AJAX+J2EE实现一个网上会议室系统.docx》由会员分享,可在线阅读,更多相关《使用AJAX+J2EE实现一个网上会议室系统.docx(16页珍藏版)》请在冰豆网上搜索。
使用AJAX+J2EE实现一个网上会议室系统
使用AJAX+J2EE实现一个网上会议室系统
发布时间:
2007.07.1606:
27 来源:
赛迪网技术社区 作者:
dxaw
一、系统实现的功能
本会议室系统主要用于EasyJF开源团队的成员网上会议使用,会议系统模拟传统的会议形式,可以同时开设多个不同主题的会议室,每个会议室需要提供访问权限控制功能,会议中能够指定会议发言模式(分为排队发言、自由发言两种),系统能自动记录每个会议室的发言信息,可以供参会人员长期查阅。
会议系统的用户支持游客帐号参加会议,同时也提供跟其它用户系统的接口,比如EasyJF官网中的开源论坛系统。
会议系统暂时使用文字聊天的方式,并提供语音及视频的接口。
二、技术体系
服务器端使用Java语言,MVC使用EasyJWeb框架;
客户端使用AJAX技术与服务器端交互数据;
会议历史信息储存格式使用文本格式,方便系统安装运行,也便于管理。
三、会议室服务器端设计
会议室服务器端是整个会议系统的核心部分,服务器端程序设计的好坏影响到整个系统的质量。
首先,根据会议室要实现的功能进行抽象分析。
一个会议室对象,应该包括会议主题、会议简介、参会人数限制、公告、会议室类型、访问权限设定、房间密码、当前参会的人员、当前发言的人员、排队等待发言的人员等参数信息。
我们把他封装一个Java对象当中。
如下面的ChatRoom代码所示:
publicclassChatRoom{
privateStringcid;//主键
privateStringtitle;//聊天室主题
privateStringintro;//聊天室简介
privateStringannounce;//聊天室公告
privateStringowner;//聊天室创建人
privateIntegermaxUser;//最大在线人数
privateIntegerintervals;//最大刷新时间间隔
privateStringvrtype;//访问权限
privateStringvrvalue;//访问值
privateIntegerstatus;//聊天室状态
privateDateinputTime;
}
需要一个管理会议室的类,与会议有关的操作(如启动会议、关闭会议)等都直接找他。
该类还应该即有自动定时检测用户在线情况(防止用户意外退出)、把内存中的会议历史发言信息保存到文本文件中等功能。
这里可以考虑使用一个ChatService类提供这些功能:
publicclassChatServiceimplementsRunnable{
privatestaticfinalMapservice=newHashMap();
//会议室服务,系统中的当前会议室存放到该表集合中
privatestaticfinalintmaxServices=10;//可以同时开的最大会议室数
privatestaticfinalSimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-dd");
privatefinalListmsgs;//聊天信息Chat
privatefinalListusers;//在线用户,ChatUser
privatefinalListtalkers;//排队发言人数Talker
privatefinalListmanager;//会议室管理员
privateTalkercurrentTalker;//当前发言人
publicChatService()
{
this.msgs=newArrayList();
this.users=newArrayList();
this.talkers=newArrayList();
this.manager=newArrayList();
this.maxUser=1000;//最大1000人同时
this.interval=1000*60*5;//5分钟以前的信息
}
}
会议发言信息也需要封装成一个类,表示发言人、接收人、内容、发言时间、类型等,大致如下面的Chat类:
publicclassChat{
privateStringcid;
privateStringsender;
privateStringreciver;
privateStringcontent;
privateDatevdate;
privateIntegertypes;
privateIntegerstatus;
}
还有表示参加会议的人的信息,包括参会人名称、IP地址、状态等,如下面的ChatUser类所示:
publicclassChatUser{
privateStringip;
privateStringport;
privateStringuserName;
privateDatelastAccessTime;
privateIntegerstatus;
}
另外还需要一个表示当前发言人的Talker类,表示当前的发言人,发言开始时间,发言预计结束时间等。
在服务器端的设计中,会议室信息服务器应该能以多线程的方式运行,即启动一个会议就新开一个线程,每个会议线程维护自己的会议状态,如参会人、发言人,保存会议历史发言信息以及清空内存中的数据等操作。
四、客户端设计
会议室客户端包括两个部分,一个部分是会议室的管理界面,主要包会议室的“添删改查”及“启动”或“关闭”会议服务的操作。
这部分我们直接使用EasyJWebTools中的添删改查业务引擎AbstractCrudAction可以快速实现。
界面也比较简单,直接使用EasyJWebTools代码生成工具引擎生成即可。
会议室管理的客户端是传统的JavaWeb技术,因此没有什么要考虑的。
客户端的第二个部分也即会议系统的主要部分,该部分主要有两个界面,第一个页面是会议室进入的选择页面。
也即把已经启动的会议室列出来,用户选择一个会议室进入,这个页面也是使用传统的JavaWeb技术。
第二个页面是进入会议室后的主界面,这个界面是整个会议系统的主要界面,所有参与会议的操作都在这里运行的。
这个界面需要不断的与服务器端交互传输数据,传输的内容包括用户的发言、其它人给用户的发言、会议室的状态等。
有的传输信息需要即时响应(如用户发言),有的信息可以设置成定时响应(如会议室状态)。
JavaWeb程序中与服务器端交互数据主要有两种方式,一种是直接刷新页面,另外一种是使用Socket直接跟Web服务器端口通讯。
由于Socket编程相对复杂,我们选择第一种直接刷新页面的方式,这种方式又可以分为几种,包括传统的Form提交,传统的自动刷新网页取得数据以及使用ActiveXObject对象(如xmlhttp)直接与服务器交互数据,也即AJAX方式。
由于使用AJAX方式用户感觉不到页面在刷新,表现起来好于手动或自动刷新页面的方式,因此我们决定选择AJAX方式实现客户端与服务器端进行数据交互。
用户发言的时候,直接使用xmlhttp对象Post数据到服务器。
为了能不断接收到别人的发言信息,需要定时不断的从服务器端读取数据,因此,需要在客户端启动一个定时器,每隔一定的时候自动使用xmlhttp对象到服务器端下载别人的发言信息,并显示到会议室信息主界面中。
另外还要定时刷新参会的人数、会议室当前发言人、会议室的公告等会议状态信息,这也可以通过从客户端启动一个定时器,通过xmlhttp对象与服务器交互得到。
另外还有一些操作,锁定会议室、踢人、指定发言人的发言时间、给会议室加密码等功能,也通过xmlhttp的方式与服务器传输命令实现。
五、核心代码说明
1、服务器端核心代码
在EasyJF开源团队的会议系统中,由于是以EasyJF官网的论坛系统、后台管理等是集成一起的。
服务器ChatService与ChatRoom共同合并到了一个ChatService.java类中,实现会议室管理及会议服务功能。
ChatService类的部分主要代码如下:
packagecom.easyjf.chat.business;
publicclassChatServiceimplementsRunnable{
privatestaticfinalMapservice=newHashMap();
//会议室服务,系统中的当前会议室存放到该表集合中
privatestaticfinalintmaxServices=10;//可以同时开的最大会议室数
privatestaticfinalSimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-dd");
privatefinalListmsgs;//聊天信息Chat
privatefinalListusers;//在线用户,ChatUser
privatefinalListtalkers;//排队发言人数Talker
privatefinalListmanager;//会议室管理员
privateTalkercurrentTalker;//当前发言人
privateStringcid;//会议室id
privateStringtitle;//会议室主题
privateStringintro;//会议室简介
privateStringowner;//会议室创建人
privateintmaxUser;//最大在线人数
privateintinterval;//最大刷新时间间隔
privateStringvrtype;//访问权限
privateStringvrvalue;//访问值
privateStringannounce;
privateStringpassword;//房间进入密码
privateintstatus;//会议室状态
privateStringfilePath;
//privateThreadthread;
privatebooleanisStop=false;
publicChatService()
{
this.msgs=newArrayList();
this.users=newArrayList();
this.talkers=newArrayList();
this.manager=newArrayList();
this.maxUser=1000;//最大1000人同时
this.interval=1000*60*5;//5分钟以前的信息
}
/**
*停止所有会议室
*
*/
publicstaticvoidclear()
{
if(!
service.isEmpty())
{
Iteratorit=service.values().iterator();
while(it.hasNext())
{
ChatServicechat=(ChatService)it.next();
chat.stop();
}
}
service.clear();
}
/**
*创建一个会议室
*@paramname会议室ID
*@return
*/
publicstaticChatServicecreate(Stringname)
{
ChatServiceret=null;
if(service.containsKey(name))
{
ChatServices=(ChatService)service.get(name);
s.stop();
service.remove(name);
}
if(service.size(){
ret=newChatService();
service.put(name,ret);
}
returnret;
}
**
*停止某个会议室
*@paramname会议室ID
*@return
*/
publicstaticbooleanclose(Stringname)
{
ChatServicechatRoom=ChatService.get(name);
if(chatRoom!
=null)
{
chatRoom.stop();
service.remove(name);
}
returntrue;
}
/**
*获得一个会议室信息
*@paramname会议室ID
*@return
*/
publicstaticChatServiceget(Stringname)
{
if(service.containsKey(name))return(ChatService)service.get(name);
elsereturnnull;
}
publicvoidrun(){
//TODOAuto-generatedmethodstub
//this.thread=Thread.currentThread();
while(!
isStop)
{
//System.out.println("开始监控一个会议室!
"+this.title);
this.flash();
try{
Thread.sleep(5000);
}
catch(Exceptione)
{
e.printStackTrace();
}
}
//System.out.println("结束!
");
}
publicvoidstop()
{
this.flashAll();
isStop=true;
}
//会议室中有人发言
publicbooleantalk(Chatchat)
{
booleanret=false;
if(canTalk(chat.getSender()))
{
this.msgs.add(chat);
ret=true;
}
returnret;
}
publicbooleanexit(ChatUseruser)
{
talk(geneSystemMsg(user.getUserName()+"退出了会议室!
"));
returnthis.users.remove(user);
}
}
//刷新信息,保存会议信息
publicvoidflash()
{
flashChatMsg();
flashChatUser();
}
}
2、MVC处理部分的Action代码
在EasyJF的会议系统中,由于使用EasyJWeb作为MVC框架,因此处理Ajax比较简单,下面是会议室系统的核心Action主要代码。
packagecom.easyjf.chat.action;
publicclassChatActionextendsAbstractCmdAction{
privateChatServicechatRoom;
publicObjectdoBefore(WebFormform,Modulemodule){
//TODOAuto-generatedmethodstub
if(chatRoom==null)chatRoom=ChatService.get((String)form.get("cid"));
returnsuper.doBefore(form,module);
}
publicPagedoInit(WebFormform,Modulemodule){
//TODOAuto-generatedmethodstub
returndoMain(form,module);
}
//用户登录进入会议室
publicPagedoMain(WebFormform,Modulemodule){
if(chatRoom!
=null){
ChatUseruser=getChatUser();
if(!
chatRoom.join(user))form.addResult("msg","不能加入房间,可能是权限不够!
");
form.addResult("chatRoom",chatRoom);
form.addResult("user",user);
}
else
{
form.addResult("msg","会议未启动或者会议室不存在!
");
}
returnmodule.findPage("main");
}
//处理用户发言信息
publicPagedoSend(WebFormform,Modulemodule){
if(chatRoom==null)returnnewPage("err","/err.html","thml");//返回会议室不存在的错误
Chatchat=(Chat)form.toPo(Chat.class);
chat.setCid(chatRoom.geneId());
chatRoom.talk(chat);
returndoRecive(form,module);
}
//用户接收发言信息
publicPagedoRecive(WebFormform,Modulemodule){
if(chatRoom==null)returnnewPage("err","/err.html","thml");//返回会议室不存在的错误
StringlastReadId=CommUtil.null2String(form.get("lastReadId"));
//System.out.println(lastReadId);
form.addResult("list",chatRoom.getNewestMsg(getChatUser(),lastReadId));
returnmodule.findPage("msgList");
}
//用户刷新会议状态信息
publicPagedoLoadConfig(WebFormform,Modulemodule){
if(chatRoom==null)returnnewPage("err","/err.html","thml");//返回会议室不存在的错误
form.addResult("userList",chatRoom.getUsers());
form.addResult("talkerList",chatRoom.getTalkers());
returnmodule.findPage("config");
}
//用户退出
publicPagedoExit(WebFormform,Modulemodule){
if(chatRoom==null)returnnewPage("err","/err.html","thml");//返回会议室不存在的错误
chatRoom.exit(getChatUser());
form.addResult("msg","退出成功");
ActionContext.getContext().getSession().removeAttribute("chatUser");
returnnewPage("msg","/chat/xmlMsg.xml",Globals.PAGE_TEMPLATE_TYPE);
}
3、客户端AJAX部分核心代码
EasyJF会议系统中,服务器发送给客户端的都是格式化的xml文档数据。
下面是核心的AJAX函数及发送接收会议信息的客户端代码。
functionnewXMLHttpRequest(){
varxmlreq=false;
if(window.XMLHttpRequest){
xmlreq=newXMLHttpRequest();
}elseif(window.ActiveXObject){
try{
xmlreq=newActiveXObject("Msxml2.XMLHTTP");
}catch(e1){
try{
xmlreq=newActiveXObject("Microsoft.XMLHTTP");
}catch(e2){
}
}
}
returnxmlreq;
}
//处理返回信息
//xmlHttp返回值,
//method:
方法名方法必须带一个参数如doRecive(xNode);
functionhandleAjaxResult(req,method){
returnfunction(){
if(req.readyState==4){
if(req.status==200){
//将载有响应信息的XML传递到处理函数
varobjXMLDoc=newActiveXObject("Microsoft.XMLDOM");
objXMLDoc.loadXML(req.responseText);
eval("if(objXMLDoc.firstChild)"+method+"(objXMLDoc.firstChild.nextSibling);");
}else{
//alert("HTTPerror:
"+req.status);
}
}
}
}
//执行客户端Ajax命令
//url数据post地址
//postData发送的数据包
//handleMethod 处理返回的方法
functionexecuteAjaxCommand(url,postData,handleMethod)
{
varreq=newXMLHttpRequest();
req.onreadystatechange=handleAjaxResult(req,handleMethod);
req.open("POST",url,true);
req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
req.setRequestHeader("charset","utf-8");
req.send(postData);
}
//用户发言
unctiondoSend()
{
if(!
check())returnfalse;
varmsg=EditForm.content.value;
varreciver=EditForm.reciver.value;
varurl="/chat.ejf?
easyJWebCommand=send&cid="+roomId+"&lastReadId="+lastReadId;
varpostData="sender="+my
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 AJAX J2EE 实现 一个 网上 会议室 系统