WEB网络聊天室重制版

标签: java

聊天室

一个简易的聊天室系统

项目简介

该项目是我自己做的一个项目的重置版,原来是用原生的servlet搭的,原博客连接在这里:

web网络聊天室

现在这个是用ssm框架重新搭建的,使用了原来前端的页面,对原来的一些代码进行了一些封装,重要的类还有配置文件交给Spring进行统一管理,使得代码更加整洁,dao层由mybatis这个半自动框架构成,前后端的数据交互由SpringMVC强大的参数绑定机制完成。

该聊天室系统包含了以下功能:用户的登陆与注册、注册前判断该用户是否存在、检查两次输入的密码是否相同、多人聊天、脏话过滤、页面超出滚动、管理员t人下线、多人操作电子白板以及音视频聊天(未完成)等。

项目技术:

前端:JSP、BootStrap以及JQuery

后端:SpringMVC负责view层的数据展示以及数据封装、Spring负责service层对数据的进一步封装以及与dao层的交互、Mybatis做数据访问层控制、数据库使用MySQL、缓存使用redis

项目管理工具 :Maven

整个项目还未挂在阿里云上,有一些地址跳转的问题还未解决,项目容器即服务器采用Tomcat。

项目设计以及实现上的几个点

1、项目使用了JSP作为前端页面的展示,因为JSP内置的域对象能很容易的拿出存在域对象里面的值。页面部分使用了BootStrap来做页面的优化,结合JQuery完成功能控制,另外,还使用了SSE(服务端推送技术)来完成数据的交互,SSE支持长轮询,建立一个HTTP不会立即关闭,而且如果有后端有响应会立即返回,使得不会想ajax一直做短轮询,会增加服务器的负担,使得页面很卡。

2、后端部分,ssm的纯注解配置,这个没有什么好说的,与redis数据库的交互,将电子白板的图层信息存到redis中的list集合中,每次要使用的时候就将集合中的第一个元素删除并取出,使用sse(再返回的Header中要设置‘event-stream;charset=UTF-8’,经过测试,火狐浏览器不声明字节码类型没问题,但是谷歌浏览器会出现字节码不符的问题,进而无法解析数据)返回给浏览器,由浏览器进行解析

3、数据库使用的MySQL,对于数据访问操作的编码上,使用了Mybatis来与数据库进行交互,通过ORM映射,只需要编写SQL语句,Mybatis会会自动帮我们封装到对应的实体类中。

项目展示

1.登陆界面
在这里插入图片描述
2.注册界面
在这里插入图片描述
3.聊天界面
在这里插入图片描述
页面超出滚动以及脏话过滤
在这里插入图片描述
电子白板
在这里插入图片描述

项目详述

  • 版本参数
技术 版本号及相关信息
JDK 1.8
Maven 3.5
Spring 5.2.0.RELEASE
SpringMVC 5.2.0. RELEASE
Mybatis 3.5.3
Tomacat 9.2.0.27
MySQL 8.0.17
Redis 2.7.3
C3p0 0.9.5.4
  • 项目中遇到的一些问题
    1、session的绑定与销毁
     为了要监听用户的session,我创建了一个监听类,实现HttpSessionBindingListener接口来监听session
    在这里插入图片描述
    重写ValueBound方法,当有新的用户session生成时,将session存入放在域对象里面的map里面
    在这里插入图片描述
    session的销毁
    本来是重写valueUnbound方法来执行销毁操作,但是后来发现这个方法没有办法在里面进行当前session的销毁,所以就放弃了,改成直接在用户的控制器里面写一个退出方法,当用户执行退出操作的时候,发送一个请求到这个方法,删除掉当前用户的session。

2、SpringMVC的前端控制器
本来,整个前端页面是想用html来写的,但是取值又是一个很麻烦的问题,所以就改成了部分html,部分jsp来写,但是,在配置前端控制器的跳转路径时,发现配置了html文件,却没有办法访问jsp文件,配置jsp文件无法访问html文件的现象,后来在网上也没有找到想要的答案,所以就改成纯jsp页面来编写

3、电子画板的编写
一开始不知道html5中有canvas画板这个东西,想着通过鼠标事件来获取鼠标在页面上的坐标,传回后端去然后在后端生成图片返回,最后因为各种原因失败了,后来发现html5有canvas画板支持在页面上操作,就简单很多了。

4、ajax传数组给后端接收
这个。。纯属是我SpringMVC的基础不够扎实,不知道SpringMVC的参数绑定是如此强大,只要在@RequestParams中声明传过来的参数是个数组就行,然后用对应的数组接收。

5、从redis中提取图层信息,传输回前端
这里就用刚开始我提到的sse技术了,但是一开始我为了实现两个浏览器上的页面能够同步,在页面写了一个定时器,每三秒发送一个ajax请求从后端拿数据,但是这样在一两分钟之后,服务器和浏览器都顶不住我这样消耗资源,后来了解到sse技术,改为sse进行HTTP长轮询来获取后端技术之后,解决服务器和浏览器的压力问题,值得注意的是,sse只能是单向的,只能是由服务器向浏览器传输数据,而且传输的数据只能是文本格式,不像webSocket那样支持二进制传输。

