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

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

        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

  1. <body>
  2. <h1>欢迎进入聊天室</h1>
  3. <form action="login">
  4. 用户名:<input type="text" name="userid"><br>
  5.  
  6. <input type="submit" value="进入"> <input type="reset" value="重写">
  7.  
  8. </form>
  9.  
  10. </body>

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

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

3.用户发言sendMessage.jsp

  1. <body>
  2. <form action="addmessage" target="content">
  3. 发言:<input type="text" name="info"> <input type="submit"
  4. value="确定">
  5. </form>
  6. </body>

4.显示聊天信息

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

5.登录控制器LoginServlet

  1. public class LoginServlet extends HttpServlet {
  2.  
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5. // 获取用户输入
  6. String userid = request.getParameter("userid");
  7. userid = new String(userid.getBytes("utf-8"));
  8.  
  9. // 获取application对象
  10. ServletContext application = this.getServletContext();
  11. // 获取application对象中user
  12. ArrayList<String> users = (ArrayList<String>) application
  13. .getAttribute("users");
  14.  
  15. // 判断用户名是否存在
  16. if (users != null && users.contains(userid)) {
  17. request.setAttribute("errorinfo", "用户" + userid + "已经存在");
  18. RequestDispatcher rd;
  19. rd = request.getRequestDispatcher("login.jsp");
  20. rd.forward(request, response);
  21. } else {
  22. if (users == null)// 如果当前application中没有user,初始化user对象
  23. {
  24. users = new ArrayList<String>();
  25. }
  26. users.add(userid);
  27. application.setAttribute("users", users);
  28.  
  29. // 为每一个用户设置一个session
  30. HttpSession session = request.getSession(true);
  31. session.setAttribute("userid", userid);
  32.  
  33. response.sendRedirect("chat.jsp");
  34.  
  35. }
  36.  
  37. }
  38.  
  39. public void doPost(HttpServletRequest request, HttpServletResponse response)
  40. throws ServletException, IOException {
  41. doGet(request, response);
  42. }
  43.  
  44. }

6.添加消息的控制器AddMessageServlet

  1. public class AddMessageServlet extends HttpServlet {
  2.  
  3. public void doGet(HttpServletRequest request, HttpServletResponse response)
  4. throws ServletException, IOException {
  5.  
  6. // 从request中取出用户的个人信息
  7.  
  8. HttpSession session = request.getSession(true);
  9. String userid = (String) session.getAttribute("userid");
  10.  
  11. // 从request对象中取出用户新增的聊天信息
  12.  
  13. String info = request.getParameter("info");
  14. info = new String(info.getBytes("utf-8"));
  15.  
  16. // 取出所有的聊天信息
  17. ServletContext application = this.getServletContext();
  18. ArrayList<Message> allMessage = (ArrayList<Message>) application
  19. .getAttribute("allMessage");
  20.  
  21. // 创建消息对象
  22. Message message = new Message(userid, info);
  23.  
  24. // 创建业务对象
  25. MessageService service = new MessageService(allMessage);
  26.  
  27. // 调用业务逻辑
  28. service.addMessages(message);
  29.  
  30. // 保存更新后的消息
  31. application.setAttribute("allMessage", service.getAllMessages());
  32.  
  33. // 转向聊天页面
  34. response.sendRedirect("content.jsp");
  35.  
  36. }
  37.  
  38. public void doPost(HttpServletRequest request, HttpServletResponse response)
  39. throws ServletException, IOException {
  40. doGet(request, response);
  41. }
  42.  
  43. }

7.聊天信息Message.java

  1. //聊天信息的表示
  2. public class Message {
  3. private String userid;
  4.  
  5. private String info;
  6.  
  7. public Message(String userid,String info)
  8. {
  9. this.userid = userid;
  10. //this.sex=sex;
  11. this.info=info;
  12. this.time=(new SimpleDateFormat("hh:mm:ss")).format(new Date());//将时间格式化
  13.  
  14. }
  15. public String getUserid() {
  16. return userid;
  17. }
  18. public void setUserid(String userid) {
  19. this.userid = userid;
  20. }
  21.  
  22. public String getInfo() {
  23. return info;
  24. }
  25. public void setInfo(String info) {
  26. this.info = info;
  27. }
  28. public String getTime() {
  29. return time;
  30. }
  31. public void setTime(String time) {
  32. this.time = time;
  33. }
  34. private String time;
  35.  
  36. }

