利用jsp内置对象实现的简易聊天室

最近Java老师给我们安排了一个实验,内容如下:
在这里插入图片描述
要完成这个实验,首先要对jsp的内置对象有深刻了解,不了解的老哥可以看看这个(哔哩哔哩)jsp几大内置对象详解,实力推荐。

鉴于要实现的功能比较简单,我写了三个jsp页面,第一个是login.jsp,就是登录页面,第二个是cotainer.jsp,主页面,包括各种功能按钮,第三个是view页面,用来显示聊天信息。其中view.jsp是使用include指令嵌入到cotainer.jsp中的(用iframe也可以,但是iframe能不用就尽量不用)
下面是三个jsp页面的代码和运行截图:
1.login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>聊天室登录</title>
</head>
<style>
.div1{
	background-color:lightgreen;
	border:solid 1px black;
	width:300px;
	height:170px;
	text-align:center;
	line-height:150%
}
</style>
<body>
<div class="div1">
<%
StringBuffer view=new StringBuffer("");
session.setAttribute("view",view);
String color="balck";
session.setAttribute("Color",color);
%>
<h3>聊天室登录</h3>
<form action="cotainer.jsp" method="post">
用户名:<input type="text" name="userName"><br>
<br>
<input type="submit" value="登录">

</form>
</div>
</body>
</html>

在这里插入图片描述
2.cotainer.jsp

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
  <head>
  <style>
.div3{
	background-color:lightblue;
	border:solid 1px black;
	width:700px;
	height:600px;

	line-height:150%
}
img{
	width:15px;
	height:20px;
}
</style>
  </head>
  <body>
  <div class="div3">
  
    <%
    request.setCharacterEncoding("utf-8");
    if(request.getParameter("userName")!=null)
    {session.setAttribute("userName",request.getParameter("userName").toString());}
    	String sessionID=session.getId();
    StringBuffer users=new StringBuffer();
    //确定用户数量
        if(application.getAttribute("count")!=null)
        {
        	users=users.append(application.getAttribute("users").toString());
        	if(users.indexOf(sessionID)==-1){
        		session.setAttribute("isNew","true");
            int  userCount= Integer.parseInt(application.getAttribute("count").toString());
             userCount++;
             application.setAttribute("count",new Integer(userCount));
				users=users.append("<br>"+sessionID);
				application.setAttribute("users",users.toString());
        	}
        }
        else
        {
        	users=users.append("<br>"+sessionID);
       		application.setAttribute("users", users.toString());
        	application.setAttribute("count", "1");
            
        }
        //获取默认颜色
       String select="black";
       if(request.getParameter("Color")!=null)
		select=request.getParameter("Color").toString();
		request.setAttribute("select",select);
		//确定用户次序
		int userId=1;
		String[]userss=users.toString().split("<br>");
		for(int i=0;i<userss.length;i++){
			if(userss[i].equals(sessionID)){
				userId=i;
				break;
			}
		}
       %>
       您是第<img src="数字/<%=userId%>.png">位访问者!
       
        <jsp:include page="view.jsp" />
        <form action="cotainer.jsp" method="post">
        <input type="text" name="message">
        <input type="hidden" name="send" value="true">
        选择我的颜色:<select name="color">
 			<option value="red" ${select=="red"?'selected':''}>红色</option>
 			<option value="blue" ${select=="blue"?'selected':''}>蓝色</option>
 			<option value="green" ${select=="green"?'selected':''}>绿色</option>
 			<option value="black" ${select=="black"?'selected':''}>黑色</option>
 			<option value="yellow" ${select=="yellow"?'selected':''}>黄色</option>
 			<option value="purpole" ${select=="purpole"?'selected':''}>紫色</option>
			</select>
        <input type="submit" value="发送"> 
        </form>
        <form action="cotainer.jsp">
       	<input type="hidden" name="clear" value="true">
        	<input type="submit" value="清空"></form>
        	 <form action="cotainer.jsp">
       	<input type="hidden" name="flush" value="true">
        	<input type="submit" value="刷新"></form>
        
        <form action="login.jsp">
         <input type="submit" value="退出聊天">
         </form>
       </div> 
  </body>
</html>

