文章目录
- 一、简介:
- 项目说明:
- 实现的主要功能:
- 系统架构:
- 二、项目代码和demo地址
- 项目代码:
- 项目demo地址:
- 三、具体的功能实现:
- 登录功能:
- 单点登录:
- 聊天功能的实现:
- 踢人功能(简单的分权限)
- 四、补充说明
- 关于代码:
- 关于项目部署:
一、简介:
项目说明:
一个简易的javaWeb聊天室
实现的主要功能:
1、单点登录
2、聊天
3、权限分层(管理员有踢人权限)
系统架构:
Servlet+JSP+JavaBean+JDBC
二、项目代码和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');