java 网站用户在线和客服聊天
注:本文来源于《java 网站用户在线和客服聊天》
这是应用到项目中的一个例子。
实现原理是将信息存储到Application域里面。然后使用Struts2 Action 用json格式的数据进行前后台交互。
截图:
前台用户界面:
后台客服界面:
编辑框采用的Ueditor 可以发送图片表情文字格式、涂鸦。。。。等等!功能十分的强大!
代码部分:
用到了两个Action,分别为用户和管理员服务。
Struts.xml
<!-- 聊天功能实现 -->
<package name="chat" extends="struts-default,json-default">
<!-- 用户发送消息 -->
<action name="chatMessageSend" class="com.shop.chat.MessageAction" method="send">
<result name="success" type="json"></result>
</action> <!-- 用户接受消息 -->
<action name="chatMessageGet" class="com.shop.chat.MessageAction">
<result type="json"></result>
</action> <!-- 管理员获取消息 -->
<action name="adminMessageGet" class="com.shop.chat.AdminMessageAction">
<result name="success" type="json"></result>
</action> <!-- 管理员发送消息到用户 -->
<action name="adminMessageSend" class="com.shop.chat.AdminMessageAction" method="send">
<result type="json"></result>
</action> <!-- 管理员列表 -->
<action name="adminList" class="com.shop.chat.AdminListAction">
<result type="json"></result>
</action> </package>
Java 类:
package com.shop.chat.admin; import java.util.ArrayList;
import java.util.List; import com.shop.bean.Admin; /**
* 存放当前已经登陆的管理员列表
* @author Pan
*
*/
public class AdminList { private List<Admin> list=new ArrayList<Admin>();
public AdminList(){ } /**
* 增加Admin对象
* @param admin
*/
public void save(Admin admin){
if(list.indexOf(admin)==-1){
list.add(admin);
}
} /**
* 得到所有Admin
* @return
*/
public List<Admin> getList(){
return list;
}
}
package com.shop.chat.admin; import java.util.List; import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession; import com.shop.bean.Admin; /**
* admin列表服务
* @author Pan
*
*/
public class AdminListServler { private AdminList list; public AdminListServler(HttpSession session){
ServletContext context=session.getServletContext();
list=(AdminList)context.getAttribute("adminlist");
if(list==null){
list=new AdminList();
context.setAttribute("adminlist", list);
}
}
/**
* add an admin to the list
* @param admin
*/
public void save(Admin admin){
list.save(admin);
} /**
* get all admin object
* @return arraylist
*/
public List<Admin> getList(){
return list.getList();
}
}
package com.shop.chat.admin;
import java.sql.Timestamp;
public class AdminSimplify {
private Integer id;
private String adminName;
private String adminPass;
private String nickName;
private String head;
private Timestamp addTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAdminName() {
return adminName;
}
public void setAdminName(String adminName) {
this.adminName = adminName;
}
public String getAdminPass() {
return adminPass;
}
public void setAdminPass(String adminPass) {
this.adminPass = adminPass;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public Timestamp getAddTime() {
return addTime;
}
public void setAddTime(Timestamp addTime) {
this.addTime = addTime;
}
}
package com.shop.chat; import java.util.ArrayList;
import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;
import com.shop.bean.Admin;
import com.shop.chat.admin.AdminListServler;
import com.shop.chat.admin.AdminSimplify; public class AdminListAction extends ActionSupport { private List<AdminSimplify> list; public List<AdminSimplify> getList() {
return list;
}
/**
* 得到当前登陆的管理员
* @return
*/
public String execute(){ list=new ArrayList<AdminSimplify>();
AdminListServler aServler=new AdminListServler(ServletActionContext.getRequest().getSession());
for (Admin admin : aServler.getList()) { AdminSimplify as=new AdminSimplify();
as.setAddTime(admin.getAddTime());
as.setAdminName(admin.getAdminName());
as.setAdminPass(admin.getAdminPass());
as.setHead(admin.getHead());
as.setId(admin.getId());
as.setNickName(admin.getNickName());
list.add(as);
} return SUCCESS;
}
}
package com.shop.chat; import java.util.List; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;
import com.shop.bean.Admin; public class AdminMessageAction extends ActionSupport { private String to; //接受用户
private String result; //返回消息
private String content; //消息内容
private String nickName; //昵称
public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getNickName() {
return nickName;
}
public void setContent(String content) {
this.content = content;
}
private List<Message> list; public List<Message> getList() {
return list;
} public void setResult(String result) {
this.result = result;
}
public String getResult() {
return result;
}
public void setTo(String to) {
this.to = to;
} public String execute(){
Admin admin=(Admin)ServletActionContext.getRequest().getSession().getAttribute("admin");
if(admin==null){
setResult("你还没有登录!");
return SUCCESS;
}
MessageServer msServer=new MessageServer(ServletActionContext.getRequest().getSession(),admin.getId()+"",admin.getNickName());
list=msServer.getMessage();
return SUCCESS;
} /**
* 发送消息
* @return
*/
public String send(){
Admin admin=(Admin)ServletActionContext.getRequest().getSession().getAttribute("admin");
if(admin==null){
setResult("没有登录");
return SUCCESS;
} MessageServer msServer=new MessageServer(ServletActionContext.getRequest().getSession(), admin.getId()+"",admin.getNickName());
try {
msServer.send(to, content);
setResult("发送成功!");
setNickName(admin.getNickName());
} catch (Exception e) {
// TODO Auto-generated catch block
result=e.getMessage();
}
return SUCCESS;
} }
package com.shop.chat; /**
* 信息容器
* @author Pan
*
*/ public class Message { private String form; // 来自用户
private String to; // 接受用户
private String message; // 信息
private String nickName; //昵称 public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getNickName() {
return nickName;
}
public String getForm() {
return form;
} public void setForm(String form) {
this.form = form;
} public String getTo() {
return to;
} public void setTo(String to) {
this.to = to;
} public String getMessage() {
return message;
} public void setMessage(String message) {
this.message = message;
} }
package com.shop.chat; import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport;
import com.shop.bean.User;
import com.sun.org.apache.bcel.internal.generic.NEW; public class MessageAction extends ActionSupport { private String to; //传送到指定的用户
private String result; //返回信息
private String content; //内容
private String nickName; //昵称
private List<Message> list; //消息集合 public void setNickName(String nickName) {
this.nickName = nickName;
}
public String getNickName() {
return nickName;
}
public void setResult(String result) {
this.result = result;
}
public void setContent(String content) {
this.content = content;
}
public List<Message> getList() {
return list;
}
public String getResult() {
return result;
}
public void setTo(String to) {
this.to = to;
}
/**
* 获取消息
*/
public String execute(){ HttpServletRequest request=ServletActionContext.getRequest();
User user=(User)request.getSession().getAttribute("user");
MessageServer msServer=new MessageServer(request.getSession(), user.getId()+"",user.getNickName());
this.list=msServer.getMessage(); return SUCCESS;
} /**
* 发送消息
* @return
*/
public String send(){ HttpServletRequest request=ServletActionContext.getRequest();
User user=(User)request.getSession().getAttribute("user");
if(user==null){
result="你还没有进行登录!";
return SUCCESS;
}
MessageServer mServer=new MessageServer(request.getSession(),user.getId()+"",user.getNickName());
mServer.getMessage(); try {
mServer.send(to, content); System.out.println("to:"+to);
setNickName(user.getNickName());
setResult("发送成功");
} catch (Exception e) {
setResult("发送失败!");
result=e.getMessage();
}
return SUCCESS;
}
}
package com.shop.chat; import java.util.ArrayList;
import java.util.List; /**
* 信息集合 这个对象储存到Application中
* @author Pan
*
*/
public class MessageList { private List<Message> list=new ArrayList<Message>(); public MessageList(){ } /**
* 添加信息
* @param message
*/
public void add(Message message){
list.add(message);
} /**
* 寻找信息 通过接受的用户
* @param uid
* @return
*/
public List<Message> getByTo(String uid){
List<Message> tmp=new ArrayList<Message>();
System.out.println("list的大小:"+list.size());
for(Message message:list){
if(message.getTo().equals(uid)){
//添加到返回对象
tmp.add(message);
}
}
//然后移除信息 以免信息重复
list.removeAll(tmp);
return tmp;
} }
package com.shop.chat; import java.util.ArrayList;
import java.util.List; import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession; public class MessageServer { private MessageList mList;
private ServletContext context;
private String uid;
private String nickname;
public MessageServer(HttpSession session,String uid,String nickname){ this.context=session.getServletContext(); Object object=context.getAttribute("mlist");
if(object==null){
mList=new MessageList();
context.setAttribute("mlist", mList);
}else {
this.mList=(MessageList)object;
}
this.uid=uid;
this.nickname=nickname;
}
/**
* 发送数据
* @throws Exception
*/
public void send(String to,String content) throws Exception{ if(uid==null){
throw new Exception("用户名id无效");
} Message message=new Message();
message.setForm(uid);
message.setTo(to);
message.setMessage(content);
message.setNickName(this.nickname);
mList.add(message); } /**
* 接受信息
* @return
*/
public List<Message> getMessage(){
//返回当前用户的信息
System.out.println("uid是:"+uid);
return mList.getByTo(uid);
} }
package com.shop.chat.admin; import java.util.ArrayList;
import java.util.List; import com.shop.bean.Admin; /**
* 存放当前已经登陆的管理员列表
* @author Pan
*
*/
public class AdminList { private List<Admin> list=new ArrayList<Admin>();
public AdminList(){ } /**
* 增加Admin对象
* @param admin
*/
public void save(Admin admin){
if(list.indexOf(admin)==-1){
list.add(admin);
}
} /**
* 得到所有Admin
* @return
*/
public List<Admin> getList(){
return list;
}
}
java 网站用户在线和客服聊天的更多相关文章
- JAVA结合WebSocket实现简单客服聊天功能
说明:该示例只简单的实现了客服聊天功能. 1.聊天记录没有保存到数据库中,一旦服务重启,消息记录将会没有,如果需要保存到数据库中,可以扩展 2.页面样式用的网上模板,样式可以自己进行修改 3.只能由用 ...
- 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天
ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天 看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(二) 实现聊天室连接
上一篇已经简单介绍了layim WebUI即时通讯组件和获取数据的后台方法.现在要讨论的是SingalR的内容,之前都是直接贴代码.那么在贴代码之前先分析一下业务模型,顺便简单讲一下SingalR里的 ...
- 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据
ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据 最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...
- ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能
休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...
- jQuery网页右侧固定层显示隐藏在线qq客服代码
CSS代码: @charset "utf-8"; ;;} html,body{font-size:12px;font-family:"微软雅黑";outline ...
- h5在线1v1客服|web在线客服系统|h5即时聊天
网上有很多环信.美恰之类的客服系统,最近也使用h5+css3+fontJs+swiper+wcPop等技术架构开发了一个在线客服(1v1沟通聊天),可以应用到在线临时聊天.在线咨询等情景.实现了消息. ...
- PHP客服聊天
1.基于workman框架 github:https://github.com/walkor/workerman-chat 文档:http://www.workerman.net/gatewaydoc ...
- iOS:移动端“用户反馈和客服”的几个平台SDK的介绍
简单阐述: 用户反馈功能几乎是每个app都有的一个功能点,通过反馈功能实现与用户的连接.沟通,随时随地收集用户意见反馈和Bug报告,即时和用户保持沟通,在一定程度上提升了app的竞争力.而给app评分 ...
随机推荐
- PHP获取项目所有控制器方法名称
PHP获取项目所有控制器方法名称 //获取模块下所有的控制器和方法写入到权限表 public function initperm() { $modules = array('admin'); //模块 ...
- Django生命周期 URL ----> CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
一.一个请求来到Django 的生命周期 FBV 不讨论 CBV: 请求被代理转发到uwsgi: 开始Django的流程: 首先经过中间件process_request (session等) 然后 ...
- JavaScript实用的工具/类库
Moment.js//JavaScript日期处理类库. Lodash.js//非常实用的工具库. MD5//加密. Numeral.js//格式化和数字四则运算. Pure.css//CSS模块.
- 转 - Linux安装python3.6
https://www.cnblogs.com/kimyeee/p/7250560.html
- 用UE4蓝图制作FPS_零基础学虚幻4第二季
课时1:案例演示 05:12 课时2:工程准备 07:35 (把一个项目从一个工程移动到另一个工程) 1.新建一个空白工程,不包含初学者内容 2.选择我们要复制的工程,按右键,如下图: 复制到新工程的 ...
- [hashcat]基于字典和暴力破解尝试找到rar3-hp的压缩包密码
1.使用rar2john找到md5 2.基于字典 hashcat -a 0 -m 12500 /root/Desktop/md5.txt /usr/share/wordlists/weakpass.t ...
- JS学习笔记Day15
一.ES5及ES6 (一)严格模式 (二)bind/call/apply(改变上下文this指向,都是函数对象的方法) 1.bind:返回值是一个函数 2.call:返回值是一个对象 3.apply: ...
- 浏览器开发者工具----F12 功能介绍
笔者技巧: 看了些其它回答,有些是用来扒图片的,有些是写爬虫的(这个不要看Elements,因为浏览器会对一些不符合规范的标签做补全或者其它处理,最好是Ctrl+U). 图片的话就不要看Network ...
- elk每日清除30天索引脚本
日常elk产生日志太多,故写个脚本放在定时任务,定时清理脚本 查询索引: curl -XGET 'http://127.0.0.1:9200/_cat/indices/?v' 删除索引: cu ...
- js的7种类型
众所周知,js有7种数据类型 1. null 2. undefined 3. boolean 4. number 5. string 6. 引用类型(object.array.function) 7 ...