黑马day14 监听器之踢人小案例
来源:互联网 发布:手机淘宝网退款流程 编辑:程序博客网 时间:2024/05/16 05:05
参考:http://blog.csdn.net/u014010769/article/details/46790351
本案例介绍:
使用监听器来实现踢人小案例,只有管理员才有踢人的功能。
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 监听器之踢人小案例
- 黑马day14 踢人小案例
- 黑马day14 监听器理论知识
- 黑马day14 监听器之javaBean对象的活化和钝化
- 黑马day14 监听器之javaBean对象的活化和钝化
- 黑马day14 过滤器之自动登录小案例
- 黑马day14 过滤器之自动登录小案例
- 黑马day14 监听器&监听三大域对象
- 黑马day14 过滤器之解决所有乱码
- 黑马day14 过滤器之解决所有乱码
- 黑马程序员——java之集合框架(Day14)
- 黑马程序员-day14集合
- 黑马程序员_java基础day14
- 黑马程序员-Java API-day14
- 黑马程序员-day14-集合框架
- day14 python_css之样式
- day14-jdbc案例(简单的curd&分页)
- Web开发之过滤器高级案例、监听器、观察者设计模式
- 教你如何成为Java的OOM Killer
- ionic3 导航栏返回按钮事件设置
- py faster rcnn训练 VGG_CNN_M_1024记录
- git操作add to index无效
- DNS服务说明
- 黑马day14 监听器之踢人小案例
- excel文件操作
- Struts2和SpringMVC的区别与比较总结
- 代码中特殊的注释技术——TODO、FIXME和XXX的用处
- 数学建模--Excel技巧
- LeetCode3—Longest Substring Without Repeating Characters
- Android开发艺术探究(二):IPC机制
- 配置CentOS的一些记录
- 2017第23届 中国(北京)国际墙纸墙布窗帘暨家居软装饰博览会会刊(参展商名录)