聊天室--javaWeb

一、简介:

项目说明:

一个简易的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');
原创文章 19 获赞 16 访问量 2445

猜你喜欢

转载自blog.csdn.net/qq_42778289/article/details/103602581