书本最后是一个聊天室的小项目,我就将之作为java web学习小阶段的结束。书本上提供了完整的解决方案,实际上我参考的也不多,更多的还是自己思考设计的。过程之中发现我会的东西还是太少了,要做web后端必须也很熟悉前端才行。只能以我当前会的东西做一个简陋的聊天室了。

先看一下界面

登陆界面

聊天界面

再说一下逻辑

数据存储

name content scope
name 当前用户的名字 session
usernum 在线用户数量 application
username 在线用户的名字集合 application
begin 聊天记录的开始位置 application
end 聊天记录的结束位置 application
talk1 1号位置 application
talkx x号位置 application

在application中分配50个位置来存储聊天记录,分别为1-50,这相当于一个队列,FIFO,begin和end来记录队列的起始和结束。

流程

login.html,输入名字→check.jsp,将名字写入session和application→charroom.jsp,聊天界面。
聊天界面由3个frame构成,users.jsp负责显示在线用户列表,input.jsp负责用户输入信息,chats.jsp负责显示所有聊天记录。
input.jsp将用户输入的内容post给talk.jsp,talk.jsp负责将这些内容存到application中。

代码

login.html,登陆界面

<html><meta http-equiv="content-type" content="text/html;charset=utf-8">
<script type="text/javascript">// 从url 字符串中提取变量的值function GetQueryValue(sorStr, panStr){var vStr = "";if (sorStr==null || sorStr=="" || panStr==null || panStr=="") return vStr;sorStr = sorStr.toLowerCase();panStr += "=";var itmp = sorStr.indexOf(panStr);if (itmp < 0) return vStr;sorStr = sorStr.substr(itmp + panStr.length);itmp = sorStr.indexOf("&");if (itmp < 0) return sorStr;else{sorStr = sorStr.substr(0, itmp);return sorStr;}}
</script><body><br><br><br><br><center>
大侠请输入你的名号<br><form action="check.jsp" method="post"><input type=text name="name"><input type=submit value="开始"></form>
<p id="alert"></p>
<script>
// 获得url字符串
var strGetQuery = document.location.search;
// 获得alert参数的值
var stylevalue = GetQueryValue(strGetQuery,'alert');
// 输出
document.getElementById("alert").innerHTML = stylevalue;
</script>
</center></body>
</html>

它可以接受alert参数,并将参数内容输出。

check.jsp,用来检查名字有效性

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<html>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<body><%request.setCharacterEncoding("utf-8");//名字为空String name = request.getParameter("name");if(name == null || name == "") {response.sendRedirect("login.html");return;}//这是第一个用户String strusernum = (String)application.getAttribute("usernum");int usernum = 0;if(strusernum != null)  usernum = Integer.parseInt(strusernum);if(strusernum == null || usernum == 0) {application.setAttribute("username", name+";");application.setAttribute("usernum", "1");session.setAttribute("name", name);response.sendRedirect("chatroom.jsp");return;}//已有用户String username = (String)application.getAttribute("username");if(username.contains(name)) {response.sendRedirect("login.html?alert=The_name_already_exists.");return;}//新用户++usernum;application.setAttribute("username", username+name+";");application.setAttribute("usernum", ""+usernum);session.setAttribute("name", name);response.sendRedirect("chatroom.jsp");%>
</body>
</html>

chatroom.jsp,这是聊天室主界面

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head><title>chat room</title></head><%response.setHeader("refresh","5");%><%if(request.getSession().getAttribute("name") == null){%><jsp:forward page="login.html"/><%}%><frameset cols="80%,*"><frameset rows="70%,*" ><frame src="chats.jsp" name="frachats" scrolling="no"><frame src="input.jsp" scrolling="no"></frameset><frame src="users.jsp" frameborder=0></frameset>
</html>

users.jsp,显示当前在线用户

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<html><meta http-equiv="content-type" content="text/html;charset=utf-8">
<body>
<%String strusernum = (String)application.getAttribute("usernum");%>
共<%=strusernum%>位在线用户:<hr><%int usernum = Integer.parseInt(strusernum);String username = (String)application.getAttribute("username");String[] names = username.split(";");for (int i=0; i<usernum; ++i) out.print(names[i]+"<br>");%>
</body>
</html>

