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评分 ...
随机推荐
- BugPhobia开发篇章:Beta阶段第X次Scrum Meeting
0x01 :Scrum Meeting基本摘要 Beta阶段第十次Scrum Meeting 敏捷开发起始时间 2015/12/29 00:00 A.M. 敏捷开发终止时间 2016/01/01 23 ...
- 7 Servlet 会话技术
1 什么是会话 用户开一个浏览器访问某个网站,点击多个链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为会话,与打电话类似.会话过程要解决一些问题, 每个用户在使用浏览器与服务器进行会话时 ...
- DAO 四个包的建立
一.DAO 四个包的建立,降低代码之间的耦合性? 之前写代码,都是在一个包下.代码耦合性较高,不利于后期的维护. dao(代码分层?) 有利于后期的维护代码,修改方便. com.aaa.dao 存放d ...
- SQLServer 中多行数据合并成一行数据(一个字段)
需求:有四行数据,如下: 1.苹果 2.橘子 3.桃子 4.波罗 合并成一个字段:苹果,橘子,桃子,波罗: 需求明确之后,先弄点测试数据,上代码: --创建一个临时表 Create table #te ...
- 洛谷P4178 Tree (算竞进阶习题)
点分治 还是一道点分治,和前面那道题不同的是求所有距离小于等于k的点对. 如果只是等于k,我们可以把重心的每个子树分开处理,统计之后再合并,这样可以避免答案重复(也就是再同一个子树中出现路径之和为k的 ...
- rest framework 视图,路由
视图 在上面序列化的组件种已经用到了视图组件,即在视图函数部分进行逻辑操作. 但是很明显的弊端是,对每个表的增删改查加上 单条数据,需要用到 2个类 5个方法(增删改查,单数据查)才可以完整的实现,当 ...
- [问题]Android listView item edittext 不能调用软键盘输入法
android listview item edittext not softkeyboard edittext可以获取焦点, 可以触发事件, 但是就是不能调用输入法, 不知道为什么? 难道不能在i ...
- .Net Core实践2 sqlite
目标 使用.netcore项目在Linux上运行sqlite 环境 .netcore2.1 / centos7 / win10 / vs2017 / sqlite3 sqlite库还是这个System ...
- [python]python3.7中文手册
https://pythoncaff.com/docs/tutorial/3.7.0
- Nginx反向代理、负载均衡、动静分离、缓存、压缩、防盗链、跨域访问
一.反向代理 1.在192.168.189.130机器启动tomcat服务,http://192.168.189.130:8080/ 访问服务正常 2.在192.168.189.131机器配置ngin ...