简单聊天室采用各种内部对象不适用数据库实现。
一个聊天室要实现的基本功能是:
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
2
3
4 用户名:
5
6
7
8
9
10
View Code
2.聊天界面整体框架chat.jsp
此网页使用了框架,但你的浏览器不支持框架
View Code
3.用户发言sendMessage.jsp
1
2
3 发言:
4 value="确定">
5
6
View Code
4.显示聊天信息
1
2
3 //页面每隔1秒自动刷新一遍
4 response.setHeader("refresh","1");5 %>
6
7
8 ${message.userid }9 在${message.time }说:${message.info }
10
11
12
View Code
5.登录控制器LoginServlet
1 public class LoginServlet extendsHttpServlet {2
3 public voiddoGet(HttpServletRequest request, HttpServletResponse response)4 throwsServletException, 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 users = (ArrayList) application13 .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();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 voiddoPost(HttpServletRequest request, HttpServletResponse response)40 throwsServletException, IOException {41 doGet(request, response);42 }43
44 }
View Code
6.添加消息的控制器AddMessageServlet
1 public class AddMessageServlet extendsHttpServlet {2
3 public voiddoGet(HttpServletRequest request, HttpServletResponse response)4 throwsServletException, 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 allMessage = (ArrayList) application19 .getAttribute("allMessage");20
21 //创建消息对象
22 Message message = newMessage(userid, info);23
24 //创建业务对象
25 MessageService service = newMessageService(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 voiddoPost(HttpServletRequest request, HttpServletResponse response)39 throwsServletException, IOException {40 doGet(request, response);41 }42
43 }
View Code
7.聊天信息Message.java
1 //聊天信息的表示
2 public classMessage {3 privateString userid;4
5 privateString info;6
7 publicMessage(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 publicString getUserid() {16 returnuserid;17 }18 public voidsetUserid(String userid) {19 this.userid =userid;20 }21
22 publicString getInfo() {23 returninfo;24 }25 public voidsetInfo(String info) {26 this.info =info;27 }28 publicString getTime() {29 returntime;30 }31 public voidsetTime(String time) {32 this.time =time;33 }34 privateString time;35
36 }
View Code
8.聊天信息管理MessageService.java
1 public classMessageService {2 private ArrayListallMessages;3 public MessageService(ArrayListallMessages)4 {5 this.allMessages=allMessages;6 }7 public ArrayListgetAllMessages()8 {9 returnallMessages;10 }11
12 public voidaddMessages(Message message)13 {14 //先判断聊天信息列表是否为空,为空则新建聊天列表
15 if(allMessages==null)16 {17 allMessages=new ArrayList();18 }19 else
20 {21 allMessages.add(0,message);//将指定的元素插入此列表中的指定位置。向右移动当前位于该位置的元素(如果有)以及所有后续元素(将其索引加 1)。
22 }23 }24
25 }
View Code
收获:通过这么一个小小的web程序,加深了对mvc模式的理解。
mvc的传值方式(个人理解):视图层通过表单提交的方式把信息放在request对象中,在控制器中通过request对象获取视图层的数据,获取的数据经过模型层的业务逻辑处理,把相应的结果放在response对象中传回浏览器显示在视图中。
小知识点:
application对象只有一个,每一个用户都有自己的session,每个用户的每个请求都对应着一个新的request对象(request只能在一次请求时共享信息)。
标准标签库的使用:循环输出循环体
最后,部署自己的应用到服务器下就可以使用了。