本人最近在学习一个javaweb聊天项目,在这个项目中所要实现的功能比较简单:实现登陆之后可以在里面进行选择对象进行聊天,在线人数和在线人员名称都可以即时显示,信息message可以时时更新在每一个登录页面中,管理员admin具有把普通用户user踢下线的功能,而自己刚刚整合了SSM(struts+spring+mybatis)框架,并且通过maven进行jar包管理,在这里虽说不能很好体现框架的优势,但也是麻雀虽小五脏俱全。下图是项目后台的文件列表:

在这里,通过定义的监听器Mylistener使其在项目初始化的时候便声明一个Map,放在application中,用于在用户登录时保存用户相关信息,在管理员将用户踢下线的时候将Map中相对应的session的 invalidate()销毁并通过map.remove()清除即可,以下放在webchartAction中登录功能login()代码:

public String login() throwsIOException{

List list=new ArrayList();

String username=request.getParameter("username");

String password=request.getParameter("password");

user user=newuser();

user.setPassword(password);

user.setUsername(username);

session.setAttribute("username", username);

list=userService.login(user);

String message="";if (null!=application.getAttribute("message")) {

message=application.getAttribute("message")

.toString();

}

System.out.println(username+"进来了");

String i=username ;

Map userMap=(Map) application.getAttribute("userMap");if(list.size()>0){

String kk=list.get(0).getType();

session.setAttribute("type", kk);//判断list.get(0),即当前登录用户是否已经登录,若已经登录则不增加在线人数,并且不再重新保存session

if (userMap.containsKey(list.get(0))!=true) {

userMap.put(list.get(0), session);

application.setAttribute("userMap", userMap);//记录在线人数

int j=userMap.entrySet().size();

application.setAttribute("mapcount",j);

}

message+= "系统公告:"

+ user.getUsername() + "走进了聊天室!
";

application.setAttribute("message", message);return "login_success";

}else

return "login_fail";

}

管理员踢下线功能代码:

public String kick() throwsIOException{//1.接收参数

System.out.println("管理员要踢人啦");

String username= request.getParameter("username");

List list=userService.queryUserList(username);

user user1=list.get(0);

System.out.println(user1);//2.踢人:从userMap中将用户对应的session销毁.//获得userMap集合(在线列表)

Map userMap = (Map)application.getAttribute("userMap");//获得这个用户对应的session.如何知道是哪个用户呢? id已经传递过来.去数据库中查询.//重写user的equals 和 hashCode 方法 那么只要用户的id相同就认为是同一个用户//从map集合中获得用户的对应的session

HttpSession session =userMap.get(user1);//销毁session

session.invalidate();//从usermap中将此用户删除

userMap.remove(user1);//刷新在线人数

int j=userMap.entrySet().size();

application.setAttribute("mapcount",j);//通过跳转到登录界面

return "login_success";

}

下图是前端的文件列表

以下是前端聊天界面的javascript中的代码

var sysBBS = "欢迎光临心之语聊天室,请遵守聊天室规则,不要使用不文明用语。";

window.setInterval("showContent();",1000);

window.setInterval("showOnLine();",1000);

window.setInterval("check();",1000);//相当于window.onload

$(function(){

showOnLine();

showContent();

check();

});functioncheck(){

$.post("/webchart/webchart_check.action",function(data){if(data == 1){//提示用户下线了

alert("用户已经被踢下线了!");//回到登录页面!通过action跳转

window.location="webchart_loginfails.action";

}

});

}//显示在线人员列表

functionshowOnLine(){//异步发送请求 获取在线人员列表

//Jquery发送异步请求

$.post("/online.jsp?"+new Date().getTime(),function(data){//$("#online") == document.getElementById("online");

$("#online").html(data);

});

}//显示聊天的内容

