注:本文来源于《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 网站用户在线和客服聊天的更多相关文章

  1. JAVA结合WebSocket实现简单客服聊天功能

    说明:该示例只简单的实现了客服聊天功能. 1.聊天记录没有保存到数据库中,一旦服务重启,消息记录将会没有,如果需要保存到数据库中,可以扩展 2.页面样式用的网上模板,样式可以自己进行修改 3.只能由用 ...

  2. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(三) 激动人心的时刻到啦,实现1v1聊天   看起来挺简单,细节还是很多的,好,接上一篇,我们已经成功连接singalR服务器 ...

  3. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(二) 实现聊天室连接

    上一篇已经简单介绍了layim WebUI即时通讯组件和获取数据的后台方法.现在要讨论的是SingalR的内容,之前都是直接贴代码.那么在贴代码之前先分析一下业务模型,顺便简单讲一下SingalR里的 ...

  4. 转载 ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据

    ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(一) 整理基础数据   最近碰巧发现一款比较好的Web即时通讯前端组件,layim,百度关键字即可,我下面要做的就是基于这个前 ...

  5. ASP.NET SignalR 与LayIM配合,轻松实现网站客服聊天室(四) 添加表情、群聊功能

    休息了两天,还是决定把这个尾巴给收了.本篇是最后一篇,也算是草草收尾吧.今天要加上表情功能和群聊.基本上就差不多了,其他功能,读者可以自行扩展或者优化.至于我写的代码方面,自己也没去重构.好的,我们开 ...

  6. jQuery网页右侧固定层显示隐藏在线qq客服代码

    CSS代码: @charset "utf-8"; ;;} html,body{font-size:12px;font-family:"微软雅黑";outline ...

  7. h5在线1v1客服|web在线客服系统|h5即时聊天

    网上有很多环信.美恰之类的客服系统,最近也使用h5+css3+fontJs+swiper+wcPop等技术架构开发了一个在线客服(1v1沟通聊天),可以应用到在线临时聊天.在线咨询等情景.实现了消息. ...

  8. PHP客服聊天

    1.基于workman框架 github:https://github.com/walkor/workerman-chat 文档:http://www.workerman.net/gatewaydoc ...

  9. iOS:移动端“用户反馈和客服”的几个平台SDK的介绍

    简单阐述: 用户反馈功能几乎是每个app都有的一个功能点,通过反馈功能实现与用户的连接.沟通,随时随地收集用户意见反馈和Bug报告,即时和用户保持沟通,在一定程度上提升了app的竞争力.而给app评分 ...

随机推荐

  1. Linux使用百度云

    导读 百度云没有Linux客户端,于是有大神用Go语言写出来一个叫BaiduPCS-Go的命令行盘客户端,可以通过终端操作百度云盘,在Linux上实现上传下载.但是因为是命令行版本的,对没有命令行使用 ...

  2. springboot的热部署

    SpringBoot 4.SpringBoot 整合 devtools 实现热部署   一.添加 devtools 依赖 <!-- Spring boot 热部署 : 此热部署会遇到 java. ...

  3. Nginx 处理Http请求简单流程

    L45 1:三次握手后 系统内核收到请求根据端口负载均衡的分配到某个worker 2:nginx 会分配一个512byte链接内存池 3:初始化nginx的http模块并等待用户请求,假设用户在cli ...

  4. Hive 执行作业时报错 [ Diagnostics: File file:/ *** reduce.xml does not exist FileNotFoundException: File file:/ ]

    2019-03-10 本篇文章旨在阐述本人在某一特定情况下遇到 Hive 执行 MapReduce 作业的问题的探索过程与解决方案.不对文章的完全.绝对正确性负责. 解决方案 Hive 的配置文件  ...

  5. 「洛谷3469」「POI2008」BLO-Blockade【Tarjan求割点】

    题目链接 [洛谷传送门] 题解 很显然,当这个点不是割点的时候,答案是\(2*(n-1)\) 如果这个点是割点,那么答案就是两两被分开的联通分量之间求组合数. 代码 #include <bits ...

  6. 解决类似umount target is busy挂载盘卸载不掉问题

    问题描述: Linux下挂载后的分区或者磁盘某些时候需要umount的时候出现类似“umount: /mnt: target is busy.”等字样,或者“umount: /xxx: device ...

  7. MySQL防止库存超卖方法总结

    订单超卖问题是涉及到库存项目的重中之重,这里我总结一下常用的方法 1.简单处理[update & select 合并](乐观锁) beginTranse(开启事务)$num = 1; try{ ...

  8. JENKINS针对不同项目组对用户进行权限分配

    权限需求 因JENKINS上存有de(开发).te(测试).re(预发布)等三个不同环境的项目,同时因为项目需求,需要对不同的开发及测试人员配置不同的jenkins权限,即以项目为单位,对不同人员进行 ...

  9. NOI-OJ 1.12 ID:10 素数对

    整体思路 本题涉及大量素数的使用,故使用埃拉拖色尼算法提前计算出素数表可以避免大量.重复的计算. 判断素数对很简单,使用两个变量p1和p2代表素数表中的第一个和第二个素数,依次在表中向后移动,判断p2 ...

  10. Elasticsearch 6.4基本操作 - Java版

    1. Elasticsearch Java API有四类client连接方式 TransportClient RestClient Jest Spring Data Elasticsearch 其中T ...