实验三 内置对象使用

  

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

              一、实验目的

              1、掌握各个内置对象的含义;

              2、理解并熟练应用sessionapplication对象。

              二、实验内容

              1、设计聊天室,在聊天室中,需要通过JSP内置对象application来实时保存特定数量的当前聊天信息。

                聊天室的设计包括:用户进行登录,选择聊天室,进行聊天,退出聊天室。 在聊天室中,用户只

              输入一个用户名就可以进入聊天室,但是如果当前有人在使用该用户名,那么就必须换一个唯一的用

              名。

                具体要求:

                  n 用户登录成功后,程序会要求用户选择聊天室。可以不设置用户自行建立聊天室的功能,而且

              在聊天中途不能从一个聊天室切换到另一个聊天室。

                  n 进入聊天室后,用户可以从用户信息窗口看到该聊天室中所有用户的用户名,也可以在聊天窗

              口中看到随时更新的聊天信息。用户可以给所有人或某一个聊天用户发送公共的聊天信息,这个聊天内容

              大家都可以看到。用户也可以给某个用户发送私人的聊天信息,这种信息属于私聊信息,只有发送者和接

              收者可以看到。此外,聊天窗口还会出现一些系统公告,比如某某上站。

                  n  在用户单击“退出”按钮后,页面关闭,同时application和session中保存的信息都将丢失。

               三、实验方法

              1、用户登录信息使用request对象getParameter()方法得到用户登陆的一些信息;

              2、公聊信息可以使用application对象,私聊信息使用session对象。

              3、聊天的信息要不断刷新页面,使用户实时看到聊天信息。

              4、用户退出时,有两种情况需要考虑:一是用户点击“退出”按钮,二是关闭浏览器,强制退出窗口,可

              查阅windows感知浏览器关闭的事件的相应方法。(关闭浏览器的暂时没实现)

              四、实验学时:4学时

              五、实验代码

                登录界面login.jsp

实验三 内置对象使用(简易聊天室) 随笔 第1张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%
 4     request.setCharacterEncoding("UTF-8");
 5 %>
 6 <!DOCTYPE html>
 7 <html>
 8 <head>
 9 <meta charset="UTF-8">
10 <title>登录</title>
11 <style type="text/css">
12 div{
13     box-sizing: border-box;
14     border-width:400px 300px;
15     padding-top: 150px;
16 }
17 body{
18     margin:0 auto;
19     wigth:200PX;
20     height:200px;
21     text-align:center;
22     font-size:20px;
23     font-family: 黑体,楷书;
24     color:black;
25 }
26 </style>
27 </head>
28 <body background="img/2.jpg">
29 <div>
30 <p><b style=" font-size:30px;color:pink">OC</b></p>
31 <form action="check.jsp" method="post">
32 <li>
33        <img src="img/头像.png" style="width:28px;height:28px"><input type="text" name="username" size="30px" required="required"><br/><br/>
34        <input style="border-bottom-color: white" type="submit" name="Submit" value="登录">                    
35 </li>
36 </form>
37 </div>
38 </body>
39 </html>
login.jsp

 

 

                检查用户登录check.jsp

实验三 内置对象使用(简易聊天室) 随笔 第3张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%
 4     request.setCharacterEncoding("UTF-8");
 5 %>
 6 <%@page import="java.util.*"%>
 7 <%@page import="java.text.SimpleDateFormat"%>
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11 <meta charset="UTF-8">
12 <title>检查验证</title>
13 </head>
14 <body>
15 <!-- 用户列表 -->
16 <%! ArrayList<String> users=new ArrayList<String>();/*用来存放登录用户*/ %>
17 <%
18     //从表单找中获取用户名
19     String username=request.getParameter("username");
20     
21     //从application中获取值
22     users = (ArrayList<String>)application.getAttribute("users");
23     //如果该用户列表不存在,则实例化该用户列表
24     if(users==null){
25         users = new ArrayList<String>();
26     }
27     //查看当前列表中是否包含当前登入用
28     if(users.contains(username)){
29             //设置提示信息
30             //out.println("users.get(i)"+users.get(i));
31             //out.println("username"+username);
32             out.println("该用户已登入,请重新登入");
33             response.setHeader("Refresh","3;URL=login.jsp");
34     }else{
35             //获取用户登入时间
36             Date d = new Date();  
37             SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
38             String ldate=format.format(d);
39             session.setAttribute("loginDate", ldate);
40             //若用户未登入,则加入到用户列表
41             session.setAttribute("user",username);
42             users.add(username);
43             application.setAttribute("users",users);
44             //用于后面显示上线用户
45             application.setAttribute("noluser", username);
46             response.sendRedirect("oclogin.jsp");
47     }
48 %>
49 </body>
50 </html>
check.jsp

 

 

 

                用户聊天界面oclgion.jsp

 

