模板天下 | 网页模板 | 学 院 | 源 码 | 书 籍 | 壁 纸 | 字 体 | JS脚本 | FLASH源码 | 软 件 | 矢 量 | 服务器软件 | 素 材 | 其 它 |
设为主页
加入收藏
联系站长
平面设计 | 网页制作 | 程序编写 | 数 据 库 | 媒体动画 | 网络冲浪 | 服务器相关 | 站长乐园 | 业界动态 |
当前在线
使用AJAX+J2EE实现一个网上会议室系统
2007-8-15 17:58:44  作者:模板天下收集整理  来源:未知 网友评论 0 条 论坛
  

ChatService类的部分主要代码如下:

gcF站长资讯
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(){
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;gc
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");//返回会议室不存在的错误
chatRoom.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("POST", 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);
}


结束语

  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] 

>> 相关文章

关于网站 | 客服中心 | 服务条款 | 合作伙伴 | 广告联系 | 本站历程 | 网站导航 | 发布资源 == 好的资源 大家共享

吉ICP备05000107号