在这里插入图片描述
3.view.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" import="java.text.SimpleDateFormat"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>聊天</title>
<style>
.div2{
	border:solid 1px black;
	width:600px;
	height:400px;
	overflow-y:scroll; 
}</style>
</head>
<body>

		<%request.setCharacterEncoding("utf-8");
		
		String userName = session.getAttribute("userName").toString();
		if(request.getParameter("color")!=null)
			session.setAttribute("Color",request.getParameter("color").toString());
		String color=session.getAttribute("Color").toString();
		request.setAttribute("select",color);
		StringBuffer view=new StringBuffer();
		view.append(session.getAttribute("view").toString());
			String chatTexts="";

			//判断是不是新用户
				String isNew="false";
			if(session.getAttribute("isNew")!=null){
				isNew=session.getAttribute("isNew").toString();
				session.setAttribute("isNew","false");
				}
			if(isNew.equals("false"))
			{ 
				//发送
				String send="false";
					if (request.getParameter("send") != null)
						send = "true";
					if(send.equals("true")){
					if (request.getParameter("message") != null) {
						String message = request.getParameter("message").toString();

					Date time = new Date();
					SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
					String time1 = sdf.format(time);
					String chatText ="<br>"+ userName + "["+time1 + "]:" + message;
					view.append(chatText);
					session.setAttribute("view",view.toString());
					//view存到application中
					if (application.getAttribute("chatText") != null) {
						String ss=application.getAttribute("chatText").toString();					
						StringBuffer ssb=new StringBuffer();
						ssb.append(ss);
						ssb.append(chatText);
						application.setAttribute("chatText",ssb.toString());
					}
						else{
							application.setAttribute("chatText",view.toString());
						}
			}
					}
				//清空
					String clear="false";
					if (request.getParameter("clear") != null)
						clear = "true";
					if(clear.equals("true")){
						view.delete(0,view.length());
							}
					session.setAttribute("view",view.toString());
			//刷新
			String flush="false";
			if (request.getParameter("flush") != null)
				 flush ="true";
			if (flush.equals("true")) {
				if (application.getAttribute("chatText") != null) {
					 chatTexts=application.getAttribute("chatText").toString();
					 view.delete(0,view.length());
					 view.append(chatTexts);
					 session.setAttribute("view",view.toString());
				}
				
			}
			//加颜色
					String scolor=view.toString();
					String[]a=scolor.split("<br>");
					for(int i=0;i<a.length;i++){						
						if(a[i].contains((userName+"["))){
							if(a[i].contains("<span")){
								//问题一:字符串取子串
									a[i]=a[i].substring(0,a[i].length()-7);
									int index=a[i].lastIndexOf(">");
									a[i]=a[i].substring(index+1);
								}
							a[i]="<br><span style='color:"+color+"'>"+a[i]+"</span>";
						}
						else{
							a[i]="<br>"+a[i];
						}
						
						}
					StringBuffer sb=new StringBuffer();
						for(String s:a){
							sb.append(s);
						}
						view.delete(0,view.length());
						view.append(sb.toString());
					}
				
				
		%>
<div class="div2">
<%=view.toString() %>
</div>
</body>
</html>

在这里插入图片描述
如果你们要复制我的代码演示的话注意cotainer.jsp里面会使用图片,修改一下就好了。
说一下我的各个功能实现思路
首先,在登录页面创建了一个session,键是view,值是一个StringBuffer类型的变量view。
1.发送信息时,将信息发送到view.jsp内,获取session的view,将发送的内容添加到view和application的chatText中,然后显示在页面上的是view的内容。
2.清空时,只需将view清空并放入session即可。
3.刷新时,将application的chatText取出,放入到view中并存入session。
4,加颜色,将颜色信息写入到view中的每条聊天即可。
我说一下我遇到的几个问题:
1.如何确定是不是新用户,
每个不同的浏览器首次的sessionID都是不一样的,使用application收集每个sessionID,如果有application中有相同的,说明不是新用户。
2.如何给自己的聊天信息加颜色
窗口显示的聊天信息都在view里面存放,只需将view里面的是自己发送的信息加上颜色即可。由于每条信息是有<br>隔开的,所以将整个聊天信息用split方法分成一个字符串数组,然后有遍历字符串数组找出属于自己发送的聊天信息,加上颜色,然后再组合到view里面就可以了。
下面是演示截图
1.用户1登录

