聊天室--javaWeb

2023-11-10

一、简介:

项目说明:

一个简易的javaWeb聊天室

实现的主要功能:

1、单点登录
2、聊天
3、权限分层(管理员有踢人权限)

系统架构:

Servlet+JSP+JavaBean+JDBC

二、项目代码和demo地址

项目代码:

代码链接:https://pan.baidu.com/s/1loCBLmyP8FklWKc4dx2HVg
提取码:xeti

项目demo地址:

点此访问聊天室demo

登录账户:
用户名:aaa,密码:aaa
用户名:bbb,密码:bbb
用户名:ccc,密码:ccc
。。。。。。(以此类推)

三、具体的功能实现:

登录功能:

1、创建实体类User
2、UserServlet处理数据,封装接收到的数据并调用Service层处理数据
3、Service层调用UserDao的登录方法
4、UserDao层定义方法接口。UserDaoImple为实现类,实现登录方法。

单点登录:

1、用一个map集合存储在线人员列表
2、注册一个监听器监听ServletContext对象创建和销毁

public class MyServletContextListener implements ServletContextListener{
	public void contextInitialized(ServletContextEvent sce) {
		Map<User,HttpSession> userMap = new HashMap<User,HttpSession>();
		sce.getServletContext().setAttribute("userMap", userMap);
	}
	public void contextDestroyed(ServletContextEvent sce) {
		
	}
}

3、在web.xml中注册监听器

<listener>
	<listener-class>com.listener.MyServletContextListener</listener-class>
</listener>

4、用户第二次登录的时候先判断map中中是否已存储该用户,若存在就销毁其对应的session
在这里插入图片描述

聊天功能的实现:

1、前端send方法发送用户输入的内容

function send(){
	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("${pageContext.request.contextPath}/user?"+new Date().getTime(),$("#form1").serialize(),function(data){
		$("#content").html(sysBBS + data + "</span>");
	});
}

2、将输入内容在servlet层处理成前端可展示的页面属性

public String sendMessage(HttpServletRequest req,HttpServletResponse resp) throws IOException{
	// 1.接收数据 。
	System.out.println("sendMessage invoke....");
	String from = req.getParameter("from"); // 发言人
	String face = req.getParameter("face"); // 表情
	String to = req.getParameter("to"); // 接收者
	String color = req.getParameter("color"); // 字体颜色
	String content = req.getParameter("content"); // 发言内容
	String sendTime = new Date().toLocaleString(); // 发言时间
	// 获得ServletContext对象.
	ServletContext application = getServletContext();
	//  从ServletContext中获取消息
	String sourceMessage = (String) application.getAttribute("message");
	// 拼接发言的内容:xx 对 yy 说 xxx
	sourceMessage += "<font color='blue'><strong>" + from
			+ "</strong></font><font color='#CC0000'>" + face
			+ "</font>对<font color='green'>[" + to + "]</font>说:"
			+ "<font color='" + color + "'>" + content + "</font>("
			+ sendTime + ")<br>";
	// 将消息存入到application的范围
	application.setAttribute("message", sourceMessage);
	return getMessage(req, resp);
}

3、前端接收到servlet处理后的元素展示

踢人功能(简单的分权限)

1、前端确认用户身份是否为管理员,若是管理员则显示踢人按钮

    	<c:if test="${ existUser.type == 'admin' and entry.key.type != 'admin'}">
			<a href="${ pageContext.request.contextPath }/user?method=kick&id=${ entry.key.id }">踢下线</a>
		</c:if>

2、在UserServlet中写管理员踢人的方法,逻辑如下
1.接收参数
2.踢人:获得userMap集合,从userMap中将用户对应的session销毁.
3.重定向

该方法大致代码:

	public String kick(HttpServletRequest req,HttpServletResponse resp) throws IOException{
		// 1.接收参数
		int id = Integer.parseInt(req.getParameter("id"));
		// 2.踢人:从userMap中将用户对应的session销毁.
		// 获得userMap集合(在线列表)
		Map<User, HttpSession> userMap = (Map<User, HttpSession>) getServletContext()
				.getAttribute("userMap");
		// 根据这个用户对应的session得到相应id,再去数据库中查询.
		// 重写user的equals 和 hashCode 方法 只要用户的id相同就认为是同一个用户
		User user = new User();
		user.setId(id);
		// 从map集合中获得用户的对应的session 
		HttpSession session = userMap.get(user);
		// 销毁session
		session.invalidate();
		// 重定向到页面
		resp.sendRedirect(req.getContextPath()+"/main.jsp");
		return null;
	}

