基于JQuery+JSP的无数据库无刷新多人在线聊天室
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
- <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
- <%@ page import="zy.DealData" %>
- <%
- String action=request.getParameter("action");
- DealData dd=new DealData();
- //用户登录
- if("login".equals(action)){
- String name=request.getParameter("name");
- String pwd=request.getParameter("pwd");
- out.println(dd.userLogin(name,pwd,session,application));
- }
- //获取所有聊天消息
- else if("ChatList".equals(action)){
- String usernameInSession=(String)session.getAttribute("username");
- if(usernameInSession==null){
- out.print("unLogin");
- }else{
- out.print(dd.AllChatList(application));
- }
- }
- //发送消息
- else if("SendContent".equals(action)){
- String content=request.getParameter("content");
- out.println(dd.addContent(content,application,session));
- }
- //获取在线人员列表
- else if("onLineList".equals(action)){
- out.println(dd.GetOnlineUsers(application));
- }
- //下线
- else if("OffLine".equals(action)){
- out.print(dd.OffLine(application,session));
- }
- %>
DealData.java
- package zy;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import javax.servlet.ServletContext;
- import javax.servlet.http.HttpSession;
- public class DealData {
- //用户登录的判读
- public String userLogin(String username,String password,HttpSession session,ServletContext application){
- if("123456".equals(password)){
- //如果密码正确就将用户名放入session
- session.setAttribute("username", username);
- //获取在线用户列表
- List<String> users=(List<String>)application.getAttribute("users");
- if(users==null){
- users=new ArrayList<String>();
- }
- //将当前用户加入用户列表
- users.add(username);
- //更新application中的对象
- application.setAttribute("users", users);
- return "True";
- }else{
- return "False";
- }
- }
- //添加消息
- public String addContent(String content,ServletContext application,HttpSession session){
- List<String> strList=(List<String>) application.getAttribute("MessageList");
- if(strList==null){
- strList=new ArrayList<String>();
- }
- //获取session中的用户名
- String username=(String)session.getAttribute("username");
- //获取时间
- Date date=new Date();
- content=content.replace("<:", "<img src='QQface/");
- content=content.replace(":>", ".gif' />");
- //组装消息
- String message=username+"于"+date.toLocaleString()+"说:"+content;
- //添加到集合中
- strList.add(message);
- //放入application对象中
- application.setAttribute("MessageList", strList);
- return "True";
- }
- //获取所有的消息
- public String AllChatList(ServletContext application){
- StringBuffer sb=new StringBuffer();
- List<String> strList=(List<String>) application.getAttribute("MessageList");
- if(strList!=null){
- for(String s:strList){
- sb.append(s+"<br />");
- }
- }
- return sb.toString();
- }
- //获取在线用户列表
- public String GetOnlineUsers(ServletContext application){
- StringBuffer sb=new StringBuffer();
- List<String> strList=(List<String>) application.getAttribute("users");
- if(strList!=null){
- for(String s:strList){
- sb.append(s+"<br />");
- }
- }
- return sb.toString();
- }
- //下线
- public String OffLine(ServletContext application,HttpSession session){
- //先取出用户名
- String username=(String)session.getAttribute("username");
- //移除session中的内容
- session.removeAttribute("username");
- //移除用户列表中的用户名
- List<String> strList=(List<String>) application.getAttribute("users");
- if(strList!=null){
- strList.remove(username);
- }
- return "True";
- }
- }
接下来是客户端的实现,主要是用到了JQuery的Ajax功能来实现无刷新获取数据(此处只列出Ajax函数,具体源代码请自行下载查看):
Index.jsp用户登录的Ajax实现:
- <script language="javascript" type="text/javascript">
- $(function(){
- $("#login").click(function(){
- var $name=$("#txtName").val();
- var $pwd=$("#txtPwd").val();
- UserLogin($name,$pwd);
- $("#spnMsg").html("正在登录...").show().css({"top":"20%","left":"50%"});
- });
- function UserLogin(name,pwd){
- $.ajax({
- type:"POST",
- url:"DealData.jsp",
- data:"action=login&d="+new Date()+"&name="+name+"&pwd="+pwd,
- success:function(data){
- if(data.indexOf("True")>0){
- window.location="ChatMain.html";
- }else{
- alert("用户名或者密码错误");
- $("#spnMsg").hide();
- return false;
- }
- }
- });
- }
- });
- </script>
ChatMain.html聊天室主界面的实现
- <script language="javascript" type="text/javascript">
- $(function(){
- //键盘监听
- $(document).keypress(function(e){
- if(e.which==13){
- SendContent($("#txtContent").val());
- goToBottom();
- }
- });
- //读取消息
- GetMessageList();
- //读取在线用户
- GetOnlineUsers();
- //初始化表情
- InitFaces();
- //自动刷新
- AutoRefresh();
- //发送按钮事件响应
- $("#Button1").click(function(){
- var $content=$("#txtContent");
- if($content.val()!=""){
- SendContent($content.val());
- }else{
- alert("发送内容不能为空!");
- return false;
- }
- });
- $("#Button2").click(function(){
- if(confirm("确认下线?")){
- OffLine();
- }
- });
- //发送消息
- function SendContent(content){
- $.ajax({
- type:"POST",
- url:"DealData.jsp",
- data:"action=SendContent&d="+new Date()+"&content="+content,
- success:function(data){
- if(data.indexOf("True")){
- //获取消息
- GetMessageList();
- //清空发送框
- $("#txtContent").val("");
- goToBottom();
- //alert('shit for SendMessage');
- }else{
- alert("发送失败");
- }
- }
- });
- }
- //获取消息
- function GetMessageList(){
- $.ajax({
- type:"POST",
- url:"DealData.jsp",
- data:"action=ChatList&d="+new Date(),
- success:function(data){
- if(data.indexOf("unLogin")>0){
- alert("非法进入,请先登录!");
- window.location="index.html";
- }else{
- $("#divContent").html(data);
- }
- //alert('shit for GetMessage');
- }
- });
- }
- //获取在线用户列表
- function GetOnlineUsers(){
- $.ajax({
- type:"POST",
- url:"DealData.jsp",
- data:"action=onLineList&d="+new Date(),
- success:function(data){
- $("#divOnline").html(data);
- //alert('shit for GetOnlineUsers');
- }
- });
- }
- //设置表情
- function InitFaces(){
- var strHTML="";
- for(var i=1;i<=7;i++){
- strHTML+="<img src='QQface/"+i+".gif' id='"+i+"'/>";
- }
- $("#divFace").html(strHTML);
- }
- //图片监听
- $("table tbody tr td img").click(function(){
- var $txtContent=$("#txtContent");
- if($txtContent.val()!=undefined){
- var strContent=$txtContent.val()+"<:"+this.id+":>";
- }else{
- var strContent="<:"+this.id+":>";
- }
- $("#txtContent").val(strContent);
- });
- //下线
- function OffLine(){
- $.ajax({
- type:"POST",
- url:"DealData.jsp",
- data:"action=OffLine&d="+new Date(),
- success:function(data){
- if(data.indexOf("True")>0){
- alert("成功下线!");
- window.location="index.html";
- }
- //alert('shit for GetOnlineUsers');
- }
- });
- }
- //到底部去
- function goToBottom(){
- div=document.getElementById("divContent");
- .scrollTop = div.scrollHeight;
- }
- //自动更新页面信息
- function AutoRefresh(){
- setInterval(GetMessageList,2000);
- setInterval(GetOnlineUsers,4000);
- }
- });
- </script>
基于JQuery+JSP的无数据库无刷新多人在线聊天室的更多相关文章
- 基于Server-Sent Event的简单在线聊天室
Web即时通信 所谓Web即时通信,就是说我们可以通过一种机制在网页上立即通知用户一件事情的发生,是不需要用户刷新网页的.Web即时通信的用途有很多,比如实时聊天,即时推送等.如当我们在登陆浏览知乎时 ...
- 三、jQuery--jQuery基础--jQuery基础课程--第12章 jQuery在线聊天室
在线聊天室案例 一.功能简介: 1.用户需要登录后才能进入聊天室交流 2.已无刷新的方式,动态展示交流后的内容和在线人员的基本信息 3.登录后的用户可以提交文字和表情图标 技术重点:利用ajax的无刷 ...
- 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。
基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...
- Ajax PHP JavaScript MySQL实现简易的无刷新在线聊天室
思路 消息显示区 发消息 板块 消息显示 消息发送 优化 显示非重复性的数据 优化显示 加上滚动条 每次都显示最新消息 完整代码 前端代码 数据库表结构 服务器端代码 总结与展望 总结 展望 为更好的 ...
- Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...
- .NET Core 基于Websocket的在线聊天室
什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...
- 在线聊天室的实现(2)--基于Netty 4.x的Echo服务器实现
前言: 就如前文所讲述的, 聊天室往往是最基本的网络编程的学习案例. 本文以WebSocket为底层协议, 实现一个简单的基于web客户端的Echo服务. 服务器采用Netty 4.x来实现, 源于其 ...
- 基于Java的在线聊天室
概述 Java socket编程,实现一个在线聊天室, 实现在线用户群聊,私聊,发送文件等功能. 详细 代码下载:http://www.demodashi.com/demo/13623.html 一. ...
- 基于 NodeJs 打造 Web 在线聊天室
Socket.IO 简介与基础环境搭建 任务时间:10min ~ 20min 关于 Socket.IO Socket.IO 可以实现在浏览器和服务器之间实时双向通信,本节课程将详细介绍 Socket. ...
随机推荐
- [原创]-IIS7.5优化,支持同时10万个请求
背景: IIS7.5是微软推出的最新平台IIS,性能也较以前有很大的提升,但是默认的设置配不适合很大的请求.但是我们可以根据实际的需要进行IIS调整,使其性能更佳,支持同时10万个请求. ...
- Trace、Debug和TraceSource的使用以及日志设计 .
[-] Trace 和 Debug区别 什么是Listeners 跟踪开关 使用BooleanSwitch开关 使用TraceSwitch开关 使用TraceSource代替Trace和Debug 设 ...
- C#实现ByteBuffer类 .
在写网络程序的时候,经常需要往一个数组里面压数据或者取数据,而Java中再Java.nio中有个ByteBuffer能很方便的实现,Delphi中也有个Stream类有着同样的功能,这里我就模仿JAV ...
- Ubuntu下安装FTP服务及使用(VSFTPD详细设置)(二)
vsftpd 作为一个主打安全的FTP服务器,有很多的选项设置.下面介绍了vsftpd的配置文件列表,而所有的配置都是基于vsftpd.conf这个配置文件 的.本文将提供完整的vsftpd.conf ...
- 如何保护你的linux操作系统
如何保护你的linux操作系统 导读 在现在这个世道中,Linux操作系统的安全是十分重要的.但是,你得知道怎么干.一个简单反恶意程序软件是远远不够的,你需要采取其它措施来协同工作.那么试试下面这些手 ...
- DOS攻击之详解--转载
源地址没有找到,间接引用地址:http://wushank.blog.51cto.com/3489095/1156004 DoS到底是什么?接触PC机较早的同志会直接想到微软磁盘操作系统的DOS--D ...
- js中数组操作
var selectedCodeArray = []; var num = $.inArray(值, selectedCodeArray) //值在数组中的位置 selectedCodeArray. ...
- NET开发必备工具之-LINQPad
第一步,下载:http://www.linqpad.net/ 第二步,安装 第三步,打开LINQPad 第四步,添加链接 第五步,输入SQL Server,用户名,密码 第六步,点击OK,成功链接 第 ...
- 小白日记52:kali渗透测试之Web渗透-HTTPS攻击(Openssl、sslscan、sslyze、检查SSL的网站)
HTTPS攻击 全站HTTPS正策划稿那位潮流趋势 如:百度.阿里 HTTPS的作用 CIA 解决的是信息传输过程中数据被篡改.窃取 [从中注入恶意代码,多为链路劫持] 加密:对称.非对称.单向 HT ...
- JSON3-翻译(不当之处,请指正)
http://bestiejs.github.io/json3/JSON 3 显示了两个功能:stringify():序列化一个javaScript值为一个JSON,和parse():将一个json字 ...