简单聊天室采用各种内部对象不适用数据库实现。

一个聊天室要实现的基本功能是:

        1.用户登录进入聊天室,

   2.用户发言

   3.用户可以看见别人发言

刚才算是简单的需求分析了,现在就应该是进行mvc结构的设计:

  1.视图,有登陆页面login.jsp,聊天页面chat.jsp,其中chat.jsp利用框架实现,包括两部分,用户发言sendMessage.jsp和聊天信息的查看content.jsp;

  2.模型,包括聊天信息的显示(类Message)和聊天信息的管理(类MessageService);

  3.控制器,登录功能的控制器LoginServlet,添加消息的控制器AddMessageServlet。

  整个程序实现的大致流程是这样的:每当一个用户登录聊天室,根据用户的userid把用户添加进application对象的ArrayList中,在application中保存的是当前所有在聊天的用户;用户登陆成功之后,通过控制器LoginServlet把application对象遍历,输出所有的消息,消息存储在application(消息格式:用户名+消息);用户发言,通过控制器AddMessageServlet,先在session中取出用户名,把当前消息放在application中,保存更新后的消息,跳转到聊天页面。

精简源代码:

1.登陆界面login.jsp

 <body>
<h1>欢迎进入聊天室</h1>
<form action="login">
用户名:<input type="text" name="userid"><br> <input type="submit" value="进入"> <input type="reset" value="重写"> </form> </body>

2.聊天界面整体框架chat.jsp

<frameset rows="*,20%">
<frame name="content" src="content.jsp">
<frame name="sendMessage" target="content" src="sendMessage.jsp">
<noframes>
<body>
<p>此网页使用了框架,但你的浏览器不支持框架</p>
</body>
</noframes>
</frameset>

3.用户发言sendMessage.jsp

 <body>
<form action="addmessage" target="content">
发言:<input type="text" name="info"> <input type="submit"
value="确定">
</form>
</body>

4.显示聊天信息

 <body>
<%
//页面每隔1秒自动刷新一遍
response.setHeader("refresh","1");
%> <c:forEach items="${allMessage}" var="message">
${message.userid }
在${message.time }说:<font color="green">${message.info }</font>
<br>
</c:forEach>
</body>

5.登录控制器LoginServlet

 public class LoginServlet extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取用户输入
String userid = request.getParameter("userid");
userid = new String(userid.getBytes("utf-8")); // 获取application对象
ServletContext application = this.getServletContext();
// 获取application对象中user
ArrayList<String> users = (ArrayList<String>) application
.getAttribute("users"); // 判断用户名是否存在
if (users != null && users.contains(userid)) {
request.setAttribute("errorinfo", "用户" + userid + "已经存在");
RequestDispatcher rd;
rd = request.getRequestDispatcher("login.jsp");
rd.forward(request, response);
} else {
if (users == null)// 如果当前application中没有user,初始化user对象
{
users = new ArrayList<String>();
}
users.add(userid);
application.setAttribute("users", users); // 为每一个用户设置一个session
HttpSession session = request.getSession(true);
session.setAttribute("userid", userid); response.sendRedirect("chat.jsp"); } } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

6.添加消息的控制器AddMessageServlet

 public class AddMessageServlet extends HttpServlet {

     public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 从request中取出用户的个人信息 HttpSession session = request.getSession(true);
String userid = (String) session.getAttribute("userid"); // 从request对象中取出用户新增的聊天信息 String info = request.getParameter("info");
info = new String(info.getBytes("utf-8")); // 取出所有的聊天信息
ServletContext application = this.getServletContext();
ArrayList<Message> allMessage = (ArrayList<Message>) application
.getAttribute("allMessage"); // 创建消息对象
Message message = new Message(userid, info); // 创建业务对象
MessageService service = new MessageService(allMessage); // 调用业务逻辑
service.addMessages(message); // 保存更新后的消息
application.setAttribute("allMessage", service.getAllMessages()); // 转向聊天页面
response.sendRedirect("content.jsp"); } public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
} }

7.聊天信息Message.java

 //聊天信息的表示
public class Message {
private String userid; private String info; public Message(String userid,String info)
{
this.userid = userid;
//this.sex=sex;
this.info=info;
this.time=(new SimpleDateFormat("hh:mm:ss")).format(new Date());//将时间格式化 }
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
} public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
private String time; }

8.聊天信息管理MessageService.java

 public class MessageService {
private ArrayList<Message> allMessages;
public MessageService(ArrayList<Message> allMessages)
{
this.allMessages=allMessages;
}
public ArrayList<Message> getAllMessages()
{
return allMessages;
} public void addMessages(Message message)
{
//先判断聊天信息列表是否为空,为空则新建聊天列表
if(allMessages==null)
{
allMessages=new ArrayList<Message>();
}
else
{
allMessages.add(0,message);//将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。
}
} }

收获:通过这么一个小小的web程序,加深了对mvc模式的理解。

