利用jquery与struts2制作简易的在线聊天功能。
许多学校都会让学生做一个网上电子商城的项目来作为期末作业,所以可以加入客服的功能,但是又未学习到太多知识如websock,就可以参考本文章。
- 思路:客户端之前通过服务器端的ServletContext来传递聊天信息。客户端页面由上下两部分组成。上部分为一个聊天框,设置定时刷新页面,使聊天记录不断刷新。下部分是文本框用于信息的发送。当客户端关闭页面,使用监听器,清除掉ServletContext中的聊天记录(这个应该可以实现)。
2.客户端页面分为由三个页面组成,主页面main.jsp,main.jsp由两个页面组成:top.jsp,under.jsp。
上部分页面top.jsp设置自动刷新时间为2S,用于接收信息使用。
<%
/*设置定时刷新*/
response.setIntHeader("refresh", 2);
%>
<script type="text/javascript">
$(function(){
/* 定时接收信息 */
var lookMsg = $('#lookmsg').val();
$.post("${pageContext.request.contextPath }/getMsg.action?cusername=${customer.cusername}"
,{"lookMsg":lookMsg},function(data){
$(data).each(function(i,n){
$('#lookmsg').val(n.lookMsg);
});
},"json");
});
</script>
下部分页面under.jsp负责消息的发送。
<script type="text/javascript">
$(function(){
/* 发送信息 */
$('#btn').click(function(){
var mydate = new Date();
var t=mydate.toLocaleString();
var sendMsg = "${customer.cusername}:"+t+"\n";
sendMsg += $('#sendmsg').val();
$('#sendmsg').val("");
$.post("${pageContext.request.contextPath }/sendMsg.action?cusername=${customer.cusername}",{"sendMsg":sendMsg}
,function(data){},"json");
});
});
</script>
<body>
<div align="center">
<textarea cols="52" rows="10" id="sendmsg" name="sendMsg"></textarea>
<button id="btn">发送</button>
</div>
</body>
3.客服人员端的页面也跟客户端类似
左边的第一个超链接能够查看哪个客户发来了消息,下面的超链接时与某个客户聊天。
4.acton端的代码。
服务器启动的时候就实例化一个Map<String,String>集合。由于每个客户登录,就会在session中存放一个user的属性。当用户登录,就把session中user的username存放到Map中
重点:Map集合来控制与谁聊天,当页面传过来的cusername参数不同时,就获取的map集合中不同的聊天信息。用一个特定的键(如!#!$@,不符合客户的账号规则即可),来存储谁发来了信息的聊天记录
private Map<String,String> msgMap = new HashMap();//存放各个用户所对应的聊天信息。
private String cusername;//取得map中信息的键
private String lookMsg;//显示在上页面的信息。
private String sendMsg;//下页面发送过来的信息。
/**
* 接收信息
* 1.先确保从页面获取的到cusername的值
* 2.从ServletContext中拿到存放聊天信息的map集合。
* 3.从map中获取键为cusername的聊天信息值。
* 4.把聊天信息的记录转化为json数据,响应给浏览器。
* @return
* @throws IOException
*/
public String getMsg() throws IOException {
System.out.println(cusername);
ServletContext servletContext = ServletActionContext.getServletContext();
msgMap = (Map<String, String>)servletContext.getAttribute("msgMap");
/*Set<String> set = msgMap.keySet();
for (String key : set) {
System.out.println("msg:"+msgMap.get(key));
}*/
lookMsg = msgMap.get(cusername);
Map<String,String> map = new HashMap<>();
map.put("lookMsg", lookMsg);
JSONObject msg = JSONObject.fromObject(map);
ServletActionContext.getResponse().setContentType("text/html;charset=utf-8");
/* System.out.println(msg.toString());*/
ServletActionContext.getResponse().getWriter().println(msg.toString());
return NONE;
}
/**
* 发送信息
* 1.获取页面传来的cusername的值。
* 2.从ServletContext中获取存放聊天信息的map集合
* 3.从map中获取键为cusername的聊天信息的值,用oldMsg来接收。
* 4.把久的信息,加上新发来的信息sendMsg,存放会map中。
* @return
*/
public String sendMsg() {
System.out.println("sendMsg:"+cusername);
ServletContext servletContext = ServletActionContext.getServletContext();
msgMap = (Map<String, String>)servletContext.getAttribute("msgMap");
String oldMsg = msgMap.get(cusername);
lookMsg = oldMsg +"\n"+sendMsg;
msgMap.put(cusername, lookMsg);
//用于客服查看哪个客户发来了信息。
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-HH-dd HH:mm:ss");
msgMap.put("!!!!!", cusername+",发来了消息"+","+sdf.format(date));
servletContext.setAttribute("msgMap",msgMap);
return NONE;
}
/**
* 客服使用的功能。
* 用于切换聊天对象。
* @return
*/
public String changeCustomer() {
ServletContext servletContext = ServletActionContext.getServletContext();
//存回值栈中
msgMap = (Map<String, String>)servletContext.getAttribute("msgMap");
//设置聊天对象的cusername到目标页面。
ServletActionContext.getRequest().setAttribute("cusername", cusername);
return "change";
}