实验三 内置对象使用(简易聊天室) 随笔 第5张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="ISO-8859-1"%>
 3 <%
 4     request.setCharacterEncoding("UTF-8");
 5 %>
 6 <!DOCTYPE html> 
 7 <html>
 8 <head>
 9 <meta charset="UTF-8">
10 <title>用户界面</title>
11 </head>
12 <frameset cols="20%,40%,40%">
13     <frame src="users.jsp"/>
14     <frameset rows="70%,30%">
15     <frame src="publicoc.jsp"/>
16     <frame src="send.jsp"/> 
17     </frameset>
18     <frameset rows="70%,30%">
19     <frame src="privateoc.jsp">
20     <frame src="send1.jsp">
21     </frameset>
22 </frameset>
23 <body>
24 </body>
25 </html>
oclgion.jsp

 

 

 

                在线用户显示界面users.jsp

实验三 内置对象使用(简易聊天室) 随笔 第7张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%
 4     request.setCharacterEncoding("UTF-8");
 5 %>
 6 <%@page import="java.util.ArrayList"%>
 7 <!DOCTYPE html>
 8 <html>
 9 <head>
10 <meta charset="UTF-8">
11 <title>在线用户</title>
12 </head>
13 <body bgcolor="Beige">
14 <%
15     //设置不断更新
16     response.setHeader("Refresh", "5");
17     //取出在线人员
18     ArrayList<String> olusers = (ArrayList<String>) application.getAttribute("users");
19     out.print("目前在线人员有"+olusers.size()+"");
20     //列出在线人员
21     for(int i=0;i<olusers.size();i++){
22         String username=(String)olusers.get(i);
23         out.print("<li>"+username);
24     }
25     //out.print((String)session.getAttribute("user"));
26 %>
27 </body>
28 </html>
users.jsp

 

 

 

                公聊发送消息框界面send.jsp

实验三 内置对象使用(简易聊天室) 随笔 第9张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.util.*" %>
 4 <%@page import="java.text.SimpleDateFormat"%>
 5 <%
 6     request.setCharacterEncoding("UTF-8");
 7 %>
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11 <meta charset="UTF-8">
12 <title>消息框</title>
13 </head>
14 <body bgcolor="Gainsboro">
15 <div>
16     当前用户:<%=(String)session.getAttribute("user") %>
17 </div>
18 <form action="" method="post">
19 <p align="right">
20 <textarea name="message" rows="5" cols="45"></textarea><br/><br/>
21 <input type="submit" name="send" value="发送">&nbsp;&nbsp;&nbsp;&nbsp;
22 <input type="button" name="exit" value="退出" onclick="parent.location.href='clean.jsp'">
23 </form>
24 <%
25     //获取聊天时间
26     Date data=new Date();
27     SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
28     String dd=format.format(data);
29     //获取聊天框内容
30     String message=request.getParameter("message");
31     //判断消息列表是否为空
32     ArrayList<String> messages =(ArrayList<String>) application.getAttribute("messages");
33     if(messages==null){
34         messages=new ArrayList<String>();
35     }
36     String user=(String)session.getAttribute("user");
37     //判断是否有消息
38     if(message!=null && !message.equals("")){
39         //把消息加入到messages列表中
40         messages.add(dd+"<br/>"+user+""+message);
41         //将列表加入到application中
42         application.setAttribute("messages", messages);
43     }
44     
45 %>
46 
47 </body>
48 </html>
send.jsp

 

 

                公聊消息显示框界面publicoc.jsp

