JavaWeb聊天

1、登录注册

注册登录验证码页面: https://blog.csdn.net/ChrisLee2013/article/details/82022547

这里使用的是jdbc.properties文件配置数据库

本章改为c3p0连接池

2、c3p0连接池

这里需要导入c3p0的开发包

c3p0-config.xml文件内容



	
		com.mysql.jdbc.Driver
		jdbc:mysql:///charRoom
		root
		1205755403
	

	

JdbcUtils工具类,会自动找到路径下的c3p0-config.xml文件连接数据库

public class JdbcUtils {
	
private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	
	//获取连接池
	public static DataSource getDataSource(){
		return dataSource;
	}
	
	//获取Connection对象
	public static Connection getConnection() throws Exception{
		Connection connection = dataSource.getConnection();
		return connection;
	}
	
	// 关闭操作
	public static void closeConnection(Connection connection) throws SQLException{
		if(connection != null){
			connection.close();
		}
	}
	
	public static void closeStatement(Statement statement) throws SQLException{
		if(statement != null){
			statement.close();
		}
	}
	
	public static void closeResultSet(ResultSet resultSet) throws SQLException{
		if(resultSet != null){
			resultSet.close();
		}
	}
}

3、登录成功后的页面

登录成功后跳到主页面当中

//重定向到另一个登录界面
response.sendRedirect(request.getContextPath() + "/afterLogin/main.jsp");

为了让登录到聊天室的人显示到页面上,我们将登录成功的user存放到session当中

然后通过全局共享域selvletContext获得在线人员列表

这里需要设置监听器监听

//登录成功后保存登录成功的user
request.getSession().setAttribute("loginUser", user);
//为了登录信息被所有人看到放到全局共享域中
ServletContext application = getServletContext();

4、设置全局共享域和session监听器

监听全局共享域的创建于销毁:编写一个类实现ServletContextListener接口实现监听

public class MyServletContextListener implements ServletContextListener{
	
	/*
	 * servletContext对象创建执行这个方法
	 * ServletContextEvent事件对象,监听器对象-- ServletContext对象(事件源)
	 */
	public void contextInitialized(ServletContextEvent sce) {
		//通过事件对象获得事件源对象
		ServletContext servletContext = sce.getServletContext();
		//创建userMap存放登录人员的信息和Sessiond对象
		Map userMap = new HashMap();
		servletContext.setAttribute("userMap", userMap);
	}
    ...
}

对于session的监听,我们需要将user与session绑定,所以在user类上实现HttpSessionBindingListener

public class User implements HttpSessionBindingListener{
	...
	
	//将User对象与session域对象绑定
	//将java对象往session中存放就是绑定
	//session.setAttribute("")
	//request.getSession().setAttribute("loginUser", user);
	public void valueBound(HttpSessionBindingEvent event) {
		//通过事件对象获得事件源对象
		HttpSession session = event.getSession();
		//从ServletContext中获得人员列表的Map集合
		Map userMap = (Map) session
				.getServletContext().getAttribute("userMap");
				
		//将用户对象和对应的session存入到map集合中
		//登录成功将user存入session对象中就会启动这个函数
		//this:当前登录的User
		userMap.put(this, session);
	}
	
	...
}

5、显示在线人员列表

我们已经在在线人员与其对应的session放到了“userMap”当中所以遍历userMap显示在线人员列表


	
${entry.key.username }

6、管理员踢下线功能

在不是管理员的在线人员列表上添加一个点击事件

首先判断user.type 是不是管理员是管理员的话,就不能被踢下线,不是管理员的话就踢下线

在不是管理员的成员上添加点击事件将用户名称传递,提交到kickServlet后台处理


	${ entry.key.username } 
		
			踢下线
		

kickServlet:这里有个bug!!空指针问题  妈的困了我很久!! 出现的问题一律后面说明

通过名称找到要销毁的用户将它对应的session销毁,用户就销毁了!!

 

        String username = new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8");
		//踢人从userMap当中将其对应的session销毁
		//从servletContext当中获得userMap集合
		Map userMap = (Map) getServletContext().getAttribute("userMap");
		User user = new User();
		user.setUsername(username);
		
		//从Map集合当中获得用户对应的session
		HttpSession session = userMap.get(user);
		//销毁该用户的session
		session.invalidate();
		//重定向到main.jsp
		
		response.sendRedirect(request.getContextPath() + "/afterLogin/main.jsp");

7、用户被踢下线后自动跳转到登录界面

在main.jsp中检查用户是否被踢下线

每一秒执行一次函数

window.setInterval("check()",1000);
...

function check(){
		$.post("${pageContext.request.contextPath}/CheckServlet" + new Date().getTime(),function(data){
			if(data == 1){
				// 提示用户下线了
				alert("用户已经被踢下线了!");
				// 回到登录页面!
				window.location = "${pageContext.request.contextPath}/login/login.jsp";
			}
		});
	}

CheckServlet

User user = (User) request.getSession().getAttribute("loginUser");
		
		if(user == null){
			
			response.getWriter().println("1");
		}else{
			
			response.getWriter().println("0");
		}

8、选择用户聊天

JavaWeb聊天_第1张图片

 点击除了自己以外的在线人员,将在线人员添加到聊天对象当中,在在线人员上添加点击事件

${ entry.key.username } 

function set(selectPerson)函数

//点击在线人员列表的名称,选择聊天对象
	function set(selectPerson){
		if(selectPerson != "${loginUser.username}"){
			document.form1.selectPerson.value = selectPerson;
		}else{
			alert("请重新选择聊天对象!")
		}
	}

9、输入消息进行发送

这里的button!!我又出现问题了!!


	



	

//在文本域上加了一个滚动条
#message{
	width:613;
	height:100%;
	overflow-y:scroll;
}
// 发送消息
	function send(){
		if(form1.selectPerson.value=="聊天对象"){
			alert("请选择聊天对象");
			selectPerson.focus();
			return false;
		}
		
		if(form1.sendMessage.value==""){
			alert("请输入聊天信息!");
			sendMessage.focus();
			return false;
		}
		
		$.post("${pageContext.request.contextPath}/SendMessageServlet?"+new Date().getTime(),$("#form1").serialize(),function(data){
			$("#message").html(data);
		});
		$("#sendMessage").html("");
		sendMessage.focus();
		return true;
	}

10、将发送后的消息显示在文本域中

String person = request.getParameter("person");
		String selectPerson = request.getParameter("selectPerson");
		String message = request.getParameter("sendMessage").toString();
		
		Date date=new Date();    
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String sendTime = df.format(date);
		ServletContext application = getServletContext();
		String sourceMessage = (String) application.getAttribute("chatMessage");
		
		sourceMessage += "" + person
				+ " 对"
				+ "[" + selectPerson + "] say:"
				+ message + "  ("
				+ sendTime + ")
"; application.setAttribute("chatMessage", sourceMessage); response.sendRedirect(request.getContextPath() + "/GetMessageServlet");
String message = (String)getServletContext().getAttribute("chatMessage");
		if(message != null){
			response.getWriter().println(message);
		}

代码链接

https://pan.baidu.com/s/19-zlqg9pBRtotxdb35mQ6A

你可能感兴趣的:(JavaWeb聊天)