基于JQuery+JSP的无数据库无刷新多人在线聊天室

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

主界面:

[img]http://dl.iteye.com/upload/attachment/0074/0427/978363d8-d066-373e-9ec9-a2e7c386f7cf.png[/img]

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

[url=http://dl.iteye.com/topics/download/a551c7d4-fb5d-33d6-a1b3-a9bd1d23cf42]基于JQuery+JSP的无数据库无刷新多人在线聊天室源代码下载(MyEclipse开发环境下导出的项目包)[/url]

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

[b]服务端:[/b]

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

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

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

项目文件结构:

[img]http://dl.iteye.com/upload/attachment/0074/0433/28cc2214-194d-3708-bacf-8a78aff52ff3.png[/img]


服务端的源代码

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");
div.scrollTop = div.scrollHeight;
}
//自动更新页面信息
function AutoRefresh(){
setInterval(GetMessageList,2000);
setInterval(GetOnlineUsers,4000);
}
});
</script>
PK利剑:14kb大小、单文件、纯缓存、无需任何数据库、实现踢人、审核发言、普通/VIP1/VIP2/管理员等多角色发言功能,支持框架入任何网页中操作。 测试体验步骤: 1、解压缩系统压缩包,得到Default.asp文件; 2、复制这个文件到有效的IIS目录中,在IE中输入地址访问; 3、或到阿赛工作室官网下载阿赛IIS服务器[http://77ya.com/Down/Show28.html],和Default.asp放在同个文件夹下面,双击Asai.exe运行即可; 4、打开系统,第一步从底部[匿名39371896 取名为]取个名字,点击[登录],跳转到发言窗口,输入内容即可聊天; 5、在聊天窗口中,输入一些自己规定的特殊字符即可进入管理功能,以系统默认特殊字符为例; 6、输入77yavipn或77yavipm可以成为VIP会员,发言时名字带颜色,特别醒目; 7、输入gun或ting可以控制屏幕滚动与停止; 8、输入77ya可以将自己变为管理员,接着输入guanli可进入管理员管理界面提供以下几个管理员工具:管理用户 | 审核内容 | 查看发言 | 返回发言 | 复位; 9、点击管理用户,打开用户列表页面,单击某个用户名,即可将某个用户踢出聊天室(用户列表显示的是用户编号,用户编号可以在聊天发言窗口,鼠标停放在发言用户的名字上时候,显示用户编号); 10、点击审核内容,打开发言审核功能,这个功能在您开启发言审核时才有作用; 11、点击复位,将清空所有留言内容,删除所有用户,聊天室变为初始状态,此功能可以快速清空聊天室所有内容; 主要功能及使用说明: 1、支持系统自动清理聊天记录; 2、支持管理员功能,在发言框中输入管理密钥即可进入管理模块; 3、管理员可以审核聊天内容; 4、管理员可以踢人(将某一聊天的会员加入黑名单),禁止发言; 5、支持自动审核显示功能与人工审核功能两种模式; 6、支持游客、普通用户、VIP用户、黄金VIP用户、管理员五种角色参与; 7、游客可以看到聊天内容; 8、普通用户发表聊天内容需要管理员审核才能显示,也可以设置为自动显示; 9、VIP用户发表聊天内容需要管理员审核才能显示,也可以设置为自动显示,名字的颜色和普通用户不一样; 10、黄金VIP用户可以直接发言,无需管理员审核就可显示,并且名字的颜色也有所不同; 11、管理员可以执行审核聊天内容,禁止某一用户发言的功能; 12、每个用户打开系统后自动获得一个编号,所有用户的编号都将在管理员的用户管理中显示,管理员可以通过点击用户编号直接禁止某人发言; 13、每个发言的用户都可以自己更改名字,发言时,编号会显示在名字上面,鼠标放在名字上就显示出该用户的编号,类似QQ号一样唯一; 14、增加超级复位功能,可以清空所有缓存数据,重启聊天系统,不需服务器支持; 15、加入SQL注入过滤功能,安全可靠; 16、支持自动向上滚屏显示,兼顾QQ用户的聊天模式,同时可以通过输入滚屏、停止滚屏密钥自由控制聊天窗口内容显示方式; 17、支持在一个空间上放置多个阿赛聊天系统,只需修改聊天系统标识即可; 18、正在的无刷新聊天显示方式,观感舒服; 19、只有一个文件,喜欢怎么移植都可以,兼容所有其他网站系统,不需要任何数据库支持,全缓存模式,高速、安全、可靠; 20、使用前请打开程序文件,修改前20行的内容,如何修改,都做了非常详细的说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值