实验三 内置对象使用(简易聊天室) 随笔 第11张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.util.*" %>
 4 <%@page import="java.text.SimpleDateFormat"%>
 5 <%
 6     request.setCharacterEncoding("UTF-8");
 7 %>
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11 <meta charset="UTF-8">
12 <title>公共聊天</title>
13 </head>
14 <body  background="img/oc3.jpg">
15 <p><font size="14px" color="Gray">公共聊天室</font></p>
16 <div float="right">
17 <%
18     String noluser=(String)application.getAttribute("noluser"); 
19     String ldate=(String)session.getAttribute("loginDate");
20 %>
21 <p><font color="red" >系统提醒:<%=ldate%>&nbsp;&nbsp;&nbsp;<%=noluser %>上线了</font></p>
22 </div>
23 
24 <% 
25     //设置不断更新
26     response.setHeader("Refresh", "2");
27     //获取用户登录时间
28     String pulgdate=(String)session.getAttribute("loginDate");
29     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
30     Date pulogintime =df.parse(pulgdate);
31     //从application中获取消息集合
32     ArrayList<String> allmessages=(ArrayList<String>)application.getAttribute("messages");
33     //判断是否为空
34     if(allmessages != null){
35     //遍历
36         for(int i=0;i<allmessages.size();i++){
37             String msg=(String)allmessages.get(i);
38             String pusendtime=msg.substring(0,msg.indexOf("<br/>"));
39             Date psendtime=df.parse(pusendtime);
40             //后面登录的不能看到之前的消息
41             if(pulogintime.before(psendtime)){
42                 out.print("<li>"+msg);
43             }
44         }
45     }
46 %>
47 </body>
48 </html>
publicoc.jsp

 

 

 

                私聊发送消息框界面send1.jsp

实验三 内置对象使用(简易聊天室) 随笔 第13张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.util.*" %>
 4 <%@page import="java.text.SimpleDateFormat"%>
 5 <%
 6     request.setCharacterEncoding("UTF-8");
 7 %>
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11 <meta charset="UTF-8">
12 <title>私聊消息框</title>
13 <script type="text/javascript">
14 <!-- 保存选中下拉列表的值 -->
15 function save() {
16     radios = document.getElementsByName("privateusers");
17     for (i = 0; i < radios.length; i++) {
18         if (radios[i].checked) document.cookie = 'radioindex =' + i;
19     }
20 }
21 window.onload = function () {
22     var cooki = document.cookie;
23     if (cooki != "") {
24         cooki = "{\"" + cooki + "\"}";
25         cooki = cooki.replace(/\s*/g, "").replace(/=/g, '":"').replace(/;/g, '","');
26         var json = eval("(" + cooki + ")"); //将coolies转成json对象
27         document.getElementsByName("privateusers")[json.radioindex].checked = true;
28     }
29     else
30         save();
31 }
32 </script>
33 </head>
34 <body bgcolor="CornflowerBlue">
35 <form action="" method="post">
36 <select name="privateusers">
37 <% 
38     response.setHeader("Refresh", "10");
39     String nowuser=(String)session.getAttribute("user");
40     ArrayList<String> olusers=(ArrayList<String>)application.getAttribute("users");
41     if(olusers.size()==1){
42         %>
43     <option value="当前没有在线用户" >当前没有在线用户</option>    
44     <% }
45     else{
46         for(int i=0;i<olusers.size();i++){
47             String oluser=(String)olusers.get(i);
48             if(!oluser.equals(nowuser)){
49                 %><option value=<%=oluser%> onclick="save()"><%=oluser %></option>
50                 <% 
51             }
52         }
53     } 
54     %>  
55 </select>
56 <div>当前用户:<%=(String)session.getAttribute("user") %></div>
57 <p align="right">
58 <textarea name="privatemsg" rows="3" cols="45"></textarea><br/><br/>
59 <input type="submit" name="send" value="发送">&nbsp;&nbsp;&nbsp;&nbsp;
60 <input type="button" name="exit" value="退出" onclick="parent.location.href='clean.jsp'">
61 </p>
62 </form>
63 <%
64     //获取聊天时间
65     Date data=new Date();
66     SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
67     String dd=format.format(data);
68     //获取接受者
69     String reciver=request.getParameter("privateusers");
70     //out.print(reciver);
71     //获取发送者
72     String  sender=(String)session.getAttribute("user");
73     //获取消息框里的内容
74     String privatemsg = request.getParameter("privatemsg");
75     //获取application中的私聊消息集合
76     ArrayList<String> privatemsgs=(ArrayList<String>)application.getAttribute("privatemsgs");
77     //实例化私聊信息
78     if(privatemsgs == null){
79         privatemsgs = new ArrayList<String>();
80     }
81     
82     if(reciver!=null && !reciver.equals("当前没有在线用户")){/*接收者被选定,接收者不能为“当前没有在线用户”*/
83         //判断消息框是否输入了消息,只用当输入了消息才保存到列表中
84         if(privatemsg!=null && !privatemsg.equals("")){
85             String msg=dd+"&nbsp;"+sender+"#"+reciver+"&nbsp;"+privatemsg+"<br/>";
86             privatemsgs.add(msg);
87             application.setAttribute("privatemsgs", privatemsgs);
88         }
89     }
90 %>
91 </body>
92 </html>
send1.jsp

 

 

                私聊消息显示框界面privateoc.jsp

