JQuery是一款非常强大的javascript插件,本文就针对Ajax前台和JSP后台来实现一个无刷新的多人在线聊天室,该实现的数据全部存储在服务端内存里,没有用到数据库,本文会提供所有源程序,需要持久化聊天数据的可以自行修改增加XML文件数据保存或者数据库数据保存。 

主界面: 



使用说明: 
1. 聊天室的登录验证规则为:任意用户名,只验证密码(默认为123456),简单起见,密码直接硬编码在JavaBean中,可自行修改。 
2. 需要下线请点击下线按钮,以便服务器及时得到用户下线并通过在线人员列表反馈给其他在线用户。 

基于JQuery+JSP的无数据库无刷新多人在线聊天室源代码下载(MyEclipse开发环境下导出的项目包) 

下面简要分析一下各个功能的实现: 

服务端: 

采用JSP+JavaBean结合的方式,本来是想让代码从功能性上看起来比较清晰,后来实现的时候发现好像没有预期的清晰感- -! 

JSP用来接收从客户端传来的各种Ajax请求并且反馈信息给客户端,所有的请求处理都封装在了JavaBean中。个人认为这个聊天室服务端实现最大的亮点是:充分利用了request, session. application这三大内置对象的特性,可以加深对这三个对象类型以及作用域的理解。 

Request对象用来获取客户端传递过来的参数,对不同客户端有不同的request对象,session用来保存当前登录的用户名,同样是只对当前登录用户有效,最后application大显神威,保存着两个至关重要的数据对象,一个是当前所有的在线人员列表,一个是所有的聊天内容,每当有新用户登录的时候,用户名称便会记录到application中,每当有人发言的时候,聊天信息也会保存到application中,而application对象对于所有用户都是同一个实例,所以通过application可以实现共享聊天信息和聊天人员列表数据的功能,并且application中的内容都是保存在服务端的内存中,当Tomcat关闭的时候便随之清空了,如果对于聊天信息没有保存的需要,仅仅是需要一个临时的多人在线交流平台,这种设计非常简洁且合适。 

项目文件结构: 

 

服务端的源代码 

DealData.jsp 

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@ page import="zy.DealData" %>
  3. <%
  4. String action=request.getParameter("action");
  5. DealData dd=new DealData();
  6. //用户登录
  7. if("login".equals(action)){
  8. String name=request.getParameter("name");
  9. String pwd=request.getParameter("pwd");
  10. out.println(dd.userLogin(name,pwd,session,application));
  11. }
  12. //获取所有聊天消息
  13. else if("ChatList".equals(action)){
  14. String usernameInSession=(String)session.getAttribute("username");
  15. if(usernameInSession==null){
  16. out.print("unLogin");
  17. }else{
  18. out.print(dd.AllChatList(application));
  19. }
  20. }
  21. //发送消息
  22. else if("SendContent".equals(action)){
  23. String content=request.getParameter("content");
  24. out.println(dd.addContent(content,application,session));
  25. }
  26. //获取在线人员列表
  27. else if("onLineList".equals(action)){
  28. out.println(dd.GetOnlineUsers(application));
  29. }
  30. //下线
  31. else if("OffLine".equals(action)){
  32. out.print(dd.OffLine(application,session));
  33. }
  34. %>

DealData.java 

  1. package zy;
  2. import java.util.ArrayList;
  3. import java.util.Date;
  4. import java.util.List;
  5. import javax.servlet.ServletContext;
  6. import javax.servlet.http.HttpSession;
  7. public class DealData {
  8. //用户登录的判读
  9. public String userLogin(String username,String password,HttpSession session,ServletContext application){
  10. if("123456".equals(password)){
  11. //如果密码正确就将用户名放入session
  12. session.setAttribute("username", username);
  13. //获取在线用户列表
  14. List<String> users=(List<String>)application.getAttribute("users");
  15. if(users==null){
  16. users=new ArrayList<String>();
  17. }
  18. //将当前用户加入用户列表
  19. users.add(username);
  20. //更新application中的对象
  21. application.setAttribute("users", users);
  22. return "True";
  23. }else{
  24. return "False";
  25. }
  26. }
  27. //添加消息
  28. public String addContent(String content,ServletContext application,HttpSession session){
  29. List<String> strList=(List<String>) application.getAttribute("MessageList");
  30. if(strList==null){
  31. strList=new ArrayList<String>();
  32. }
  33. //获取session中的用户名
  34. String username=(String)session.getAttribute("username");
  35. //获取时间
  36. Date date=new Date();
  37. content=content.replace("<:", "<img src='QQface/");
  38. content=content.replace(":>", ".gif' />");
  39. //组装消息
  40. String message=username+"于"+date.toLocaleString()+"说:"+content;
  41. //添加到集合中
  42. strList.add(message);
  43. //放入application对象中
  44. application.setAttribute("MessageList", strList);
  45. return "True";
  46. }
  47. //获取所有的消息
  48. public String AllChatList(ServletContext application){
  49. StringBuffer sb=new StringBuffer();
  50. List<String> strList=(List<String>) application.getAttribute("MessageList");
  51. if(strList!=null){
  52. for(String s:strList){
  53. sb.append(s+"<br />");
  54. }
  55. }
  56. return sb.toString();
  57. }
  58. //获取在线用户列表
  59. public String GetOnlineUsers(ServletContext application){
  60. StringBuffer sb=new StringBuffer();
  61. List<String> strList=(List<String>) application.getAttribute("users");
  62. if(strList!=null){
  63. for(String s:strList){
  64. sb.append(s+"<br />");
  65. }
  66. }
  67. return sb.toString();
  68. }
  69. //下线
  70. public String OffLine(ServletContext application,HttpSession session){
  71. //先取出用户名
  72. String username=(String)session.getAttribute("username");
  73. //移除session中的内容
  74. session.removeAttribute("username");
  75. //移除用户列表中的用户名
  76. List<String> strList=(List<String>) application.getAttribute("users");
  77. if(strList!=null){
  78. strList.remove(username);
  79. }
  80. return "True";
  81. }
  82. }