3、完成service层和dao层的实现方法。(感兴趣的同学可以下载代码查看,在此不做赘述)

四、补充说明

关于代码:

文中代码片段主要用作功能实现的说明,项目的详细代码文章开头已给出。感兴趣的同学可以下载查阅,如有不足欢迎指正

关于项目部署:

代码下载完成后配一下数据库连接,并建表即可运行。
1、配置数据库连接:
修改src目录下的c3p0-config文件
在这里插入图片描述
2、建表:
建表语句如下:

SET FOREIGN_KEY_CHECKS=0;

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(20) DEFAULT NULL,
  `password` varchar(20) DEFAULT NULL,
  `type` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'aaa', 'aaa', 'admin');
INSERT INTO `user` VALUES ('2', 'bbb', 'bbb', 'user');
INSERT INTO `user` VALUES ('3', 'ccc', 'ccc', 'admin');
INSERT INTO `user` VALUES ('4', 'ddd', 'ddd', 'user');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

聊天室--javaWeb 的相关文章

  • 【Matlab学习笔记】matlab的编程规则

    1 Matlab的续行符 关于matab的换行 在matlab代码的编写过程中 有时会遇到代码在一行显示不开了 或者在txt文档 或其他代码编辑后 由于其本身格式的作用 代码可能会自动换行 将这样的代码直接粘贴到matlab的命令窗口运行
  • Windows系统安装Java环境

    一 安装jdk 不同平台安装不同的包 Oracle官方下载 Oracle官方各版本 推荐安装jdk1 8 32位操作系统 准备jdk xxx windows i586 exe 64为操作系统 准备jdk xxx windows x64 ex
  • Linux进程间通信方式--本地socket

    先上一个代码 服务端 cpp view plain copy s unix c include
  • js获取任意一天的起始和结束时间戳,sql转换时间戳

    最近写代码时 需要获取任意一天的起始和结束时间 0点和23 59 59这两个时间的时间戳 使用了setHours 方法 setHours 方法用于设置指定的时间的小时字段 1 获取当天开始时间 moment new Date new Dat