实验三 内置对象使用(简易聊天室) 随笔 第15张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.util.*" %>
 4 <%@page import="java.text.SimpleDateFormat"%>
 5 <%
 6     request.setCharacterEncoding("UTF-8");
 7 %>
 8 <!DOCTYPE html>
 9 <html>
10 <head>
11 <meta charset="UTF-8">
12 <title>私聊</title>
13 </head>
14 <font size="30px" color="DodgerBlue">私人聊天室</font>
15 <body background="img/oc2.jpg">
16 <%
17     //私聊消息
18     response.setHeader("Refresh", "2");
19     //获取用户登录时间
20     String lgdate=(String)session.getAttribute("loginDate");
21     SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
22     Date logintime =df.parse(lgdate);
23     //获取消息集合,接受者集合,发送者集合
24     ArrayList<String> privatemsgs = (ArrayList<String>) application.getAttribute("privatemsgs");
25     if(privatemsgs == null){
26         privatemsgs=new ArrayList<String>();
27     }
28     //获取当前用户
29     String user=(String)session.getAttribute("user");
30     //判断
31     if(privatemsgs != null){
32         for(int i=0;i<privatemsgs.size();i++){
33             String msg=(String)privatemsgs.get(i);
34             //substring() 方法用于提取字符串中介于两个指定下标之间的字符。
35             //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
36             // lastIndexOf 是从右向左查某个指定的字符串在字符串中最后一次出现的位置(也就是从后往前查)
37             String date=msg.substring(0,msg.indexOf("&nbsp;"));
38             String sender=msg.substring(msg.indexOf("&nbsp;")+6,msg.indexOf("#"));
39             String reciver=msg.substring(msg.indexOf("#")+1,msg.lastIndexOf("&nbsp;"));
40             String msg1=msg.substring(msg.lastIndexOf("&nbsp;"));
41             Date sdate=df.parse(date);
42             if(sender.equals(user)){
43                 if(logintime.before(sdate)){
44                     out.print(date+"<br/>"+"你对"+reciver+"说:"+msg1);
45                 }
46             }
47             if(reciver.equals(user)){
48                 if(logintime.before(sdate)){
49                     out.print(date+"<br/>"+sender+"对你说:"+msg1);
50                 }
51             } 
52         }
53     }    
54 
55 %>
56 </body>
57 </html>
privateoc.jsp

 

 

 

                用户退出清除用户界面clean.jsp

实验三 内置对象使用(简易聊天室) 随笔 第17张
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@page import="java.util.*" %>
 4 <%
 5     request.setCharacterEncoding("UTF-8");
 6 %>
 7 <!DOCTYPE html>
 8 <html>
 9 <head>
10 <meta charset="UTF-8">
11 <title>注销用户</title>
12 </head>
13 <body>
14 <% 
15     //从application作用域中取出用户列表
16     ArrayList<String> users=(ArrayList<String>)application.getAttribute("users");
17     String username=(String)session.getAttribute("user");
18     //从用户列表中删除该用户
19     users.remove(username);
20     application.setAttribute("users",users);
21     //注销该用户的会话
22     session.invalidate();
23     response.sendRedirect("login.jsp");
24 %>
25 
26 </body>
27 </html>
clean.jsp

 

 

 

              六、结果展示 

实验三 内置对象使用(简易聊天室) 随笔 第19张实验三 内置对象使用(简易聊天室) 随笔 第20张实验三 内置对象使用(简易聊天室) 随笔 第21张实验三 内置对象使用(简易聊天室) 随笔 第22张实验三 内置对象使用(简易聊天室) 随笔 第23张实验三 内置对象使用(简易聊天室) 随笔 第24张

        有不足的地方欢迎大家指教!!      

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