黑马day14 踢人小案例
来源:互联网 发布:wind如何查询行业数据 编辑:程序博客网 时间:2024/05/29 10:05
本案例介绍:
使用监听器来实现踢人小案例,只有管理员才有踢人的功能。
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);}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + id;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic 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.获取idString 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 踢人小案例
- 黑马day14 监听器之踢人小案例
- 黑马day14 过滤器之自动登录小案例
- 黑马day14 过滤器之自动登录小案例
- 黑马程序员-day14集合
- 黑马day14 监听器理论知识
- 黑马程序员_java基础day14
- 黑马程序员-Java API-day14
- 黑马程序员-day14-集合框架
- day14-jdbc案例(简单的curd&分页)
- day14
- DAY14
- day14
- day14
- day14
- day14
- day14
- day14
- UITextView加边框
- yfgxojyp
- 每天一道算法题目(20)——复杂链表的拷贝
- Objective-C NSFileManager 文件管理总结
- C++程序设计 - Week 7 文件操作和模板
- 黑马day14 踢人小案例
- 阿里云ODPS的愿景、技术实现与难点
- CentOS6.5中利用其自带的openjdk设置JAVA_HOME
- oracle 获取数据库中所有的表的注释,获取表的所有的列的注释
- 使用LR的ODBC协议进行mysql数据库测试
- MEAN框架学习笔记
- 关于 URL 编码的知识
- 写命令+选项
- POJ 2287 && HDU 1052 Tian Ji -- The Horse Racing(贪心)