input.jsp,用户输入消息的界面

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<html><meta http-equiv="content-type" content="text/html;charset=utf-8">
<head><script language="javascript">function chk(){if(content.txttalk.valu == "") return;content.submit();content.txttalk.value = "";}</script>
</head>
<body><p>你好,<%=(String)request.getSession().getAttribute("name")%></p><form name=content action="talk.jsp" method="post" target="frachats"><textarea name="txttalk" rows="4" cols="100"></textarea><input type="button" value="发言" onclick="chk()"><input name="" type="reset" value="清除"></form>
</body>
</html>

chats.jsp,显示所有聊天记录的界面

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<html><meta http-equiv="content-type" content="text/html;charset=utf-8"><script type="text/javascript">function pagescrolltoend() {var c = window.document.body.scrollHeight;window.scroll(0,c); }function divscrolltoend() {var div = document.getElementById('scrolldIV');div.scrollTop = div.scrollHeight; }</script>
<body onload="divscrolltoend()"><marquee>通知:本聊天室正式开放</marquee><br><br><div id="scrolldIV" style="overflow:scroll; height: 500px; width: auto; border: 1px solid #999;"><%String strbegin = (String)application.getAttribute("begin");if(strbegin == null){out.println("nothing");return;} else {int begin = Integer.parseInt(strbegin);int end = Integer.parseInt((String)application.getAttribute("end"));if (begin < end) {for (int i=begin; i<end; ++i) {out.print((String)application.getAttribute("talk"+i)+"<br>");}}else {for(int i=begin; i<102; ++i) out.println((String)application.getAttribute("talk"+i)+"<br>");for(int i=1; i<end; ++i) out.println((String)application.getAttribute("talk"+i)+"<br>");}}%></div>
</body>
</html>

talk.jsp,处理用户消息,将其插入消息记录的页面

<%@ page contentType="text/html;charset=UTF-8" pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html><meta http-equiv="content-type" content="text/html;charset=utf-8">
<body><%request.setCharacterEncoding("utf-8");String text = request.getParameter("txttalk");if(text == null || text == "") {response.sendRedirect("chats.jsp");return;}String name = (String)session.getAttribute("name");Date date=new Date();SimpleDateFormat f=new SimpleDateFormat(" [HH:mm:ss]");String time=f.format(date);String strbegin = (String)application.getAttribute("begin");text = name+time+"<br>"+text;if(strbegin == null) {application.setAttribute("begin", "1");application.setAttribute("end", "2");application.setAttribute("talk1", text);} else {String strend = (String)application.getAttribute("end");int end = Integer.parseInt(strend);int begin = Integer.parseInt(strbegin);application.setAttribute("talk"+end, text);++end;if(end == 102) end = 1;if(end == begin) {++begin;if(begin ==102) begin = 1;application.setAttribute("begin", ""+begin);}application.setAttribute("end", ""+end);}response.sendRedirect("chats.jsp");%>
</body>
</html>

bugs

信息的实时显示,通过设定页面自动更新response.setHeader("refresh","5");来实现,没办法,前端的东西不懂,只能这样实现了。
重要问题!用户关闭浏览器或因其他原因退出聊天室的时候,服务器是没响应的!预期解决方法:将session的有效期设置为一个较小的值,并为session的销毁设定一个监听器,session销毁时,将application中存储的此用户删去。
关于session和监听器的内容,后面的文章再说。在线用户删除功能就不实现了吧。