在这里插入图片描述
2.用户1发送两条红色的信息
在这里插入图片描述
3.用户2登录(换一个浏览器,模拟第二个用户)
在这里插入图片描述
4.用户2刷新聊天记录,获取到用户1发送的信息
在这里插入图片描述
5.用户2发送两条黄色信息。
在这里插入图片描述
6.用户1刷新聊天记录,并回复一条消息。
在这里插入图片描述
7.用户1清空聊天框,并发送一条信息。
在这里插入图片描述
8.用户1刷新聊天记录,所有的聊天信息都又出现了。
在这里插入图片描述

  • 27
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
简易聊天室本次实验的目的是通过以下题目掌握JSP内置对象,包括:request,response,session,application等。 (1)制作简易聊天室,能够实现简单的页面聊天功能。 (2)制作网页计数器,要求相同的窗口内刷新页面访问次数并不增加,并且用图片来显数字。1、 熟悉request、response、session、application、out等内置对象; 2、 选择制作网页计数器程序需准备数字图片;1、进入jsp子目录,编写简易聊天室JSP程序,聊天室的需要实现的基本功能:输入昵称、聊天。 2.根据功能编写页面代码。二、网页计算器 利用内置对象application <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Counter.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 您是第位访问者! </body> </html> 简易聊天室本次实验的目的是通过以下题目掌握JSP内置对象,包括:request,response,session,application等。 (1)制作简易聊天室,能够实现简单的页面聊天功能。 (2)制作网页计数器,要求相同的窗口内刷新页面访问次数并不增加,并且用图片来显数字。1、 熟悉request、response、session、application、out等内置对象; 2、 选择制作网页计数器程序需准备数字图片;1、进入jsp子目录,编写简易聊天室JSP程序,聊
好的,下面是一个简单的 JSP 聊天室的示例代码: 1. 在 Web 项目的 `WEB-INF` 目录下创建 `chat.jsp` 文件,用于显示聊天记录和输入框。 ```jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>简易聊天室</title> </head> <body> <h1>简易聊天室</h1> <div id="chatArea" style="height: 400px; overflow: auto;"></div> <form> <input type="text" name="message" style="width: 80%;"> <button type="button" onclick="sendMessage()">发送</button> </form> <script> var chatArea = document.getElementById("chatArea"); // 记录当前聊天内容 var chatContent = ""; // 定时请求更新聊天记录 setInterval(function() { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { var responseText = xhr.responseText; if (chatContent != responseText) { chatContent = responseText; chatArea.innerHTML = responseText; chatArea.scrollTop = chatArea.scrollHeight; } } }; xhr.open("GET", "chatServlet", true); xhr.send(); }, 1000); // 发送聊天内容 function sendMessage() { var messageInput = document.getElementsByName("message")[0]; if (messageInput.value.trim() != "") { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { chatContent = xhr.responseText; chatArea.innerHTML = chatContent; chatArea.scrollTop = chatArea.scrollHeight; messageInput.value = ""; } }; xhr.open("POST", "chatServlet", true); xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("message=" + encodeURIComponent(messageInput.value)); } } </script> </body> </html> ``` 2. 创建一个名为 `chatServlet` 的 Servlet,用于处理聊天记录的更新和发送。 ```java import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/chatServlet") public class ChatServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 聊天记录列表 private List<String> chatList = new ArrayList<>(); protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 将聊天记录列表拼接成 HTML 格式字符串返回 StringBuilder sb = new StringBuilder(); for (String message : chatList) { sb.append("<p>").append(message).append("</p>"); } response.getWriter().write(sb.toString()); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 将客户端发送的聊天内容加入到聊天记录列表中 String message = request.getParameter("message"); if (message != null) { chatList.add(message); } doGet(request, response); } } ``` 以上就是一个简单的 JSP 聊天室实现。当用户在页面中输入聊天内容并点击发送按钮时,会通过 AJAX 请求将内容发送给 `chatServlet`,`chatServlet` 将内容加入到聊天记录列表中,并将当前的聊天记录列表拼接成 HTML 格式字符串返回给客户端,客户端再将其显示在页面中。同时,客户端还会定时向 `chatServlet` 发送 AJAX 请求,以获取最新的聊天记录。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值