版权声明:本文为WXZCYQ原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WXZCYQ/article/details/103543052

智能推荐

Tornado day02

一,项目模板: Tornado的项目也可以像Django和flask一样,将功能细分为几个模块 1.1 _ _ init _ _.py 1.2 setting .py 1.3 urls .py 1.4 views .py 1.5 manage .py 将这个模板拷贝下来,以后创建新项目的时候可以直接拷贝一份,在此模板上修改使用 文件链接 链接:https://pan.baidu.com/s/11E...

PAT乙级 | 1095 解码PAT准考证 (25分)(做题过程+注意事项+运行超时解决方法)

PAT 准考证号由 4 部分组成: 第 1 位是级别,即 T 代表顶级;A 代表甲级;B 代表乙级; 第 2~4 位是考场编号,范围从 101 到 999; 第 5~10 位是考试日期,格式为年、月、日顺次各占 2 位; 最后 11~13 位是考生编号,范围从 000 到 999。 现给定一系列考生的准考证号和他们的成绩,请你按照要求输出各种统计信息。 输入格式: 输入首先在一行中给出两个正整数 ...

谈谈Java异常

0 概述 对于java工程师来说,是经常和异常打交道的,本文主要来谈一谈java中的异常。 1 异常类的继承关系 从下图(说明:图中只是列出部分异常类)可以看出: 异常的基类为Throwable,主要分为两个分支,即Error体系和Exception体系。 Exception下面分为RuntimeException和非RuntimeException(如IOException) 2 几种异常的区别...

通过设立FatFS隐藏分区,实现系统文件和用户文件的隔离

嘛。。这是一个关于个人使用FatFS文件系统的 一点小的经验。 我知道大家都会百度和谷歌,关于文件系统有什么用,文件系统怎么移植上自己的平台,看看资料也就懂了,在这里不再详述( 打字太慢一分钟50-60字懒得写)。本系列默认已经可以将设备模拟成u盘,并且已经通过修改diskio.c,可以实现ff.c中的各项功能( 不能实现的自行面壁)。FatFS项目官网 http://elm-chan.org/f...

Mysql之锁与事务知识要点小结

Mysql之锁与事务 平时的业务中,顶多也就是写写简单的sql,连事务都用的少,对锁这一块的了解就更加欠缺了,之前一个大神分享了下mysql的事务隔离级别,感觉挺有意思的,正好发现一个很棒的博文,然后也收集了一些相关知识,正好来学习下,mysql中锁与事务的神秘面纱,主要内容包括 共享锁和排它锁的区别以及适合范围 mysql的表锁和行锁的区别 怎么判断一个sql是否执行了锁,执行的是表锁还是行锁 ...

猜你喜欢

响应式图片二 通过srcset实现

具体方法如下: srcset=”图片地址+空格+尺寸描述符,图片地址+空格+尺寸描述符,图片地址+空格+尺寸描述符….” 浏览器会当前浏览的环境进行感知,这个感知包括网速、界面分辨率、DPR(屏幕像素比)等等,然后在图片中选择一个进行加载。 实际上,在相同DPR下,浏览器会根据屏幕的分辨率加载图片,但是加载了大的图片后再缩小还是会使用大的图片。综合考虑的算法非...

Training_model(2)

已经清洗处理了两个数据文件: application_{train|test}.csv :客户详细信息 bureau.csv : 客户历史信用报告 下面对这两个数据中的特征进行合并,然后Light Gradient Boosting Machine训练模型,之前只用客户数据的预测评分结果是0.734,这次加入了客户信用报告信息 load data 新增加了客户历史信用记录 Build Model ...

微信小程序 页面跳转(传参跟不传参)

跳转页面传参 1.首先我的目录结构是这样的,并在 cinema.wxml 定义了一个点击事件 bindtap=‘indetai’ 2.然后在 cinema.js 的data里面定义了一个 score,并实现了 indetai 方法 3.在 detai.js 的 data 里面也定义一个 score ,再在 onLoad 函数里面接收传递过来的值 4.在页面上显示得到的值 这...

JavaSE 10(二维数组)

前言:      在经历了血雨腥风的地狱模式后本以为迎来了学习的平静,但二维数组又打破了这难得的平静!!!二维数组在java编程中同样也是很重要的知识点,因此在这里我将整理二维数组的知识点与重点,以及习题,便于自己的复习与巩固。 二维数组的声明与创建: 下面是声明二维数组的语法: 数据类型[][]数组名 : 数据类型数组名[][]; (允许这种方式 ,但并不推荐使用它...

深入理解 Linux 内存机制!| 技术头条

作者 | 阿文 责编 | 郭芮 作为一名Linux 系统运维工程,在日常管理 Linux 的时候,我们经常发现系统的空闲内存差不多总是被用完了。   通常,我们可以通过 top 和 free 查看内存使用情况:     执行 free:     为了更人性化地显示,我们可以加上 -h 选项:       可以看到我们的...