Java Web入门之网络聊天室相关推荐

  1. 大学Java基础课程设计——网络聊天室

    不登高山,不知天之高也:不临深溪,不知地之厚也. | @Author:TTODS 目录 项目简介 系统设计与实现 聊天室系统的总体设计 服务器端功能设计 客户端功能设计 数据包 用户操作处理流程 客户 ...

  2. java实现一个简易网络聊天室

    题目要求 基本功能(必须实现和遵循的要求) 1.要求项目服务器端能稳定持续接收进入聊天室的人员,并能够在聊天室实时更新在线人数. 2.客户端可以持续不断的给服务器发送消息,中间不能丢失任何一条信息. ...

  3. Java基础Swing实现网络聊天室(视频+源码)

    Swing老师都不教了,想做个小游戏,在网上找了好多代码,都是残缺不全,四处报错,终于找到个从0到一个完整的教程,还有源码,下面附上地址 https://ke.qq.com/course/371557

  4. java 网络实验_java网络聊天室实验

    使用java写的一个网络聊天小程序,采用UDP协议.将左下角的ip改为目标地址即可发送信息.作为java网络编程入门的一个参考.最后一幅图为程序中所使用图片,来自仙剑奇侠传五的壁纸. 1.[文件] C ...

  5. 基于Java socket的网络聊天室的设计与实现

    目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...

  6. 网络聊天室(linux,java,Android)

    如果追忆会荡起涟漪,那么今天的秋红落叶和晴空万里都归你 艾恩凝 个人博客 https://aeneag.xyz/ 前几天在他人那里看到了网络聊天室的文章,想起了自己几年前也认认真真写过相关编程,实现了 ...

  7. 网络聊天室(Java)

    摘要 本文阐述了基于Linux环境,Java语言实现的基本聊天室功能,涉及Linux下的Java 语言的Socket编程.以及Java语言的多线程编程. 关键字 Linux         Java  ...

  8. java聊天室测试_Java网络聊天室实训能力测试

    1填空题(2*12=24,每空2分).1)C/S结构是指___客户机/服务器_____,请例举除网络聊天室之外的基于C/S结构的应用程序____________________.2)套接字(socke ...

  9. 【完整代码及文档】基于Java的网络聊天室系统的设计与实现

    摘 要 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有了日新月异的发展,它的发展速度和计算机 ...

  10. Java Web入门项目之“网络交友”的设计与实现

    前言:这个小项目是我刚学习JSP时,参考"JSP程序设计"这本书写的.这里之所以说参考这本书而不是照着这本书写,主要是因为我自己完成的时候删掉了不少繁琐的写法(比如:文件上传):同 ...

最新文章

  1. bitset HDU6515 Coding Problem
  2. 京东加淘宝,羊毛有点大
  3. python中一共有多少个关键字-python 查看所有的关键字
  4. 反序列化存入数据库里面的session数据
  5. Mr.J-- jQuery学习笔记(二十九)--属性操作方法(获取属性判断)
  6. 518. 零钱兑换 II(JavaScript)
  7. 关于call的使用和原理分析
  8. 智能指针——C++实现
  9. caffe cifar10 net笔记
  10. SpringBoot的自定义配置方法一,通过自定义配置文件
  11. 14. Magento路由分发过程解析(二):Standard路由对象
  12. 全面的C#编码规范整理
  13. Python培训包食宿
  14. 求职季到来,你还在原地踏步吗?
  15. dpbs和pbs的区别_简单问题:PBS缓冲液到底是什么?
  16. 数学思维导图学习方法
  17. 返回结果集Result类
  18. uni-app做app自定义弹窗实现
  19. you和帆船(枚举)
  20. init函数及其使用(go语言基础语法)

热门文章

  1. 数据库笔试面试(第一版)——根据题目完成以下50道SQL语句
  2. [c++]平均成绩、从尾到头打印链表、整数从大到小排序、二分法查找、斐波那契数列
  3. Maven学习记录之依赖问题 Missing artifact org.aspectj:aspectjweaver:jar:1.8.0.M1
  4. 百度面试题--度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同,度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?
  5. 转 解决打印机无法打印的方法
  6. 08年计算机组成原理自考试卷,2008年04月自学考试02318《计算机组成原理》试题...
  7. Keystone认证服务详细操作流程
  8. python视频分段_Python玩转视频处理(四):视频按场景进行分割
  9. 推荐5个设计素材网站
  10. oppo计算机找不到,oppo手机和电脑连接不上怎么办只显示充电(原来这个功能没有打开)...