接下来是客户端的实现,主要是用到了JQuery的Ajax功能来实现无刷新获取数据(此处只列出Ajax函数,具体源代码请自行下载查看): 

Index.jsp用户登录的Ajax实现: 

  1. <script language="javascript" type="text/javascript">
  2. $(function(){
  3. $("#login").click(function(){
  4. var $name=$("#txtName").val();
  5. var $pwd=$("#txtPwd").val();
  6. UserLogin($name,$pwd);
  7. $("#spnMsg").html("正在登录...").show().css({"top":"20%","left":"50%"});
  8. });
  9. function UserLogin(name,pwd){
  10. $.ajax({
  11. type:"POST",
  12. url:"DealData.jsp",
  13. data:"action=login&d="+new Date()+"&name="+name+"&pwd="+pwd,
  14. success:function(data){
  15. if(data.indexOf("True")>0){
  16. window.location="ChatMain.html";
  17. }else{
  18. alert("用户名或者密码错误");
  19. $("#spnMsg").hide();
  20. return false;
  21. }
  22. }
  23. });
  24. }
  25. });
  26. </script>

ChatMain.html聊天室主界面的实现 

  1. <script language="javascript" type="text/javascript">
  2. $(function(){
  3. //键盘监听
  4. $(document).keypress(function(e){
  5. if(e.which==13){
  6. SendContent($("#txtContent").val());
  7. goToBottom();
  8. }
  9. });
  10. //读取消息
  11. GetMessageList();
  12. //读取在线用户
  13. GetOnlineUsers();
  14. //初始化表情
  15. InitFaces();
  16. //自动刷新
  17. AutoRefresh();
  18. //发送按钮事件响应
  19. $("#Button1").click(function(){
  20. var $content=$("#txtContent");
  21. if($content.val()!=""){
  22. SendContent($content.val());
  23. }else{
  24. alert("发送内容不能为空!");
  25. return false;
  26. }
  27. });
  28. $("#Button2").click(function(){
  29. if(confirm("确认下线?")){
  30. OffLine();
  31. }
  32. });
  33. //发送消息
  34. function SendContent(content){
  35. $.ajax({
  36. type:"POST",
  37. url:"DealData.jsp",
  38. data:"action=SendContent&d="+new Date()+"&content="+content,
  39. success:function(data){
  40. if(data.indexOf("True")){
  41. //获取消息
  42. GetMessageList();
  43. //清空发送框
  44. $("#txtContent").val("");
  45. goToBottom();
  46. //alert('shit for SendMessage');
  47. }else{
  48. alert("发送失败");
  49. }
  50. }
  51. });
  52. }
  53. //获取消息
  54. function GetMessageList(){
  55. $.ajax({
  56. type:"POST",
  57. url:"DealData.jsp",
  58. data:"action=ChatList&d="+new Date(),
  59. success:function(data){
  60. if(data.indexOf("unLogin")>0){
  61. alert("非法进入,请先登录!");
  62. window.location="index.html";
  63. }else{
  64. $("#divContent").html(data);
  65. }
  66. //alert('shit for GetMessage');
  67. }
  68. });
  69. }
  70. //获取在线用户列表
  71. function GetOnlineUsers(){
  72. $.ajax({
  73. type:"POST",
  74. url:"DealData.jsp",
  75. data:"action=onLineList&d="+new Date(),
  76. success:function(data){
  77. $("#divOnline").html(data);
  78. //alert('shit for GetOnlineUsers');
  79. }
  80. });
  81. }
  82. //设置表情
  83. function InitFaces(){
  84. var strHTML="";
  85. for(var i=1;i<=7;i++){
  86. strHTML+="<img src='QQface/"+i+".gif' id='"+i+"'/>";
  87. }
  88. $("#divFace").html(strHTML);
  89. }
  90. //图片监听
  91. $("table tbody tr td img").click(function(){
  92. var $txtContent=$("#txtContent");
  93. if($txtContent.val()!=undefined){
  94. var strContent=$txtContent.val()+"<:"+this.id+":>";
  95. }else{
  96. var strContent="<:"+this.id+":>";
  97. }
  98. $("#txtContent").val(strContent);
  99. });
  100. //下线
  101. function OffLine(){
  102. $.ajax({
  103. type:"POST",
  104. url:"DealData.jsp",
  105. data:"action=OffLine&d="+new Date(),
  106. success:function(data){
  107. if(data.indexOf("True")>0){
  108. alert("成功下线!");
  109. window.location="index.html";
  110. }
  111. //alert('shit for GetOnlineUsers');
  112. }
  113. });
  114. }
  115. //到底部去
  116. function goToBottom(){
  117. div=document.getElementById("divContent");
  118. .scrollTop = div.scrollHeight;
  119. }
  120. //自动更新页面信息
  121. function AutoRefresh(){
  122. setInterval(GetMessageList,2000);
  123. setInterval(GetOnlineUsers,4000);
  124. }
  125. });
  126. </script>