functionshowContent(){

$.post("/webchart/webchart_getMessage.action",function(data){

$("#content").html(sysBBS+data);

});

}function set(selectPerson){ //自动添加聊天对象

if(selectPerson != ""){

form1.to.value=selectPerson;

}else{

alert("请重新选择聊天对象!");

}

}functionsend(){if(form1.to.value==""){

alert("请选择聊天对象!");return false;

}if(form1.content.value==""){

alert("发送信息不可以为空!");

form1.content.focus();return false;

}//$("#form1").serialize():让表单中所有的元素都提交.

//jquery提交数据.{id:1,name:aa,age:25}

$.post("/webchart/webchart_sendMessage.action",$("#form1").serialize(),function(data){

$("#content").html(sysBBS+data+"哈哈"+"");

});

}functionexit(){

alert("欢迎您下次光临!");

window.location.href="/index.jsp";

}functioncheckScrollScreen(){if(!$("#scrollScreen").attr("checked")){

$("#content").css("overflow","scroll");

}else{

$("#content").css("overflow","hidden");//当聊天信息超过一屏时,设置最先发送的聊天信息不显示

//alert($("#content").height());

$("#content").scrollTop($("#content").height()*2);

}

setTimeout('checkScrollScreen()',500);

}

在上面的代码中,window.setInterval()是保证页面在一定时间间隔内自动刷新,这样保证信息的及时显现,id为“content”的便是信息sysBBS+message展示页面;

以下代码是online.jsp中的table代码,用于展现现在人员的信息,并且通过判断用户的type是否为admin来决定是否可以出现踢下线的功能;

在这个项目中,因为刚开始做这些小项目,我遇到的问题有很多,列出几条:

信息及时刷新问题,虽说通过window.setInterval()解决了,但是总感觉这样比较浪费资源,不知道是否可以有更好的办法去解决这个问题;

Map中的键值对获取问题,通过这个可以保存登陆者的很多信息,包括session,但是在编码的时候发现获取了user,也就是sessionid,但是却不能获取相对应的session,后来通过百度查资料才发现需要重写实体类中的tostring()和Hascode()方法,不然读取的session一直为空,这样在销毁的时候就会报错。

在这个项目中,前期一直用火狐浏览器进行测试,后来在判断用户类型是否为admin而可以有踢下线的功能的时候,在同一个浏览器中的session一直被最近一个登录者的session刷新,导致判断的用户type一直是显示最近登陆的用户type,当用两个不同浏览器登陆的时候,这个问题就得到了解决,管理员可以删除普通用户,而普通用户不可以,我猜测这应该是session共享问题,在同一台机器的同一个浏览器测试不同登录人员登录同一个项目,之前的session会被后者登录所用的session给冲掉,这个问题需要注意;

首次发博客,内容表述不够严谨,如果所讲述内容有二解,望能共同探讨;

