简易聊天室的设计 --- JSP

目录

1.数据库设计

这里用MySQL数据库,借助phpstudy可快速安装

列名类型长度备注
idsmallint10主键
usernamevarchar10用户登录名
passwordvarchar10登录密码
namevarchar15用户姓名
sexvarchar2

用户性别  

建一个test数据库

create database test;

建表

create table user(
id smallint(10) NOT NULL auto_increment PRIMARY KEY,
username varchar(10) default NULL,
password varchar(10) default NULL,
name varchar(15) default NULL,
sex varchar(2) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入几条用户数据 

insert into user values('1', '历', '123', '阿良良木历', '男');
insert into user values('2', '吸血鬼', '123', '忍野忍', '女');
insert into user values('3', '毒舌', '123', '战场原黑仪', '女');
insert into user values('4', '班长', '123', '羽川翼', '女');

2.连接数据库的JavaBean

首先引入mysql的jdbc驱动jar包,放在 \WebRoot\WEB-INF\lib\ 目录下面

该 JavaBean 提供了连接数据库的方法 getConnction()

/src/bean/Dbcon.java 

package bean;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBcon {
	private static final String DRIVER_CLASS = "com.mysql.cj.jdbc.Driver";
	private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
	private static final String DATABASE_USRE = "root";
	private static final String DATABASE_PASSWORD = "123456";
	
	public static Connection getConnction() { //返回连接
		Connection dbCon= null;
		try {
			Class.forName(DRIVER_CLASS);
			dbCon = DriverManager.getConnection(DATABASE_URL,DATABASE_USRE, DATABASE_PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dbCon;
	}
}

3.用户登录程序设计

编写 javascript ,定义一个检查表单中是否将用户名和密码输入完整的函数 fnc()
当聊天者按“登录”按钮后,会调用 fnc()方法进行
如果用户名和密码输入不完整,则给出提示
如果输入完整则提交给 checkuser.jsp 进行数据库用户正确性验证,提交时会携带表示用户名和和密码的“loginname”和“password”参数

/WebRoot/index.jsp

<%@ page import="java.util.*" contentType="text/html;charset=utf-8"%>
<html>
<head>
	<title>登录</title>
</head>
<body>
	<div style="text-align:center;font-weight:bold">聊天室登录</div>
	<div style="text-align:center">
		<form name="frm" method="post" action="checkuser.jsp">
			<label><b>用户名:</b></label>
			<input type="text" name="loginname"><br><br>
			<label><b>密 码:</b></label>
			<input type="password" name="password"><br><br>
			<input type=button value='登录' onclick="fnc()">
		</form>
	</div>
	<Script>
		function fnc() {
			if (frm.loginname.value == "" || frm.password.value == "") {
				window.alert("请输入用户名与密码!");
				document.frm.elements(0).focus(); //表单中的第一个输入框可以获得焦点
				return;
			}
			frm.submit();
		}
	</Script>
</body>
</html>

 /WebRoot/checkuser.jsp

<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="utf-8"%>
<jsp:useBean id="db" class="bean.DBcon" scope="request"/>
<html>
<body>
<%  //登录数据库,进行用户验证
	Connection con = db.getConnction();
	Statement stmt = con.createStatement();
	ResultSet rs = stmt.executeQuery("select * from user"+" where username = '" + request.getParameter("loginname") + "'");
	if(!rs.next()) //用户验证失败,提示重新登录
	{
%>
	<div>很遗憾,数据库中没有"<%=request.getParameter("loginname")%>"这个用户!<br>
	<a href="index.jsp">请重新登录!</a>
	</div>
<%
	}
	else //用户验证成功
	{
%>
	<div>
		<div><%= rs.getString("name") %> 同学,登录成功!</div>
		<div>您的登录名是:<%=request.getParameter("loginname")%></div>
		<div>您的 IP 地址是:<%= request.getRemoteAddr()%></div>
	</div>
<%
	String name=rs.getString("name");
	String sex=rs.getString("sex");
	session.setAttribute("name",rs.getString("name"));
	session.setAttribute("sex",rs.getString("sex"));
	String opwin="login.jsp?name=" + name + "&sex=" + sex;
%>
	<script>
		function opwinfnc(){
			window.open("<%=opwin%>","_blank");
		}
	</script>
	<div>
		<button name="chatbutton" onclick="opwinfnc()">进入聊天室</button>
	</div>
<%
	}
	rs.close();
	stmt.close();
	con.close();
%>
</body>
</html>

4.进入聊天室的准备工作

通过 window.open()方法打开的聊天窗口中,首先载入的是 login.jsp
它进行聊天室程序的个性化信息和公共信息的初始化工作
将聊天者的姓名和性别存入 session 对象,对 application 对象中的相关数据进行初始化与维护
在application中以属性的形式创建三个字符串数组(talki,visitnami,visitsexi),分别保存聊天记录、聊天者姓名和性别
完成所有准备工作后转到聊天室窗口程序 frame.jsp

/WebRoot/login.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="java.util.Date,java.text.SimpleDateFormat"%>
<%
	String guestname=request.getParameter("name");
	String guestsex=request.getParameter("sex");
	session.setAttribute("nam0",guestname);
	session.setAttribute("sex0",guestsex);
	int i = 0, talker = 0; //talker用于计算聊天室人数的变量
	Object talk = null;
	Object visitnam = null;
	Object visitsex = null;
	//调整聊天室的人数,talker为聊天室人数,存于 application
	String talkerstr=(String)application.getAttribute("talker");
	if(talkerstr == null) {
		//如为第一位进入聊天室,则聊天室人数 talker 置 1
		//同时,在 application 中设定可保存的聊天语句数 sentence为 50 条,超出 50 条时则按先进先出规则替换
		application.setAttribute("talker", "1");
		application.setAttribute("sentence", "50");
	} else {
		talker = Integer.parseInt(talkerstr); //否则,聊天室人数 talker+1
		application.setAttribute("talker", String.valueOf(talker+1));
	}
	//sentence是在 application中设定的可保存的聊天语句数
	String sentencestr = (String)application.getAttribute("sentence");
	int sentence = Integer.parseInt(sentencestr);
	//为保存聊天语句准备空间
	//如为第一位聊天者,则初始化发言记录的整个空间
	if(talker == 0) {
		for(i=1;i<=sentence;i++) {
			application.setAttribute("talk"+i,"");
			application.setAttribute("visitnam"+i,"");
			application.setAttribute("visitsex"+i,"");
		}
	} else{ 
		//如已有发言,则将所有发言记录数组及姓名、性别数组向后挪一格,为填入新进人员欢迎词及新进人员姓名、性别挪出空间
		for(i = sentence; i >= 2; i--) {
			talk = application.getAttribute("talk"+(i - 1));
			application.setAttribute("talk"+i, talk);
			visitnam = application.getAttribute("visitnam"+(i - 1));
			application.setAttribute("visitnam"+i, visitnam);
			visitsex = application.getAttribute("visitsex"+(i - 1));
			application.setAttribute("visitsex"+i, visitsex);
		}
	}
	//聊天记录数组的首行,填入新进人员的姓名和性别
	application.setAttribute("visitnam1", guestname);
	application.setAttribute("visitsex1", guestsex);
	//构建欢迎词,作为一条发言填入首行
	String tking = null;
	Date dat = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss");
	String tim=sdf.format(dat);
	tking = "<tr><td bgcolor = 'yellow' align='left'>欢迎"+guestname+"! "+tim+"</td></tr>";
	application.setAttribute("talk1", tking);
	//客户端跳转到聊天显示页面
	response.sendRedirect("frame.jsp");
%>

5.创建聊天窗口框架

聊天室窗口界面设计 

将聊天室窗口分成三个子窗口 frame0、frame1、frame2  

使用 Session 对象存放聊天者自己的姓名、性别等个人信息
使用 Application 对象存放聊天室的公共信息,例如所有人的发言记录、聊天室成员等等 

这里我使用jquery实现页面的局部刷新, frame0和frame2每3秒刷新一次,frame1不刷新
jquery下载地址

在WebRoot目录下创建一个jquery文件夹,将下载完的jquery.js文件放入该文件夹中
导入该文件Syntax error on token "catch", Identifier expected报错的解决方案

/WebRoot/frame.jsp

<%@ page contentType="text/html; charset=utf-8" import="java.util.Date,java.text.SimpleDateFormat"%>
<%
	//取出在 login.jsp页面存入的本人姓名和性别
	String guestnam = (String)session.getAttribute("nam0");
	String guestsex = (String)session.getAttribute("sex0");
%>
<html>
<head>
	<title>欢迎<%= guestnam%>进入聊天室</title>
</head>
<body>
	<div style="width:100%;height:100%;border:3px solid brown;">
      <div style="width:80%;height:100%;float:left">
        <div id="frame0" style="width:100%; height:60%;overflow-y:auto;">
        	<%
			//先从 application对象中获取聊天室人数"talker"
			String talkerstr=(String)application.getAttribute("talker");
			%>
			<div style="color:green">
				<h4>【现在聊天室中有<%=talkerstr%>位访问者】</h4>
			</div>
			<table>
			<%  
				//从 application对象中获取可保存的聊天语句数 sentence
				String sentencestr = (String) application.getAttribute("sentence");
				int sentence = Integer.parseInt(sentencestr);
				//循环输出 application 对象中的所有聊天语句 talki
				for(int i = 1; i <= sentence; i++){
					String content = (String)application.getAttribute("talk" + i);
					//发言内容为null,就不输出
					if(content == null) continue;
					%>
						<tr><%= content %></tr>
					<%
				}
			%>
			</table>
        </div>
        <div id="frame1" style="width:100%;height:40%;border-top:3px solid brown;padding:5px 5px">
        	<form name=frm1 action="talking.jsp" method="post" target="fram0">
				<%= guestnam %>:<br>
				<textarea rows="2" cols="60" name="txttalk"></textarea><br><br>
				<button onclick="chk()">发言</button>
				<button name="reset1" type="reset">清除</button>&nbsp;
			</form>
			<form name=frm2 action="logout.jsp" method="post">
				<button type="submit" onclick="lgot()">退出聊天</button>
			</form>
        </div>
      </div>
      <div id="frame2" style="width:19%;height:100%;float:right;border-left:3px solid brown;padding:1px 1px">
      	<div style="color:blue">
			聊天室人员
			<hr>
			<%
			int talker = Integer.parseInt(talkerstr);
			for(int i = 1; i <= talker; i++) {
			%>
			<%= application.getAttribute("visitnam" + i)%>
			<%= application.getAttribute("visitsex" + i)%><br>
			<%
			}
			%>
		</div>
      </div>
    </div>
    <script src="jquery/jquery.js"></Script>
    <script>
	    // frame0和frame2每3秒刷新一次
		setInterval(function() { 
		    $("#frame0").load(location.href+" #frame0>*","");
		    $("#frame2").load(location.href+" #frame2>*","");
		}, 3000);
		function chk(){
			if(frm1.txttalk.value == ""){
				return;
			} else {
				frm1.submit();
				frm1.txttalk.value == "";
			}
		}
		function lgot(){
			top.close();
		}
	</Script>
</body>
</html>

6.聊天信息处理

在 fram1 框架的“发言”文本框中输入了发言内容后,单击“发言”按钮,便将含有发言信息的表单提交给 talking.jsp 进行处理

/WebRoot/talking.jsp 

<%@ page import="java.util.Date,java.text.SimpleDateFormat" contentType="text/html;charset=utf-8" %>
<%
	String guestnam = (String) session.getAttribute("nam0");
	//整体向后挪一行,本次发言填入首行;application 中的"sentence"为设定的聊天语句数。
	String sentencestr = (String) application.getAttribute("sentence");
	int sentence = Integer.parseInt(sentencestr);
	for(int i = sentence; i >= 2; i--){ 
		String talk = (String)application.getAttribute("talk" + (i - 1));
		application.setAttribute("talk" + i, talk);
	}
	String[] strNow3 = new SimpleDateFormat("HH:mm:ss").format(new Date()).toString().split(":");		
	String hour = strNow3[0];			    //获取时(24小时制)
	String minute = strNow3[1];			    //获取分
	String second = strNow3[2];			    //获取秒
	String tim = hour + ":" + minute + ":" + second;
	//接收 frame1 传来的发言("txttalk"),前后加入姓名和时间,填入记录数组首行.
	String talking = "<td>" + guestnam +"【"+tim+"】:" +request.getParameter("txttalk") + "</td>";
	application.setAttribute("talk1", talking);
	response.sendRedirect("frame.jsp");
%>

7.退出机制

在 fram1 框架中,还有一个退出表单 frm2,该表单中只有一个名为“退出聊天”的按钮
单击“退出聊天”按钮,程序便提交给 logout.jsp 进行退出处理 

 /WebRoot/logout.jsp

<%@ page contentType="text/html; charset=utf-8" import="java.util.Date,java.text.SimpleDateFormat"%>
<%
	String guestnam = (String) session.getAttribute("nam0");  //拿到退出聊天者的姓名
	String talk = null;
	Object visitnam = null;
	Object visitsex = null;
	String visittmp = null;
	String vnmtmp = null;
	String sentencestr = (String) application.getAttribute("sentence");
	int sentence = Integer.parseInt(sentencestr);
	String tmp;
	int kint=0;
	//由于 visitnami 要退出聊天室,所以要将这个姓名连同性别从 application 对象中删除
	for(int i = 1; i <= sentence; i++){
		tmp=(String)application.getAttribute("visitnam"+i);
		if(tmp.equals(guestnam)) 
			kint = i;
	}
	//删除的方法是将在它后面的姓名连同性别依次向前挪动一个位置
	for(int i = kint; i <= sentence; i++){
		tmp=(String) application.getAttribute("visitnam"+(i+1));
		application.setAttribute("visitnam"+i,tmp);
		tmp=(String) application.getAttribute("visitsex"+(i+1));
		application.setAttribute("visitsex"+i,tmp);
	}
	application.setAttribute("visitnam"+sentence,"");
	application.setAttribute("visitsex"+sentence,"");
	//将所有 talki后移一位,留出第一个位置存放离开谢词
	for(int i = sentence; i >= 2; i--){
		talk = (String)application.getAttribute("talk" + (i - 1));
		application.setAttribute("talk" + i, talk);
	}
	Date dat = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD HH:mm:ss");
	String tim=sdf.format(dat);
	String tking;
	tking = "<tr><td bgcolor = cyan align=left>谢谢"+guestnam+"光顾! 离开时间:"+tim+"</td></tr>";
	application.setAttribute("talk1", tking);
	//将聊天室中的人数 talker减 1,再存入 Application 对象的 talker属性中
	String talkerstr = (String)application.getAttribute("talker");
	int talker = Integer.parseInt(talkerstr);
	application.setAttribute("talker", String.valueOf(talker - 1));
%>
<html>
<head>
<script>
function logoutcls(){
	self.close();  //关闭本操作窗口
}
</script>
</head>
<body onload="logoutcls()"></body>
</html>

8.设计过滤器统一解决参数传递时可能出现的中文乱码问题

/src/filter/CharacterEncodingFilter.java 

package filter;
import java.io.IOException;
import javax.servlet.*;

public class CharacterEncodingFilter implements Filter {
	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) 
			throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");    	//设置获取请求参数时所使用的编码集合
		chain.doFilter(request, response);
	}
	public void init(FilterConfig arg0) throws ServletException {
	}
}

web.xml中对过滤器进行配置,代码如下,放在<web-app></web-app>里面

<filter>
    <filter-name>character</filter-name>
    <filter-class>filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>character</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

9.效果演示 

我这里用两个不同浏览器模拟(数据库记得打开)

 ps: 有点小bug,会多一个聊天室的窗口,也不知道是因为什么。。。o(╥﹏╥)o

  • 5
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
简易聊天室本次实验的目的是通过以下题目掌握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是一种Java技术,可以用于动态生成网页。本文将介绍如何使用JSP实现一个新闻网站的设计代码。 项目背景 新闻网站是一种非常常见的网站类型,该网站需要动态生成新闻列表以及新闻详情页等。我们可以使用JSP创建一个这样的网站,并通过学习相关技术实现一个美观又实用的新闻网站。 技术实现 1. 实现新闻列表页 我们可以使用JSP的内置对象来动态生成新闻列表页。我们需要首先连接数据库,从数据库中获取新闻数据,并将其展示在网页上。以下是展示新闻列表的基础代码: ``` <%! //定义一个连接池 DataSource dataSource = null; //连接数据库并获取连接 Connection con = null; //定义一个记录结果集的变量 ResultSet rs = null; //定义一个PreparedStatement对象 PreparedStatement ps = null; //从数据库中获取新闻数据 String sql = "select * from news"; try{ //获取连接池 dataSource = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource(); //设置连接池的参数 dataSource.setUser("root"); dataSource.setPassword("root"); dataSource.setUrl("jdbc:mysql://localhost:3306/news_db"); //获取一个连接 con = dataSource.getConnection(); //创建预编译的SQL语句对象 ps = con.prepareStatement(sql); //执行SQL语句 rs = ps.executeQuery(); //遍历结果集,将新闻数据展示在网页上 while(rs.next()){ String title = rs.getString("title"); String content = rs.getString("content"); String time = rs.getDate("time").toString(); out.println("<div class='news-item'>"); out.println("<h3 class='title'>" + title + "</h3>"); out.println("<p class='content'>" + content + "</p>"); out.println("<span class='time'>" + time + "</span>"); out.println("</div>"); } } catch(Exception e){ e.printStackTrace(); } finally{ //关闭连接和资源 rs.close(); ps.close(); con.close(); } %> ``` 2. 实现新闻详情页 当用户点击新闻列表中某一项时,应当跳转到该新闻的详情页。我们可以使用JSP的URL重写技术来实现该功能。以下是展示新闻详情页的基础代码: ``` <%! //获取当前新闻的ID String id = request.getParameter("id"); //声明一个变量用于保存新闻数据 Map<String,String> newsMap = null; //连接数据库并获取新闻数据 String sql = "select * from news where id = ?"; try{ //获取连接池 dataSource = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource(); //设置连接池的参数 dataSource.setUser("root"); dataSource.setPassword("root"); dataSource.setUrl("jdbc:mysql://localhost:3306/news_db"); //获取一个连接 con = dataSource.getConnection(); //创建预编译的SQL语句对象 ps = con.prepareStatement(sql); ps.setString(1, id); //执行SQL语句 rs = ps.executeQuery(); //将新闻数据保存在Map中 if(rs.next()){ String title = rs.getString("title"); String content = rs.getString("content"); String time = rs.getDate("time").toString(); newsMap = new HashMap<String,String>(); newsMap.put("title", title); newsMap.put("content", content); newsMap.put("time", time); } } catch(Exception e){ e.printStackTrace(); } finally{ //关闭连接和资源 rs.close(); ps.close(); con.close(); } %> <% //检测新闻数据是否存在,存在则展示在页面上 if(newsMap != null){ %> <div class='news-detail'> <h1 class='title'><%= newsMap.get("title") %></h1> <span class='time'><%= newsMap.get("time") %></span> <p class='content'><%= newsMap.get("content") %></p> </div> <% } else{ out.println("查找新闻失败!"); } %> ``` 总结 通过以上代码示例,我们可以看出使用JSP实现一个新闻网站非常的简单。我们可以使用JSP的内置对象,通过连接数据库的方式来生成动态网页,实现完整的新闻网站。当然,开发人员还可以根据实际需求,在代码中增加相关功能来实现更加实用的新闻网站。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值