基于JQuery+JSP的无数据库无刷新多人在线聊天室的更多相关文章

  1. 基于Server-Sent Event的简单在线聊天室

    Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...

  2. 三、jQuery--jQuery基础--jQuery基础课程--第12章 jQuery在线聊天室

    在线聊天室案例 一.功能简介: 1.用户需要登录后才能进入聊天室交流 2.已无刷新的方式,动态展示交流后的内容和在线人员的基本信息 3.登录后的用户可以提交文字和表情图标 技术重点:利用ajax的无刷 ...

  3. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  4. Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室

    思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的 ...

  5. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  6. .NET Core 基于Websocket的在线聊天室

    什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...

  7. 在线聊天室的实现(2)--基于Netty 4.x的Echo服务器实现

    前言: 就如前文所讲述的, 聊天室往往是最基本的网络编程的学习案例. 本文以WebSocket为底层协议, 实现一个简单的基于web客户端的Echo服务. 服务器采用Netty 4.x来实现, 源于其 ...

  8. 基于Java的在线聊天室

    概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...

  9. 基于 NodeJs 打造 Web 在线聊天室

    Socket.IO 简介与基础环境搭建 任务时间:10min ~ 20min 关于 Socket.IO Socket.IO 可以实现在浏览器和服务器之间实时双向通信,本节课程将详细介绍 Socket. ...

随机推荐

  1. tar备份工具

    一.tar命令的基本格式 在UNIX.Linux系统中,有许多命令可以用于备份数据,其中最常见的命令是tar命令..tar是UNIX和Linux系统中的打包工具,可以将多个文件或目录打包(也称为归档) ...

  2. npm常用命令->nodejs

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  3. C++11实现Qt的信号槽机制

    概述 Qt的信号槽机制是Qt的核心机制,按钮点击的响应.线程间通信等都是通过信号槽来实现的,boost里也有信号槽,但和Qt提供的使用接口很不一样,本文主要是用C++11来实现一个简单的信号槽,该信号 ...

  4. 减肥App计划

    写在前面   最近公司需求不多,正好研究一下 App 瘦身的办法,写了点小总结. 如果你不知道下面几个问题,不妨可以看看文章. 使用 .xcassets 有什么好处? @1x .@2x 和 @3x 会 ...

  5. 快递鸟顺丰电子面单接口API-JAVA

    一.电子面单对接案例 1.接口描述 接口支持的消息接收方式:HTTP POST 请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;cha ...

  6. Blocks 推出矩阵公式。矩阵快速密

    Blocks 设涂到第I块时,颜色A,B都为偶数的数量为ai,一奇一偶的数量为bi,都为奇数为ci,  那么涂到第i+1快时有 a[i+1]=2*a[i]+b[i]+0*c[i]; b[i+1]=2* ...

  7. Linux常用命令速查备忘

    Linux常用命令速查备忘   PS:备忘而已,详细的命令参数说明自己man 一. 启动,关机,登入,登出相关命令 [login] 登录 [logout] 登出 [exit] 登出 [shutdown ...

  8. nodejs的mysql模块学习(五)数据库连接配置之SSL

    SSL选项 在SSL连接选项中需要一个字符串 或者对象 当是字符串的时候 将使用预定义的SSL配置文件 "Amazon RDS" 只有这一个预定义配置文件 用来连接到亚马逊RDS服 ...

  9. [Android 开源项目学习]Android的UITableView(1)

         最近由于项目加急,手里有好多看了差不多的开源项目,其中好多是大家经常用到的.图片的缓存BitmapFun(Android的文档中),AfinalMap,下拉刷新PullToRefresh等等 ...

  10. Delphi数组复制

    const AA : arrary[0..4] of byte =(0,1,2,3,4) var BB : arrary[0..4] of byte; begin BB := AA ;   {这样是错 ...