关闭

黑马day14 踢人小案例

标签: 监听器
779人阅读 评论(0) 收藏 举报
分类:

本案例介绍:

  使用监听器来实现踢人小案例,只有管理员才有踢人的功能。

1.搭建开发环境,导入本案例需要的jar包,以及一个准备好的数据库工具类:提供数据源的方法...其中我已经在数据库中添加了三个用户

a:123

b:123

admin:123

package com.itheima.util;
import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtil {
	private static DataSource source = new ComboPooledDataSource();
	private DataSourceUtil() {
	}
	public static DataSource getSource(){
		return source;
	}
	public static Connection getConn(){
		try {
			return source.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}
我使用的是c3po的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/day14?generateSimpleParameterMetadata=true</property>
    <property name="user">root</property>
    <property name="password">169500</property>
  </default-config>
</c3p0-config>

  

2.建立主页页面,如果没有登陆就提供登陆的超链接。如果登陆成功就欢迎用户,同时提供注销的超链接,和用户列表在线用户的超链接。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  
    
    <title></title>
    
	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	
  </head>
  
  <body>
    <c:if test="${sessionScope.user==null }">
    	欢迎游客...<a href="${pageContext.request.contextPath }/login.jsp">请登录</a>
    </c:if>
    <c:if test="${sessionScope.user!=null }">
    	欢迎${sessionScope.user.name}<a href="${pageContext.request.contextPath }/servlet/LogoutServlet">注销</a><br>
    	<a href="${pageContext.request.contextPath }/userList.jsp">在线用户列表</a>
    </c:if>
  </body>
</html>
3.开发登陆login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>
    <h1>登录页面</h1><hr>
    <form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="post">
    	用户名:<input type="text" name="name"/><br>
    	密码:<input type="password" name="password"/>
    	<input type="submit" value="提交"/>
    </form>
  </body>
</html>
运行演示:




4.开发jsp的action的LoginServlet:

步骤:

(1).获取请求参数,我使用的是post提交方式

(2).验证用户和密码和数据库中的是不是一直,如果不一致就提示用户信息不存在,如果一致,就把user添加到session域中...

(3).请求转发到主页,欢迎用户...

package cn.itheima.web;

import java.io.IOException;
import java.sql.SQLException;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import cn.itheima.domain.User;

import com.itheima.util.DataSourceUtil;

public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		//1.获取请求参数
		String name = request.getParameter("name");
		String password = request.getParameter("password");
		//2.验证密码和数据库中的是否一致
		User user=null;
		try {
			QueryRunner runner=new QueryRunner(DataSourceUtil.getSource());
			String sql="select * from user where name=? and password=?";
			user=runner.query(sql, new BeanHandler<User>(User.class),name,password);
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException();
		}
		//3.检验
		if(user==null){
			response.getWriter().write("用户名不存在!");
		}else{
			//将另一个同名同密码的用户挤下去
			ServletContext context = this.getServletContext();
			HashMap<User, HttpSession> usermap = (HashMap<User, HttpSession>) context.getAttribute("usermap");
			HttpSession session = usermap.get(user);
			if(session!=null){
				session.invalidate();
			}
			request.getSession().setAttribute("user", user);
			response.sendRedirect(request.getContextPath()+"/index.jsp");
		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

5.注销的功能:LogoutServlet

  把session中的user干掉即可

package cn.itheima.web;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogoutServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		if(request.getSession(false)!=null){
			request.getSession().invalidate();
		}
		//重定向到主页
		response.sendRedirect(request.getContextPath()+"/index.jsp");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
6.为了实现踢人的功能:而每个人登陆的session只是自己的,为了拿到所有用户的session,因此当应用加载完毕的时候就在ServletContext域中放一个usermap对象...

我们使用监听器:监听器的配置我就不多说了,在web.xml文件中配置即可...

package cn.itheima.listener;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpSession;

import cn.itheima.domain.User;

public class ServletContextListener implements javax.servlet.ServletContextListener{

	public void contextInitialized(ServletContextEvent sce) {
		ServletContext context = sce.getServletContext();
		context.setAttribute("usermap", new HashMap<User, HttpSession>());
		System.out.println("监听了!..........");
	}
	public void contextDestroyed(ServletContextEvent sce) {
	}

}
7.当用户在session域中放一个user用户的时候我们需要user这个javaBean自己探测到因此需要使用HttpSessionBindingListener接口:

登陆的时候就添加session到application域中,注销的时候就移除..重写hashcode和equal方法为了是用户名和密码相同我们视为同一个对象。

package cn.itheima.domain;

import java.io.Serializable;
import java.util.HashMap;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class User implements Serializable,HttpSessionBindingListener{
	private int id;
	private String name;
	private String role;
	private String password;
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getRole() {
		return role;
	}
	public void setRole(String role) {
		this.role = role;
	}
	//当session中被绑定了对象的时候就往域对象中添加
	public void valueBound(HttpSessionBindingEvent event) {
		HttpSession session = event.getSession();
		ServletContext context = session.getServletContext();
		HashMap<User, HttpSession> map=(HashMap<User, HttpSession>) context.getAttribute("usermap");
		map.put(this, session);
	}
	//注销的时候就移除
	public void valueUnbound(HttpSessionBindingEvent event) {
		HttpSession session = event.getSession();
		ServletContext context = session.getServletContext();
		HashMap<User, HttpSession> map=(HashMap<User, HttpSession>) context.getAttribute("usermap");
		map.remove(this);
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		User other = (User) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}

8.在LoginServlet中我们登陆的时候将同用户名和密码的挤下线...见第6步骤

9.编写用户列表:

在这里判断用户是不是admin如果是admin就提供踢人的功能。这里主要是遍历application域中的在线的用户..

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  
    
    <title></title>
    
	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	
  </head>
  <h1>用户列表</h1><hr>
  	<c:forEach items="${applicationScope.usermap}" var="entry">
  		${entry.key.name }
		<c:if test="${sessionScope.user.role=='admin'}">
			<a href="${pageContext.request.contextPath }/servlet/KickServlet?id=${entry.key.id }">踢人</a>
		</c:if>
		<br>
  	</c:forEach>
</html>
10.编写踢人的servlet,把id带到servlet:

通过id查询出用户然后将其从usermap干掉即可...

package cn.itheima.web;

import java.io.IOException;

import java.sql.SQLException;
import java.util.HashMap;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import com.itheima.util.DataSourceUtil;

import cn.itheima.domain.User;

public class KickServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1.获取id
		String  id = request.getParameter("id");
		//2.根据id查询用户
		String sql="select * from user where id= ? ";
		User user=null;
		QueryRunner runner=new QueryRunner(DataSourceUtil.getSource());
		try {
			user=runner.query(sql, new BeanHandler<User>(User.class),id);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		ServletContext context = this.getServletContext();
		HashMap<User, HttpSession> map=(HashMap<User, HttpSession>) context.getAttribute("usermap");
		 HttpSession session = map.get(user);
		if(session!=null)
		session.invalidate();
		response.sendRedirect(request.getContextPath()+"/userList.jsp");
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
11.运行结果分析:




踢人a





0
0
查看评论

黑马day14 监听器之踢人小案例

参考:http://blog.csdn.net/u014010769/article/details/46790351 本案例介绍:   使用监听器来实现踢人小案例,只有管理员才有踢人的功能。 1.搭建开发环境,导入本案例需要的jar包,以及一个准备好的数据库...
  • qq_20597149
  • qq_20597149
  • 2017-08-31 10:38
  • 46

黑马day14 过滤器之自动登录小案例

自动登录分析: 如果是第一次登陆就把user放到session域中,同时建立一个cookie把用户名和密码保存到cookie中,然后写一个过滤器, 如果是未登录的状态就把cookie中把用户名和密码拿出来和数据库中查询的作比较,如果一致就把user设置到session域中。 1.登陆页面log...
  • u014010769
  • u014010769
  • 2015-07-07 18:40
  • 679

黑马day14 监听器理论知识

监听器:这里的监听器跟java基础中学习的监听器差不多,只不过这里的监听器是javaEE的,因此注册监听器的步骤也不一样: 写一个监听器的步骤: (1).写一个类实现监听器接口... (2).在web.xml文件中进行注册监听器.... javaEE的监听器分类:一共8种,分为3类 (1)...
  • u014010769
  • u014010769
  • 2015-07-06 17:01
  • 480

黑马day15 仿网盘案例

项目介绍:   本项目主要完成文件的上传以及下载的功能的一个综合案例. 1.搭建环境...    导入jar包以及开发的工具类...    jar包: 提供俩个工具类..一个是IOUtils主要提供了输出流和输入流的对接,和关闭流资源的...
  • u014010769
  • u014010769
  • 2015-07-09 21:50
  • 775

PHP之深度剖析:网站唯一登录,踢人效果

PHP之深度剖析:网站唯一登录,踢人效果
  • netuser1937
  • netuser1937
  • 2017-01-24 14:01
  • 1219

7.3 结构化文档表示

7.3 结构化文档表示       我们将在这一节设计的数据结构从 HTML 格式获得灵感,这是大家熟悉的,并成功创建文档的语言。就像 HTML,我们的表示有几种类型的内容,并且可能以适当的方法嵌套某些部分。图 7.3 显示了带注释的示例文档,它可以给你一...
  • hadstj
  • hadstj
  • 2011-06-06 18:28
  • 389

两个管理的故事(踢猫效应&火鸡的故事)

踢猫效应:不对下属发泄自己的不满,避免泄愤连锁反应。     在心理学上,“踢猫效应”是这样说的:一父亲在公司受到了老板的批评,回到家就把沙发上跳来跳去的孩子臭骂了一顿。孩子心里窝火,狠狠去踹身边打滚的猫。猫逃到街上正好一辆卡车开过来,司机赶紧避让,却把路边的孩子撞伤了。...
  • juliefish
  • juliefish
  • 2013-11-01 16:44
  • 2742

黑马程序员——Java基础---练习题

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- Java基础---练习题 1.写出程序结果class Demo { public static void func() { try { { throw new Exc...
  • liu007004
  • liu007004
  • 2015-01-19 16:35
  • 704

bzoj 1563: [NOI2009]诗人小G

四边形不等式,黑书讲的很详细,但其中有一些小错误==… f[j]=min(f[i]+(sum[j]-sum[i]+(j-i-1)-T)^P)) 首先我们要证明 w(i,j)=(sum[j]-sum[i]+(j-i-1)-T)^P 满足凸四边形不等式: w(i,j+1)+w(i+1,j+1)&l...
  • limboman
  • limboman
  • 2016-06-21 18:47
  • 574

黑马day14 过滤器之解决所有乱码

关于乱码的产生以及如何解决乱码请看我的博客字节乱码, 字符乱码,表单提交get&post乱码 这里主要使用一个过滤器可以解决上述的所有乱码: 1.过滤乱码的过滤器: package cn.itheima.filter; import java.io.IOException; ...
  • u014010769
  • u014010769
  • 2015-07-07 15:29
  • 666
    个人资料
    • 访问:208652次
    • 积分:4429
    • 等级:
    • 排名:第8030名
    • 原创:242篇
    • 转载:4篇
    • 译文:0篇
    • 评论:39条
    友情链接