随机推荐

  • 巨头推广刷脸支付依旧重重加码

    正如当年支付宝推广二维码 在推广刷脸支付上 巨头依旧重重加码 支持商家实现数字化转型 如此力度推广 对于服务商而言是一块巨大的蛋糕 回想推广二维码时期赚的盆满钵满的服务商们 刷脸支付必然会吸引一大波创业者前来逐利 而刷脸支付的红海就在这两年
  • STM32移植lwip之官方工程修改

    本篇目标 在之前的硬件基础上 修改ST官方移植lwip的工程 使PC机能ping通stm32 材料准备 硬件基础 stm32f407 lan9303 官方资料 包含代码和移植手册 stm32官方移植lwip资料 修改代码 包含移植后的代码
  • CPU特权级保护

    1 特权级 1 1特权级 处理器段保护机制可以识别0 3共4级特权级 数值越大 特权越小 处理器通过识别CPL DPL RPL这三种特权级来进行特权级校验 1 CPL CPL是当前正在执行程序或任务的特权级 它存放在CS和SS段寄存器的0位
  • 柏林噪声算法(Perlin Noise)

    概述 引述维基百科的介绍 Perlin噪声 Perlin noise 又称为柏林噪声 指由Ken Perlin发明的自然噪声生成算法 具有在函数上的连续性 并可在多次调用时给出一致的数值 在电子游戏领域中可以透过使用Perlin噪声生成具连
  • 基于霍尔传感器的三轴磁场检测小装置

    本次项目是制作一个三轴磁场检测的小装置 采用霍尔传感器实现检测 首先我们来介绍一下什么是霍尔传感器 1 霍尔传感器介绍 霍尔传感器是根据霍尔效应制作的一种磁场传感器 磁场中有一个霍尔半导体片 恒定电流I从A到B通过该片 在洛仑兹力的作用下
  • Python打包可执行文件-BeeWare

    前言 本文是想要将python代码打包成在手机上能执行的文件 尝试了几个库 有这也那样的限制 最终还是选了BeeWare 环境 python3 7 x 开始 找到打包有相关工具os android apk builder buildozer
  • sqlserver 快速插入数据 如何使用索引_如何快速安全的插入千万条数据

    前言 最近有个需求解析一个订单文件 并且说明文件可达到千万条数据 每条数据大概在20个字段左右 每个字段使用逗号分隔 需要尽量在半小时内入库 思路 估算文件大小 因为告诉文件有千万条 同时每条记录大概在20个字段左右 所以可以大致估算一下整
  • C++opencv图像裁剪、等比例放大缩小、复制到指定区域

    描述 C 使用opencv时 对imshow图像进行的常见处理 包括图像剪裁 等比例压缩等 待继续补充 代码 1 剪裁 int matrix size 3000 cv Mat image matrix size matrix size CV
  • 【CTF\Crypto】聪明的小羊

    聪明的小羊 题目 解题思路 在线的解密工具 离线的解密工具 心得 题目链接 题目 一只小羊翻过了2个栅栏 fa fe13f590lg6d46d0d0 解题思路 观察题目中的关键信息 2个栅栏 所以我们怀疑题目可能是个栅栏密码 我们看见题目中
  • unity 调用android的activity,Unity调用Android的Activity

    写了关于Unity与Android结合所遇到的问题及解决方法 总结一下 Unity做一个简单的场景 AndroidStudio建一个简单的项目 其中MainActivity是要继承自 UnityPlayerActivity的 这样Unity
  • python学习(5):celery-beat-task异步驱动框架

    https github com celery celery tree master examples celery的example程序periodic tasks存在如下问题 2017 08 26 21 52 11 412 INFO Ma
  • 开发中遇到的问题

    1 当写一个导出功能时 因为编码写URL地址 参数的时候 用反转字符串的时候换行了 造成地址拼接不成 一直报错 后来发现是编码格式造成的 已解决 解决方案 不换行或者用 拼接 2 当本地项目起两个终端的时候 会有两个地址 如http loc
  • CSS !important 规则

    CSS important 规则 那么什么是 important呢 CSS中的 important 规则用于向属性 值添加比正常值更重要的内容 事实上 如果你用 important 规则 它将覆盖该元素上该特定属性的所有以前的样式设置规则
  • 利用Matlab实现贝叶斯优化卷积神经网络进行数据回归预测

    利用Matlab实现贝叶斯优化卷积神经网络进行数据回归预测 概述 数据回归预测是一项重要的任务 可以通过建立卷积神经网络 Convolutional Neural Network CNN 来实现 然而 在模型参数调优方面存在着挑战 为了解决
  • http请求参数编码问题

    给某api发送http请求 结果查不到数据 而api开发者自测可以查到数据 僵持不下 经过分析发现 我的url是经过urlencode编码的 传出去的中文变成 E5 B2这种 而api开发者的url是明文传输中文 我通过httpclient
  • 构造原生单选或者多选下拉框

    function getRadioList tag pageNum pageSize ajaxHelper ajaxFun type post url data data contentType application json async
  • 急速安装git lfs

    什么是git LFS LFS是large File Storage的缩写 专门用来帮助git管理大型文件 一 curl s https packagecloud io install repositories github git lfs
  • 【问题解决】eclipse ‘Launching Hello'has encountered a problem

    问题 删除eclipse很多项目后 再次运行某一个项目 就会出现错误 eclipse Launching Hello has encountered a problem 解决方案 点此启动此项目 即可 原因 看网上答案 原来点 run 时是
  • 3D 智慧农场可视化——解锁绿色生态田园

    何为 无人农场 中国工程院院士罗锡文用五句话高度概括 耕种管收生产环节全覆盖 机库田间转移作业全自动 自动避障异况停车保安全 作物生产过程实施全监控 智能决策精准作业全无人 随着新一代信息技术飞速融入传统产业 农业数字化 网络化 智能化逐步
  • 聊天室--javaWeb

    文章目录 一 简介 项目说明 实现的主要功能 系统架构 二 项目代码和demo地址 项目代码 项目demo地址 三 具体的功能实现 登录功能 单点登录 聊天功能的实现 踢人功能 简单的分权限 四 补充说明 关于代码 关于项目部署 一 简介