最近在做毕业设计,是用Ext,ibatis,spring,struts2,和comet来做一个实时的聊天系统,这个应用其实用这个多技术,尤其是Spring和struts2,ibatis,有点大炮打苍蝇的感觉,但是这是实习公司要求的,所以也就这么做了。
刚开始入手这个系统的时候,最大的难点就是关于长连接,也就是服务器推技术的应用,当时感觉无从下手,找了pushlet的example,但是感觉实现起来有点困难。
最终决定采用dwr反转来实现长连接。
现在这个应用还在制作当中,我会定期更新,把主要的代码都放上来,供大家参考!
下面这个是主界面的设计
Ext.onReady(function() {
Ext.QuickTips.init();
Ext.BLANK_IMAGE_URL = 'ext/s.gif';
// ---------------------------------------------好友列表树
var Tree = Ext.tree;
// 定义(可以异步加载)根节点
var root = new Tree.AsyncTreeNode({
id : '0',
text : '目录根节点'
});
// 开始构建树面板
var treePanel = new Tree.TreePanel({
id : 'im-tree',
root : root,
loader : new Tree.TreeLoader({
// 从数据库加载树形结构数据
dataUrl : '/graduationPrj/treePro.action'
}),
deferredRender : false,
region : 'west',
title : '在线用户',
border : false,
rootVisible : false,
lines : false,
autoScroll : true,
enableDD : false,
animate : false,
split : true,
width : 200,
minSize : 175,
maxSize : 400,
collapsible : false,
selModel : new Ext.tree.MultiSelectionModel(),
margins : '0 0 0 5'
});
/**
* @method expandAll
* @private
* @description 展开所有节点
*/
var expandAll = function() {
treePanel.root.expand(true, false);
}
/**
* @method updateUserList
* @private
* @description 定时更新在线用户列表,刷新时间为10分钟
*/
var updateUserList = function() {
treePanel.root.reload();
treePanel.root.expand(true, false);
setTimeout(updateUserList, 1000 * 10);
}
/**
* @method treeDoubleClick
* @private
* @description 添加‘双击事件’处理 当双击节点时,弹出聊天对话框
*/
var treeDoubleClick = function(node, e) {
if (node.isLeaf()) {
addOrOpenTab(node.text);
}
}
treePanel.on('dblclick', treeDoubleClick);
/**
* @method treeDoubleClick
* @private
* @description 判断tab有没有存在,如果不存在添加新tab
*/
var addOrOpenTab = function(nodeText) {
var n = tabs.getComponent(nodeText);
if (!n) {
n = tabs.add({
'id' : nodeText,
'title' : nodeText,
layout : 'border',
closable : true,
items : [new Ext.Panel({
region : 'center',
title : '聊天记录 ',
autoScroll : true,
html : '<div id=' + nodeText + 'div></div>',
tools : [{
id : 'refresh',
qtip : '注意:如果长时间没有收到对方回应,试一下',
// hidden:true,
handler : function(event, toolEl, panel) {
// refresh logic
}
}]
})]
});
}
tabs.setActiveTab(n);
}
// ---------------------------------------------公共聊天室
var logPanel = new Ext.Panel({
region : 'center',
title : '聊天记录 ',
id : 'history_panel',
autoScroll : true,
html : '<div id=publicChat></div>',
tools : [{
id : 'refresh',
qtip : '注意:如果长时间没有收到对方回应,试一下',
// hidden:true,
handler : function(event, toolEl, panel) {
// refresh logic
}
}]
});
/**
* @method treeDoubleClick
* @private
* @description 公用的输入文本框
*/
var chatPanel = new Ext.Panel({
region : 'south',
title : '聊天啦',
layout : 'fit',
// split:true,
autoScroll : true,
height : 250,
// minSize: 200,
// maxSize: 500,
collapsible : true,
margins : '0 0 0 0',
items : {
xtype : 'form',
baseCls : 'x-plain',
autoHeight : true,
autoWidth : true,
bodyStyle : 'padding:10 10px 0;',
defaults : {
anchor : '98%'
},
items : [{
xtype : 'htmleditor',
height : 150,
id : 'htmleditor',
hideLabel : true
}]
},
bbar : [{
text : '发送请输入Ctrl-Enter',
handler : function() {
var t = tabs.getActiveTab().getId();
if (t == 'allChat') {
sendPublicMsg();
} else {
sendPrivateMsg();
}
}
}
, '-', {
text : '清除',
handler : function() {
Ext.getCmp("htmleditor").reset();
}
}]
});
var allChatPanel = new Ext.Panel({
id : 'allChat',
title : '公共聊天室',
layout : 'border',
items : [logPanel]
});
/**
* 构建标签面板,出现在主显示页面,用于显示信息
*/
var tabs = new Ext.TabPanel({
region : 'center',
deferredRender : false,
id : 'tabs',
resizeTabs : true,
minTabWidth : 115,
tabWidth : 135,
height : 100,
autoScroll : true,
enableTabScroll : true,
plugins : new Ext.ux.TabCloseMenu(),
items : [allChatPanel]
});
tabs.setActiveTab(allChatPanel);
var sendPublicMsg = function() {
var content_value = Ext.getCmp("htmleditor").getValue();
var t = tabs.getActiveTab().getId();
if (content_value.trim() == '') {
Ext.Msg.alert("消息提示", "您没有输入消息文本内容!");
Ext.getCmp("htmleditor").focus();
return;
}
var receivers_values = [];
var tree = Ext.getCmp('im-tree');
var receivers = tree.getSelectionModel().getSelectedNodes();
for (i = 0; i < receivers.length; ++i) {
receivers_values.push(receivers[i].attributes.sessionId);
}
if (receivers_values.length == 0) {
Ext.Msg.alert("消息提示", '您没有选择接收者!');
tree.focus();
return;
}
// alert(receivers_values.length);
if (receivers_values.length > 1) {
Ext.Msg.alert("消息提示", '只能选择一个接收者!');
tree.focus();
return;
}
document.getElementById('publicChat').innerHTML = t + '中的aaadasdasdasd';
}
var sendPrivateMsg = function() {
var content_value = Ext.getCmp("htmleditor").getValue();
var t = tabs.getActiveTab().getId();
if (content_value.trim() == '') {
Ext.Msg.alert("消息提示", "您没有输入消息文本内容!");
Ext.getCmp("htmleditor").focus();
return;
}
document.getElementById(t + 'div').innerHTML = t + '中的aaadasdasdasd';
document.getElementById("publicChat").innerHTML = t + '中的aaadasdasdasd';
}
/**
* @method treeDoubleClick
* @private
* @description 主界面,添加各个元素
*/
var viewport = new Ext.Viewport({
layout : 'border',
items : [treePanel, {
region : 'center',
layout : 'border',
autoScroll : true,
items : [tabs, chatPanel]
}
]
});
expandAll();
updateUserList();
});
// -------------------------------------------------------------------
分享到:
相关推荐
这个框架是在学习Spring的时候,为了积累学习成果,自己搭建的,一般的系统开发也可以直接使用,包括一个系统开发的基础功能。 以下是当时自己开发时的日志,大致可以说明框架里已有功能 1.0.5 从web项目迁移成maven...
二人世界(可以实时语音聊天) c. 闹钟提醒 ------------------ 5. 分发包里有什么? ------------------ 分发包里有三个目录: myicq/ 客户端程序 myicqd/ 服务器端程序 myicqhttp/ HTTP的转换程序。MyICQ支持...
二人世界(可以实时语音聊天) c. 闹钟提醒 ------------------ 5. 分发包里有什么? ------------------ 分发包里有三个目录: myicq/ 客户端程序 myicqd/ 服务器端程序 myicqhttp/ HTTP的转换程序。MyICQ支持...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL...
1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL...
IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. ...