mvc的传值方式(个人理解):视图层通过表单提交的方式把信息放在request对象中,在控制器中通过request对象获取视图层的数据,获取的数据经过模型层的业务逻辑处理,把相应的结果放在response对象中传回浏览器显示在视图中。

  小知识点:

    application对象只有一个,每一个用户都有自己的session,每个用户的每个请求都对应着一个新的request对象(request只能在一次请求时共享信息)。

    标准标签库的使用:循环输出<c:forEach var="变量名" items="集合对象">循环体</c:forEach>

   最后,部署自己的应用到服务器下就可以使用了。 

java web利用mvc结构实现简单聊天室功能的更多相关文章

  1. Java利用TCP编程实现简单聊天室

    前言: 本文是我在学习尚学堂JAVA300集第二季网络编程部分仿照视频内容实现而成 具体可以去尚学堂官网观看视频学习 一.实现思路 实现聊天室的最核心部分就是JAVA的TCP网络编程. TCP 传输控 ...

  2. (ASP.net)利用Application对象制作简单聊天室

    1.共四个页面,Default.aspx默认主页,Default2.aspx聊天室 default3.aspx显示用户列表,default4.aspx显示聊天内容,添加一个Global.asax全局程 ...

  3. Java Web利用POI导出Excel简单例子

    采用Spring mvc架构: Controller层代码如下 @Controller public class StudentExportController{ @Autowired private ...

  4. ASP.NET SingalR + MongoDB 实现简单聊天室(一):搭建基本框架

    ASP.NET SingalR不多介绍.让我介绍不如看官网,我这里就是直接上源代码,当然代码还是写的比较简单的,考虑的也少,希望各位技友多多提意见. 先简单介绍聊天室功能: 用户加入聊天室,自动给用户 ...

  5. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  6. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  7. 如何利用WebSocket实现网页版聊天室

    花了将近一周的时间终于完成了利用WebSocket完成网页版聊天室这个小demo,期间还走过了一段"看似弯曲"的道路,但是我想其实也不算是弯路吧,因为你走过的路必将留下你的足迹.这 ...

  8. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  9. C#基于Socket的简单聊天室实践

    序:实现一个基于Socket的简易的聊天室,实现的思路如下: 程序的结构:多个客户端+一个服务端,客户端都是向服务端发送消息,然后服务端转发给所有的客户端,这样形成一个简单的聊天室功能. 实现的细节: ...

随机推荐

  1. 前端每日实战:26# 视频演示如何用不到 50 行 CSS 代码,创作按钮被从纸上掀起的立体效果

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/KRbXGe 可交互视频教程 此视频 ...

  2. 基于@vue/cli 的构建项目(3.0)

    1.检测node的版本号 注意:1.Vue CLI需要Node.js的版本 8.9+(推荐8.11.0+) 所以在安装Vue CLI之前先看下node的版本 node -v 2.安装@vue/cli ...

  3. MySQL中INSERT INTO SELECT的使用

    1. 语法介绍      有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (fi ...

  4. 第一个爬虫经历----豆瓣电影top250(经典案例)

    因为要学习数据分析,需要从网上爬取数据,所以开始学习爬虫,使用python进行爬虫,有好几种模拟发送请求的方法,最基础的是使用urllib.request模块(python自带,无需再下载),第二是r ...

  5. 大龄IT人的新的一年

    一转眼,工作十几年了,之前由于有时要出差,孩子偶尔放回老家,有时到处找人看孩子,虽然不出差时都是有我来带,孩子还是和我很亲,但是一直没时间关注她的学习,只是睡前读读绘本,报了个英语培训班,偶尔玩玩识字 ...

  6. CTR学习笔记&代码实现1-深度学习的前奏LR->FFM

    CTR学习笔记系列的第一篇,总结在深度模型称王之前经典LR,FM, FFM模型,这些经典模型后续也作为组件用于各个深度模型.模型分别用自定义Keras Layer和estimator来实现,哈哈一个是 ...

  7. 当程序执行一条查询语句时,MySQL内部到底发生了什么? (说一下 MySQL 执行一条查询语句的内部执行过程?

    先来个最基本的总结阐述,希望各位小伙伴认真的读一下,哈哈: 1)客户端(运行程序)先通过连接器连接到MySql服务器. 2)连接器通过数据库权限身份验证后,会先查询数据库缓存是否存在(之前执行过相同条 ...

  8. 为什么Mysql的常用引擎都默认使用B+树作为索引?

    一.前言 为了讲清楚这个问题,我们要先了解什么是索引. 我记得刚刚学习数据库的时候,老师喜欢用书本的目录来类比数据库的索引,并告诉我们索引能够像目录一样,让我们更快地找到想要找到的数据. 如果是第一次 ...

  9. Apache Shiro反序列化漏洞复现

    Apache Shiro反序列化漏洞复现 0x01 搭建环境 获取docker镜像 Docker pull medicean/vulapps:s_shiro_1 重启docker system res ...

  10. 被问到到http的时候你就这么回答!

    大家好,我是标题党,啊不,我是小雨小雨,致力于分享有趣的.实用的技术文章. 内容分为翻译和原创,如果有问题,欢迎随时评论或私信,希望和大家一起进步. 分享不易,希望能够得到大家的支持和关注. 什么是互 ...