前一段时间项目需要写一个类似于站内信箱的消息管理的功能,由于对前端不是很熟悉,刚开始不知道怎么做,后来看了网上的方案,现模拟一个非常简单的消息管理。

我们首先看一下最终效果的样式,就是非常简单的一个样子,如下所示:

我这边暂时只写了三个类型的消息,订单、上下架、审核。不同的消息推送过来会显示在不同类型上,消息管理上显示的是三种类型的消息总数量。

好,接下来介绍一下代码。首先是数据库的设计,共有七个字段,分别是一个自增字段id,消息类型type,消息标题title,消息具体内容detail,消息状态status,创建时间time以及用户userId。如下所示:

然后我们看推送消息的后台代码PullMsgServlet,分别有四个方法,分别是获取所有消息的历史记录,获取某人的未读消息,获取未读消息的总数,还有获取某种类型的未读消息总数。

  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. String operateType = Base64Util.decode(request.getParameter("operateType"));
  3. msgDao = new MessageDao();
  4. switch (operateType) {
  5. case "showHistory":
  6. showHistory(request, response);
  7. break;
  8. case "showPending":
  9. showPending(request, response);
  10. break;
  11. case "showCount":
  12. showCount(request,response);
  13. break;
  14. case "showCountByType":
  15. showCountByType(request, response);
  16. break;
  17. default:
  18. break;
  19. }
  20. response.setCharacterEncoding("utf-8");
  21. response.setContentType("text/html;charset=UTF-8");
  22. response.getWriter().print(Base64Util.encode(result.toString()));
  23. }
  24.  
  25. /**
  26. * 所有消息的历史记录
  27. * @param request
  28. * @param response
  29. * @throws ServletException
  30. * @throws IOException
  31. */
  32. private void showHistory(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
  33. HttpSession session = request.getSession();
  34. userId = session.getAttribute("userId").toString();
  35. List<Object> historyList = msgDao.getMsgByUserId(userId);
  36. HttpResultList result = new HttpResultList();
  37. result.setResult(historyList.size()>0);
  38. result.setDatas(historyList);
  39. }
  40.  
  41. /**
  42. * 某人的未读消息
  43. * @param request
  44. * @param response
  45. * @throws ServletException
  46. * @throws IOException
  47. */
  48. private void showPending(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
  49. HttpSession session = request.getSession();
  50. userId = session.getAttribute("userId").toString();
  51. List<Object> pendingList = msgDao.getUnreadMsg();
  52. HttpResultList result = new HttpResultList();
  53. result.setResult(pendingList.size()>0);
  54. result.setDatas(pendingList);
  55. }
  56.  
  57. /**
  58. * 某人未读消息的总数
  59. * @param request
  60. * @param response
  61. * @throws ServletException
  62. * @throws IOException
  63. */
  64. private void showCount(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
  65. String number = msgDao.getMsgNum()+"";
  66. result = new JSONObject();
  67. result.put("result", number);
  68. }
  69.  
  70. /**
  71. * 某人某种类型的未读消息总数
  72. * @param request
  73. * @param response
  74. * @throws ServletException
  75. * @throws IOException
  76. */
  77. private void showCountByType(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
  78. Map<String, Integer> map = msgDao.getTypeNum();
  79. //获得返回的type
  80. List<String> keyList = new ArrayList<>();
  81. for (String key : map.keySet()) {
  82. keyList.add(key);
  83. }
  84. //获得返回type的个数
  85. List<Integer> valueList = new ArrayList<>();
  86. for (Integer value : map.values()) {
  87. valueList.add(value);
  88. }
  89. result = new JSONObject();
  90. JSONObject content = new JSONObject();
  91. content.put("type", JSONArray.fromObject(keyList));
  92. content.put("typeNum", JSONArray.fromObject(valueList));
  93. result.put("result", content);
  94. }

接下来我们看前端代码,这边使用了setInterval定时器,设置的js代码每5秒轮询后台一次,请求后台servlet从数据库里面获取的数据,如下所示:

  1. setInterval(function(){
  2. getType();
  3. },5000);
  4.  
  5. /**
  6. * 得到某个类型的消息数量
  7. */
  8. function getType(){
  9. var lis = document.getElementById("type").getElementsByTagName("li");
  10. var msgType = "";
  11. for(var i=0; i<lis.length; i++){
  12. msgType = lis[i].innerText;
  13. }
  14. $.ajax({
  15. type:"POST",
  16. url:"PullMsgServlet",
  17. dataType:'json',
  18. processData:false,
  19. data: {
  20. operateType: "showCountByType"
  21. },
  22. success:function(data){
  23. var result = data.result;
  24. var type = "";
  25. if(result){
  26. for(var i=0; i<result.type.length; i++){
  27. type = result.type[i];
  28. if(type == "订单"){
  29. $("#order").html(result.typeNum[i]);
  30. }else if(type == "上下架"){
  31. $("#shelf").html(result.typeNum[i]);
  32. }else if(type == "审核"){
  33. $("#review").html(result.typeNum[i]);
  34. }
  35. }
  36. }
  37. },
  38. error: function () {
  39. // alert("error...");
  40. }
  41. });
  42. }

