一、实验目的
1、掌握各个内置对象的含义;
2、理解并熟练应用session、application对象。
二、实验内容
1、设计聊天室,在聊天室中,需要通过JSP内置对象application来实时保存特定数量的当前聊天信息。
聊天室的设计包括:用户进行登录,选择聊天室,进行聊天,退出聊天室。在聊天室中,用户只需输入一个用户名就可以进入聊天室,但是如果当前有人在使用该用户名,那么就必须换一个唯一的用户名。
具体要求:
- 用户登录成功后,程序会要求用户选择聊天室。可以不设置用户自行建立聊天室的功能,而且在聊天中途不能从一个聊天室切换到另一个聊天室。
- 进入聊天室后,用户可以从用户信息窗口看到该聊天室中所有用户的用户名,也可以在聊天窗口中看到随时更新的聊天信息。用户可以给所有人或某一个聊天用户发送公共的聊天信息,这个聊天内容大家都可以看到。用户也可以给某个用户发送私人的聊天信息,这种信息属于私聊信息,只有发送者和接收者可以看到。此外,聊天窗口还会出现一些系统公告,比如某某上站、某某离开等消息,另外用户还可以自己定义聊天信息和聊天用户信息刷新的时间间隔。
- 在用户单击“退出”按钮后,页面关闭,同时application和session中保存的信息都将丢失。
三、实验方法
1、用户登录信息使用request对象getParameter()方法得到用户登陆的一些信息;
2、公聊信息可以使用application对象,私聊信息使用session对象。
3、聊天的信息要不断刷新页面,使用户实时看到聊天信息。
4、用户退出时,有两种情况需要考虑:一是用户点击“退出”按钮,二是关闭浏览器,强制退出窗口,可查阅windows感知浏览器关闭的事件的相应方法。
四、实验过程和代码
登录界面:
3cjf3.jsp(登录界面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>聊天登陆界面</title>
<style>
body {
width: 100%;
height: 100%;
background-color: #CCFFFF;
}
input {
width: 278px;
height: 18px;
}
.but {
width: 175px;
height: 55px;
}
</style>
<script type="text/javascript">
</script>
</head>
<body>
<%
//请求获取字符串的值
String msg = (String) request.getAttribute("msg");
if (msg == null) {
msg = "";
}
%>
<form method="post" action="3check.jsp">
<div align="center">
<ul>
<!-- <i>定义斜体字 -->
<span style="font-size: 20px">用户登录/<i>LOGIN</i></span>
<hr>
<!-- 定义水平线 -->
<!-- 用标题标签发一个字符串,显示登陆时出现的问题 -->
<h1 style="color: red"><%=msg%></h1>
<img src="/img/renming.png" height="25" width="25" align="absmiddle" />
<span style="font-size: 20px">用户名:</span>
<input type="text" name="username" id="username" style="font-size: 20px" required="required"></input>
<br>
<br>
<br>
<input class="but" type="submit" name="submit" id="submit" value="登录" " style="font-size: 20px">
<input class="but" type="reset" name="reset" id="reset" value="重置" style="font-size: 20px"></input>
</div>
</form>
</body>
</html>
3check.jsp(验证用户之前是否有登录过 )
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.text.SimpleDateFormat"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>验证登陆</title>
</head>
<body>
<!-- 创建一个全局的List类型,用于存放登陆用户名列表 -->
<%!List<String> users=new ArrayList<String>(); %>
<%
//记录用户登录时间存入session
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dd = format.format(date);
session.setAttribute("loginDate", dd);
request.setCharacterEncoding("UTF-8");
//获取表单中提交过来的值
String username = request.getParameter("username");
//从applicaton取出用户列表
application.getAttribute("users");
//如果该用户列表还不存在,实例化该用户列表
if (users == null) {
users = new ArrayList<String>();
}
//查看当前列表中是否包含当前的登陆用户
if (users.contains(username)) {
//设置提示信息
request.setAttribute("msg", "该用户已经登陆,请重新登陆");
//这重定向没反应我换了个response.sendRedirect("3cjf3.jsp");
request.getRequestDispatcher("3cjf3.jsp").forward(request,response);
return;
}
//将当前登陆用户名加入该用户列表以及session
users.add(username);
application.setAttribute("users", users);
application.setAttribute("user", username);
session.setAttribute("user", username);
//验证成功重定向聊天室页面
response.sendRedirect("3frame.jsp");
%>
</body>
</html>
3frame.jsp(聊天界面框架)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>框架</title>
<!-- rows行 cols列 -->
<frameset rows="80%,*">
<frameset cols="50%,*">
<frameset cols="20%,*">
<frame src="3left.jsp" />
<frame src="priMes.jsp" />
</frameset>
<frame src="pubMes.jsp" />
</frameset>
<frame src="send.jsp" />
</head>
<body>
</body>
</html>
3left.jsp(左边显示在线人员和人数)
<!-- 左侧框架,显示在线人员 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>显示在线人员</title>
</head>
<body bgcolor="#CCFFFF">
<%
//每隔一秒刷新
response.setHeader("refresh", "1");
//从applicaton取用户列表
List<String> users = (List<String>) application.getAttribute("users");
out.print("目前在线有:" + users.size() + "人");
//遍历并显示在线用户名
for (int i = 0; i < users.size(); i++) {
String username = (String) users.get(i);
out.print("<br>" + username);
}
%>
</body>
</html>
send.jsp(下面那个发送消息的界面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@page import="java.text.SimpleDateFormat"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>发送消息</title>
</head>
<script type="text/javascript">
</script>
<body bgcolor="#CCFFFF">
<form action="" method="post">
<p align="right">
<!-- 显示当前用户以及显示发送消息对象 -->
当前用户:<%=session.getAttribute("user")%>:发送消息给:
<!-- 用选择下拉框选取接收方 -->
<select name="select">
<option value="0">所有人</option>
<%
//response.setHeader("refresh", "10");
List<String> users = (List<String>) application.getAttribute("users");
//遍历用户列表的所有用户名并显示
for (int i = 0; i < users.size(); i++) {
String username = (String) users.get(i);
%>
<!-- i=0,加1后表示第一个用户,再加1表示第二个用户,以此类推,相应的把用户名显示出来 -->
<option value="<%=i + 1%>"><%=username%></option>
<%
}
%>
</select>
<input type="text" name="message" size="50" /><br />
<!--window.parent.location.reload()是整个框架到页面都刷新-->
<input type="button" name="updata" value="刷新" onclick="javascript:window.parent.location.reload()">
<input type="submit" value="发送" />
<!-- "window.location.href"、"location.href"是本页面跳转;"parent.location.href"是上一层页面跳转";top.location.href"是最外层的页面跳转-->
<input type="button" value="退出登录" onClick="parent.location.href='3exit.jsp'" />
</form>
<%
//获取当时系统时间,显示信息发送时间
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = df.format(d);
//获取用户登录时间
String loginDate = session.getAttribute("loginDate").toString();
Date logintime =df.parse(loginDate);
//获取session用户名
String user = (String) session.getAttribute("user");
request.setCharacterEncoding("UTF-8");
//获取文本框的内容,request.getParameter()是从Web客户端传到Web服务器端
String message = request.getParameter("message");
//equest.setAttribute()传递的数据只会存在于Web容器内部
//信息存入session
session.setAttribute("message",message);
//to接收消息方
String to = "";
try {
//另外创建新列表取所有用户名的值
List<String> tmp = (List<String>) application.getAttribute("users");
//获取下拉列表的值
String SS = request.getParameter("select");
//强制类型转换问整数
int a = Integer.parseInt(SS);
if (a == 0)//当to为所有人时,表示接收方是所有人,实现群聊
to = "所有人";
else//因为从0开始且0是群聊,1代表第一个用户,2代表第二个用户,所以要a-1,最后强制转换成string类型显示tmp列表的用户名
to = (String) tmp.get(a - 1);
} catch (Exception e) {
}
//msgs是存放每一条消息的列表,为空则创建
List<String> msgs = (List<String>) application.getAttribute("msgs");
if (msgs == null) {
msgs = new ArrayList<String>();
}
//接收方
List<String> to_sb = (List<String>) application.getAttribute("private");
if (to_sb == null) {
to_sb = new ArrayList<String>();
}
//发送方
List<String> from_sb = (List<String>) application.getAttribute("S_private");
if (from_sb == null) {
from_sb = new ArrayList<String>();
}
//null是空对象,没有地址,“ ”是对象实例,一个为0的字符串,跟空格不一样
if (message != null && !message.equals("")) {
//当message有内容时,把内容加进msgs列表,并显示谁发给谁,附上发送时间,user是当前用户名,to是接收方
msgs.add( now + "<br/>"+user + "发消息给" + to + " : " + message + " 。<br><br>" );
//接收方
to_sb.add(to);
//当前用户名
from_sb.add(user);
application.setAttribute("msgs", msgs);
application.setAttribute("private", to_sb);
application.setAttribute("S_private", from_sb);
}
%>
</body>
</html>
priMes.jsp(私聊页面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@page import="java.text.SimpleDateFormat"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>私聊页面</title>
</head>
<body bgcolor="#CCFFFF">
<h1>私聊</h1>
<hr/>
<%
//获取当时系统时间,显示信息发送时间
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = df.format(d);
Date nowtime =df.parse(now);
//获取用户登录时间
String loginDate = session.getAttribute("loginDate").toString();
Date logintime =df.parse(loginDate);
//隔一秒刷新页面
response.setHeader("refresh", "1");
//获取列表和用户名
List<String> msgs = (List<String>) application.getAttribute("msgs");
List<String> to_sb = (List<String>) application.getAttribute("private");
List<String> from_sb = (List<String>) application.getAttribute("S_private");
String user=(String)session.getAttribute("user");
try{
for (int i = 0; i < msgs.size(); i++) {//遍历msgs列表
String t1 = (String) msgs.get(i);//分别获取消息,接收方,发送方
String t2 = (String) to_sb.get(i);
String t3 = (String) from_sb.get(i);
String saveTime=t1.substring(0,19);
Date msgtime=df.parse(saveTime);
//接收方为自己,或者发送方为自己,除掉接收方为所有人外显示信息
if(t2.equals(user) || t3.equals(user)){
if(!t2.equals("所有人"))
{//代表后登录进来掉用户看不到之前到聊天信息
if(logintime.before(msgtime)){
out.print(t1);
}}
}
}
}catch(Exception e){}
%>
</body>
</html>
pubMes.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@page import="java.text.SimpleDateFormat"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>群聊</title>
</head>
<body bgcolor="#CCFFFF">
<h1>群聊</h1>
<hr />
<div align="right" style="color: blue;">
<!-- 设置系统公告提示用户上线-->
<!-- <% List<String> users = (List<String>) application.getAttribute("users");%>-->
系统公告:<%=application.getAttribute("user")%>上线啦!
</div>
<%
//获取当时系统时间,显示信息发送时间
Date d = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = df.format(d);
Date nowtime =df.parse(now);
//获取用户登录时间
String loginDate = session.getAttribute("loginDate").toString();
Date logintime =df.parse(loginDate);
//隔一秒刷新页面
response.setHeader("refresh", "1");
//获取列表和用户名
List<String> msgs = (List<String>) application.getAttribute("msgs");
List<String> to_sb = (List<String>) application.getAttribute("private");
List<String> from_sb = (List<String>) application.getAttribute("S_private");
String user=(String)session.getAttribute("user");
try{
for (int i = 0; i < msgs.size(); i++) {//遍历msgs列表
String t1 = (String) msgs.get(i);//消息
String t2 = (String) to_sb.get(i);//接收方
String t3 = (String) from_sb.get(i);//发送方
String saveTime=t1.substring(0,19);
Date msgtime=df.parse(saveTime);
//如果接收方为所有人,那就显示消息
if(t2.equals("所有人"))
{//后登录的用户看不到之前的消息
if(logintime.before(msgtime)){
out.print(t1);
}
}
}
}catch(Exception e){}
%>
</body>
</html>
3exit.jsp(用户退出登录则要注销关于用户的所有信息)
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<title>退出界面</title>
</head>
<body>
<%
out.print("您已退出成功...");
//从applicaton取出用户列表
List<String> users = (List<String>) application.getAttribute("users");
//从session取出当前用户
String username = (String) session.getAttribute("user");
//从该用户列表中移除该用户
users.remove(username);
//注销该用户的会话
session.invalidate();
%>
<br>
<!-- 给隔超链接跳转登录界面 -->
<a href="3cjf3.jsp">重新登录</a>
</body>
</html>