8.聊天信息管理MessageService.java

  1. public class MessageService {
  2. private ArrayList<Message> allMessages;
  3. public MessageService(ArrayList<Message> allMessages)
  4. {
  5. this.allMessages=allMessages;
  6. }
  7. public ArrayList<Message> getAllMessages()
  8. {
  9. return allMessages;
  10. }
  11.  
  12. public void addMessages(Message message)
  13. {
  14. //先判断聊天信息列表是否为空,为空则新建聊天列表
  15. if(allMessages==null)
  16. {
  17. allMessages=new ArrayList<Message>();
  18. }
  19. else
  20. {
  21. allMessages.add(0,message);//将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。
  22. }
  23. }
  24.  
  25. }

收获:通过这么一个小小的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. Python -Selenium的安装和调用

    安装selenium步骤: 1.安装pip(cmd命令行管理员方式): pip install pip 也可直接搜索pip,到官网下载安装 2.安装selenium(cmd命令行管理员方式): pip ...

  2. PC端如何下载B站里面的视频?

    此随笔只是记录一下:   PC端下载B站的视频,在blibli前面加上一个i 然后在视频上鼠标右键,视频另存为+路径即可 PS:网上其他的方法,比如在blibli前面加上kan,后面加上jj等,这些方 ...

  3. Java 读取Word中的脚注、尾注

    本文介绍读取Word中的脚注及尾注的方法,添加脚注.尾注可以参考这篇文章. 注:本文使用了Word类库(Free Spire.Doc for Java 免费版)来读取,获取该类库可通过官网下载,并解压 ...

  4. Access Token 机制详解

    我们在访问很多大公司的开放 api 的时候,都会发现这些 api 要求传递一个 access token 参数.这个参数是什么呢?需要去哪里获取这个 access token 呢? access to ...

  5. 前端劝退预警:JavaScript 工具链不完全指南

    经过这么多年的发展,JavaScript 早已经不是当年那个不太起眼的脚本语言.如今的 JavaScript 可以说是风光无限,在 Web 前端.移动端.服务端甚至物联网设备上都大展身手,到处都有它的 ...

  6. js中所有函数的参数(按值和按引用)都是按值传递的,怎么理解?

    我觉着我可能对这块有点误解,所以单独开个博说下自己的理解,当然是研究后的正解了. 1,参数传递是基本类型,看个例子: function addTen(num){ num += 10; return n ...

  7. Vue的模板内换行问题

    在用vue的模板{{}}进行渲染文本时候,字符串换行不起作用,后使用ES6的模板字符串进行换行仍然不起作用,解决方法: <div>{{str}}</div> 可换为用v-htm ...

  8. 前端Tips#6 - 在 async iterator 上使用 for-await-of 语法糖

    视频讲解 前往原文 前端Tips 专栏#6,点击观看 文字讲解 本期主要是讲解如何使用 for-await-of 语法糖进行异步操作迭代,让组织异步操作的代码更加简洁易读. 1.场景简述 以下代码中的 ...

  9. Python进阶练习与爬取豆瓣T250的影片相关信息

    (一)Python进阶练习 正所谓要将知识进行实践,才会真正的掌握 于是就练习了几道题:求素数,求奇数,求九九乘法表,字符串练习 import re #求素数 i=1; flag=0 while(i& ...

  10. 树莓派3B+远程VNC的设置

    现在很少有自带VNCserver的教程,因为之前官方系统没有自带VNC,但是现在最新版的官方系统已经自带VNCserver,只需要在设置里启用一下,然后设置就可以用啦. 1.打开树莓派设置 sudo ...