这样前端每隔5秒就轮询一次PullMsgServlet,查询数据库里是否有未读的消息,如果有,就显示在前端页面上。这样,一个最简单的消息推送以及显示功能就有了,只是我还没有写前端历史列表的查看,等以后写了再更新。。。。

使用Ajax轮询模拟简单的站内信箱(消息管理)功能的更多相关文章

  1. 浅谈Websocket、Ajax轮询和长连接(long pull)

    最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket Websocket是HTML5中提出的新的协议,注意,这里是协议,可以 ...

  2. 浅谈Websocket、Ajax轮询和长轮询(long polling)

    浅谈Websocket.Ajax轮询和长轮询(long p0ll) 最近看到了一些介绍Websocket的文章,觉得挺有用,所以在这里将自己的对其三者的理解记录一下. 1.什么是Websocket W ...

  3. WebSocket原理及与http1.0/1.1 long poll和 ajax轮询的区别【转自知乎】

    一.WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是所谓的ke ...

  4. long poll、ajax轮询和WebSocket

    websocket 的认识深刻有木有.所以转到我博客里,分享一下.比较喜欢看这种博客,读起来很轻松,不枯燥,没有布道师的阵仗,纯粹为分享.废话这么多了,最后再赞一个~ WebSocket是出的东西(协 ...

  5. AJAX轮询的实时监控画面

    上一篇我们通过异步刷新Ajax 技术,来实现监控页面监控位号值的刷新,采用Ajax (Asynchronous Javascript And XML)技术,是指一种创建交互式.快速动态网页应用的网页开 ...

  6. Flask框架:运用Ajax轮询动态绘图

    Ajax是异步JavaScript和XML可用于前后端交互,在之前<Flask 框架:运用Ajax实现数据交互>简单实现了前后端交互,本章将通过Ajax轮询获取后端的数据,前台使用echa ...

  7. Flask框架:如何运用Ajax轮询动态绘图

    摘要:Ajax是异步JavaScript和XML可用于前后端交互. 本文分享自华为云社区<Flask框架:运用Ajax轮询动态绘图>,作者:LyShark. Ajax是异步JavaScri ...

  8. Ajax轮询以及Comet模式—写在Servlet 3.0发布之前(转)

    2008 年的夏天,偶然在网上闲逛的时候发现了 Comet 技术,人云亦云间,姑且认为它是由 Dojo 的 Alex Russell 在 2006 年提出.在阅读了大量的资料后,萌发出写篇 blog ...

  9. ajax轮询实时获取数据

    最近做一个评论功能时,想要实现实时异步刷新评论功能,于是使用了ajax轮询,这里简单记录一下ajax轮询的原理及使用方法. ajax轮询的原理就是客户端定时向服务端发送ajax请求,服务器接到请求后马 ...

随机推荐

  1. [Swift]LeetCode218. 天际线问题 | The Skyline Problem

    A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...

  2. [Swift]LeetCode556. 下一个更大元素 III | Next Greater Element III

    Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...

  3. MySQL开启远程连接权限

    对于我们刚开始安装的mysql或者mariadb来说,默认是不开启远程连接的.所以需要我们手动开启远程连接的权限.如果你是使用docker安装mysql那需要先进入容器中,这里就不讲如何进入容器了,百 ...

  4. AspNetCore 基于流下载文件与示例代码

    昨天说了,AspNetCore如何进行上传文件,其中写了两种方式ajax与模型,其文章地址为:https://www.cnblogs.com/ZaraNet/p/9949167.html 那么既然有上 ...

  5. AbstractQueuedSynchronizer源码分析(ReentrantLock锁的实现)

    1.  前言 Java中好多地方用到AbstractQueuedSynchronizer(PS:简称AQS),比如ReentrantLock.线程池,这部分在面试的时候也经常被问到,今天以Reentr ...

  6. InstallShield Limited Edition使用说明

    从Visual Studio 2012开始,微软就把自家原来的安装与部署工具彻底废掉了,转而让大家去安装使用第三方的打包工具“InstallShield Limited Edition for Vis ...

  7. asp.net core系列 23 EF模型配置(概述, 类型和属性的包含与排除)

    一.模型配置概述 EF使用一组约定基于实体类的定义来构建模型. 可指定其他配置以补充或替代约定的内容.本系列介绍的配置可应用于面向任何数据存储的模型,以及面向任意关系数据库时可应用的配置. 数据库提供 ...

  8. C++版 - 剑指offer面试题14: 调整数组顺序使奇数位于偶数前面

    题目: 调整数组顺序使奇数位于偶数前面 热度指数:11843 时间限制:1秒 空间限制:32768K 本题知识点: 数组 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇 ...

  9. 使用Phalcon框架开发一个简易的博客系统

    使用Phalcon PHP框架开发一个简易的博客系统(类似于CMS) 最近在做Phalcon(Phalcon在英文中指的是鸟类中飞得最快的那一个物种,由于是高性能框架,借用了这个词)相关的项目,由于刚 ...

  10. ASP.NET Core框架揭秘(持续更新中…)

    之前写了一系列关于.NET Core/ASP.NET Core的文章,但是大都是针对RC版本.到了正式的RTM,很多地方都发生了改变,所以我会将之前发布的文章针对正式版本的.NET Core 1.0进 ...