java web聊天室私聊map_javaweb聊天小项目相关推荐

  1. java实现多人聊天室+私聊+Derby数据库

    java实现多人聊天室+私聊+Derby数据库(没有实现注册功能) 这个聊天室困扰了我好久好久,一步一步的修改,终于不负我的努力啊,可算完成了,对于一个初学java的来说,完成第一个比较完整的项目,也 ...

  2. 基于SSM的Web网页聊天室系统设计与实现 毕业论文+项目源码及数据库文件、

    下载地址:https://download.csdn.net/download/ouyangxiaobai123/22679732 项目介绍: 基于SSM的Web网页聊天室系统设计与实现 毕业论文+项 ...

  3. 网络编程基础_5.3聊天室-多人聊天室

    聊天室-多人聊天室 #include <stdio.h>// 1. 包含必要的头文件和库, 必须位于 windows之前 #include <WinSock2.h> #prag ...

  4. IM即时通信多房间聊天室仿微信聊天(二)

    IM即时通信多房间聊天室仿微信聊天(服务器自定义处理客户端消息) 在IM即时通信多房间聊天室仿微信聊天(一)中我们已经搭建了基本的通信架构,接下来重点就是如何在自己的后台接收并处理客户端用户的消息了 ...

  5. IM即时通信多房间聊天室仿微信聊天(四)

    聊天记录的保存和展示 IM即时通信多房间聊天室仿微信聊天(一) IM即时通信多房间聊天室仿微信聊天(二) IM即时通信多房间聊天室仿微信聊天(三) 聊天消息的保存我们直接在服务端接收到客户端发送的消息 ...

  6. 基于JavaSwing开发聊天室(QQ聊天 群聊)系统+论文+PPT 大作业 毕业设计项目源码

    基于JavaSwing开发聊天室(QQ聊天 群聊)系统+论文+PPT(毕业设计/大作业) 开发环境: Windows操作系统 开发工具: Eclipse/Myeclipse+Jdk 演示视频: jav ...

  7. Java web 2022跟学尚硅谷书城项目完整开源分享

    Java web 2022跟学尚硅谷书城项目完整开源分享 项目介绍 项目类图 sql建表和添加数据 界面展示 用户登录界面 用户注册界面 首页 添加购物车 我的购物车 我的订单 功能说明 项目介绍 跟 ...

  8. java 简单的聊天室_Java简单聊天室

    实现Java简单的聊天室 所用主要知识:多线程+网络编程 效果如下图 /** * * @author Administrator * *简单的多人聊天系统--重点:同时性,异步性 *1.客户端:发送消 ...

  9. java聊天室代码_java聊天室的实现代码

    本文实例为大家分享了java实现聊天室的具体代码,供大家参考,具体内容如下 聊天室界面: 源码: public class ClientFrame extends Frame { private Te ...

  10. 聊天室私聊php代码,window_聊天室实现私聊(三),聊天室程序是一个application和se - phpStudy...

    聊天室实现私聊(三) 聊天室程序是一个application和session对象结合性很强的asp程序.首先,它比较具有实时性,聊天速度太慢,那么没有人会喜欢的,而且在多人同时发言的时侯,如果程序处理 ...

最新文章

  1. 嵌入式linux应用程序升级,基于嵌入式Linux平台的应用升级机制的研究与设计
  2. SAP MM 初阶之不常用事务代码MEBV
  3. mysql构建镜像时写入密码_用Dockerfile手动创建mysql5.7主从镜像
  4. 2016.07.17-18 集合方法
  5. spring boot 带远程调试启动方式
  6. IP头TCP头的checksum校验和计算
  7. 使用CXF实现Webservice的服务接口提供以及相关的客户端实现
  8. ROS 摄像头校准与Apriltag标签使用
  9. Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
  10. 常见Http Method有哪些
  11. 银行加息有什么影响(央行加息,对股市和房价有何影响?)
  12. 生活不易!一个月薪 12000 的北京程序员的真实生活 !
  13. 叮咚~您的新年礼物到啦,请查收:虎来喽----Python打造虎年祝福神器
  14. 采购招标系统源码 一站式全流程采购招标系统
  15. 学习discovery studio对对接结果进行分析
  16. Java总结 - 抽象类与接口 1
  17. Solr分词后,如何实现多个关键字完全匹配
  18. android studio 配置HTTP proxy
  19. 美国Sonicwall 防火墙×××视频教程
  20. 科研试剂供应1476737-97-9,Bis-PEG2-endo-BCN可发生点击反应

热门文章

  1. 锐浪报表 Grid++Report 子报表 Delphi
  2. 惠普179fnw打印机使用说明_惠普179fnw驱动下载
  3. springboot 整合redis配置文件
  4. 修改 Apple ID 的国籍
  5. 狗都能看懂的Pytorch MAML代码详解
  6. PHP开票接口,云增值税发票API详情
  7. Webhacking.kr writeup(更新至challenge 29)
  8. 项目文档编制-投标书
  9. MATLABR2018自学一本通笔记
  10. python 音频格式转换