前言
本文章将搭建一个简易的网上聊天室
一、项目功能
- 不同的客户端在我的聊天室发言时,显示其发言等级对应的图片,ip地址,发言内容,发言时间
- 记录用户发言的总次数
二、前期准备
1.环境及开发工具
- eclipse
- jdk1.8
- Tomcat9
2.项目结构
三、代码
3.1网页代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>聊天室</title>
</head>
<body>
<form action="loveChat.do">
<p>内容:<input name = content/><p/>
<button>发送</button>
</form>
</body>
</html>
页面呈现
3.2核心代码
package com.apesource.web.lovechat;
import java.io.IOException;
import java.io.PrintWriter;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@WebServlet("/loveChat.do")
public class TestLoveChat extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 得到客户的ip地址以及发言内容
req.setCharacterEncoding("utf-8");
String ip = req.getRemoteAddr();
String content = req.getParameter("content");
HttpSession session = req.getSession();
/* 根据发言次数加入对应表情 */
// 尝试获取用户的发言次数
Integer count = (Integer) session.getAttribute("count");
// 如果没有发言,则初始化count
if (count == null) {
count = 1;
session.setAttribute("count", count);
}
String img = "";
// 判断发言次数,如果是1,则使用face1图,如果大于1小于等于使用face2图,否则使用face3图
if (count == 1) {
img = "<img src='img/face1.png'/>";
} else if (count <= 3) {
img = "<img src='img/face2.png'/>";
} else {
img = "<img src='img/face3.png'/>";
}
// 将发言次数+1存回Session
session.setAttribute("count", count + 1);
String msg = String.format("%s用户[%s]说:%s-TimeAt:%s", img, ip, content, LocalTime.now());
/* 将聊天记录全部展现在网页上 */
// 用于存储聊天记录对象
ServletContext application = req.getServletContext();
List<String> msgList = (List<String>) application.getAttribute("message");
// 如果masgList为空,说明是第一条信息,需要new一个msgList
if (msgList == null) {
msgList = new ArrayList<String>();
application.setAttribute("message", msgList);
}
// 将信息装入msgList中
msgList.add(msg);
/* 设置总发言数 */
int total = 1;
// 获取所有存在网页中的cookie对象
Cookie[] cookies = req.getCookies();
if (cookies != null) {
// 新建一个Cookie对象,用于判断是否有第一次加入的cookie
Cookie totalCookie = null;
// 遍历cookies数组
for (Cookie ck : cookies) {
// 判断cookies数组中是否有已存在的cookie对象,如有则将totalCookie指向它,并得到total后break跳出本次循环;
if (ck.getName().equals("total")) {
totalCookie = ck;
total = Integer.valueOf(totalCookie.getValue());
break;
}
}
// 如果是第一次加入的cookie,则初始化,如果不是则将total+1
if (totalCookie == null) {
totalCookie = new Cookie("total", String.valueOf(total));
} else {
totalCookie = new Cookie("total", String.valueOf(total + 1));
}
totalCookie.setMaxAge(-1);
resp.addCookie(totalCookie);
}
// 设置响应内容允许有html标签,以及字符编码为utf-8
resp.setContentType("text/html;charset=utf-8");
/* 将数据响应回网页 */
PrintWriter writer = resp.getWriter();
writer.write("<h1>"+"用户:"+ip+"的发言总数:" + total + "<h1/>");
for (String s : msgList) {
writer.write(s + "<br/>");
}
writer.flush();
}
}
就算我关过一次服务器,再发言,发言次数也是按照之前数量开始计算
总结
以上就是全部内容了!