实验三 内置对象使用

一、实验目的

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

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

二、实验内容

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

聊天室的设计包括:用户进行登录,选择聊天室,进行聊天,退出聊天室。在聊天室中,用户只需输入一个用户名就可以进入聊天室,但是如果当前有人在使用该用户名,那么就必须换一个唯一的用户名。

    具体要求:

  1. 用户登录成功后,程序会要求用户选择聊天室。可以不设置用户自行建立聊天室的功能,而且在聊天中途不能从一个聊天室切换到另一个聊天室。
  2. 进入聊天室后,用户可以从用户信息窗口看到该聊天室中所有用户的用户名,也可以在聊天窗口中看到随时更新的聊天信息。用户可以给所有人或某一个聊天用户发送公共的聊天信息,这个聊天内容大家都可以看到。用户也可以给某个用户发送私人的聊天信息,这种信息属于私聊信息,只有发送者和接收者可以看到。此外,聊天窗口还会出现一些系统公告,比如某某上站、某某离开等消息,另外用户还可以自己定义聊天信息和聊天用户信息刷新的时间间隔。
  3.  在用户单击“退出”按钮后,页面关闭,同时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">
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
				<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>

猜你喜欢

转载自blog.csdn.net/fenger_c/article/details/89552741