监听器:监听器就是一个java程序,功能是监听另一个java对象变化(方法调用、属性变更)
8个监听器,分为了3种
写一个类实现响应的接口
注册监听器 -- 在web.xml中注册监听器
1.用来监听三大作用域的创建和销毁的监听器
ServletContextListener 用来监听ServletContext对象创建和销毁的监听器
创建:服务器启动,web应用加载后立即创建代表当前web应用的ServletContext对象
销毁:服务器关闭或web应用被移除出容器时,随着web应用的销毁而销毁
HttpSessionListener 用来监听HttpSession对象创建和销毁的监听器
创建:第一次调用request.getSession方法时创建代表当前会话的session对象
销毁:超过30分钟没人用销毁/调用invalidate方法自杀/服务器非正常关闭时随着web应用的销毁而销毁,如果服务器是正常关闭会被钝化起来.
当服务器正常关闭时,还存活着的session会随着服务器的关闭被以文件的形式存储在tomcat的work目录下,这个过程叫做session的钝化
当服务器再次正常开启时,服务器会找到之前的SESSIONS.ser文件从中恢复之前保存起来的session对象这个过程叫做session的活化
想要随着Session被钝化活化的对象它的类必须实现Serializable接口
ServletRequestListener 用来监听ServletRequest对象创建和销毁的监听
创建:请求开始创建代表请求的request对象
销毁:请求结束时代表请求的request对象销毁
packagecom.dzq.listener;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.annotation.WebListener;/*** 监听ServletContext创建和销毁的监听器
*@author**/@WebListenerpublic class MyServletContextListener implementsServletContextListener {
@Overridepublic voidcontextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContext对象被销毁了"+sce.getServletContext());
}
@Overridepublic voidcontextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext对象被创建出来了"+sce.getServletContext());
}
}
packagecom.dzq.listener;importjavax.servlet.ServletRequestEvent;importjavax.servlet.ServletRequestListener;importjavax.servlet.annotation.WebListener;
@WebListenerpublic class MySRListener implementsServletRequestListener {public voidrequestDestroyed(ServletRequestEvent arg0) {
System.out.println("request对象被销毁"+arg0.getServletRequest());
}public voidrequestInitialized(ServletRequestEvent arg0) {
System.out.println("request对象被创建"+arg0.getServletRequest());
}
}
packagecom.dzq.listener;importjavax.servlet.annotation.WebListener;importjavax.servlet.http.HttpSessionEvent;importjavax.servlet.http.HttpSessionListener;
@WebListenerpublic class MySessionListener implementsHttpSessionListener {public voidsessionCreated(HttpSessionEvent arg0) {
System.out.println("session对象被创建"+arg0.getSession());
}public voidsessionDestroyed(HttpSessionEvent arg0) {
System.out.println("session对象被销毁"+arg0.getSession());
}
}
2.用来监听三大作用域中属性变化的监听器
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
packagecom.dzq.listener;importjavax.servlet.annotation.WebListener;importjavax.servlet.http.HttpSessionAttributeListener;importjavax.servlet.http.HttpSessionBindingEvent;
@WebListenerpublic class MyHSAttribute implementsHttpSessionAttributeListener {public voidattributeAdded(HttpSessionBindingEvent arg0) {
}public voidattributeRemoved(HttpSessionBindingEvent arg0) {
}public voidattributeReplaced(HttpSessionBindingEvent arg0) {
}
}
packagecom.dzq.listener;importjavax.servlet.ServletRequestAttributeEvent;importjavax.servlet.ServletRequestAttributeListener;importjavax.servlet.annotation.WebListener;
@WebListenerpublic class MyServletAttribute implementsServletRequestAttributeListener {public voidattributeRemoved(ServletRequestAttributeEvent arg0) {
}public voidattributeAdded(ServletRequestAttributeEvent arg0) {
}public voidattributeReplaced(ServletRequestAttributeEvent arg0) {
}
}
packagecom.dzq.listener;importjavax.servlet.ServletContextAttributeEvent;importjavax.servlet.ServletContextAttributeListener;importjavax.servlet.annotation.WebListener;
@WebListenerpublic class MySCAttributeListener implementsServletContextAttributeListener {public voidattributeAdded(ServletContextAttributeEvent arg0) {
System.out.println("属性被加进来"+arg0.getName()+arg0.getValue());
}public voidattributeRemoved(ServletContextAttributeEvent arg0) {
System.out.println("属性被移除"+arg0.getName()+arg0.getValue());
}public voidattributeReplaced(ServletContextAttributeEvent arg0) {
System.out.println("属性被替换"+arg0.getName()+arg0.getValue());
}
}
3.使javabean自己感知自己在Session中状态变化的监听器,这两个监听器很特殊,不需要自己去写类实现也不需要在web.xml中注册,只要使javabean实现这个接口就能起作用
HttpSessionBindingListener
javabean被绑定到session中
sessionDidActive(HttpSessionBindingEvent event)
javabean被移除绑定从session中
valueUnbound(HttpSessionBindingEvent event)方法
HttpSessionActivationListener
javabean随着session被钝化
sessionWillPassivate(HttpSessionBindingEvent event)
javabean随着session被活化
sessionDidActive(HttpSessionBindingEvent event)
packagecom.dzq.domain;importjava.io.Serializable;importjavax.servlet.http.HttpSessionActivationListener;importjavax.servlet.http.HttpSessionBindingEvent;importjavax.servlet.http.HttpSessionBindingListener;importjavax.servlet.http.HttpSessionEvent;public class Person implementsSerializable ,HttpSessionBindingListener,HttpSessionActivationListener{privateString username;publicString getUsername() {returnusername;
}public voidsetUsername(String username) {this.username =username;
}
@Overridepublic voidvalueBound(HttpSessionBindingEvent arg0) {
System.out.println("当前javabean对象被绑定到session域中时,javabean自己感知到自己被绑定,触发此方法");
}
@Overridepublic voidvalueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("当前javabean对象被移除session域中时,javabean自己感知到自己被解绑,触发此方法");
}//感知被钝化与活化
@Overridepublic voidsessionDidActivate(HttpSessionEvent arg0) {
System.out.println("javabean自己感知到自己被活化,触发此方法");
}
@Overridepublic voidsessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("javabean自己感知到自己被钝化,触发此方法");
}
}
踢人小案例:
建立数据库:
packagecom.dzq.domain;importjava.io.Serializable;importjava.util.Map;importjavax.print.attribute.standard.Severity;importjavax.servlet.ServletContext;importjavax.servlet.http.HttpSession;importjavax.servlet.http.HttpSessionBindingEvent;importjavax.servlet.http.HttpSessionBindingListener;public class User implementsSerializable,HttpSessionBindingListener{private intid;privateString name;privateString password;privateString role;public intgetId() {returnid;
}public void setId(intid) {this.id =id;
}publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}publicString getPassword() {returnpassword;
}public voidsetPassword(String password) {this.password =password;
}publicString getRole() {returnrole;
}public voidsetRole(String role) {this.role =role;
}
@Overridepublic voidvalueBound(HttpSessionBindingEvent event) {//当用户登录时,bean存入session中,向用户列表添加信息
HttpSession session=event.getSession();
ServletContext context=session.getServletContext();
Map map=(Map) context.getAttribute("usermap");
map.put(this, session);
}
@Overridepublic voidvalueUnbound(HttpSessionBindingEvent event) {//当用户下线时,bean移除session中,向用户列表移除信息
HttpSession session=event.getSession();
ServletContext context=session.getServletContext();
Map map=(Map) context.getAttribute("usermap");
map.remove(this, session);
}
@Overridepublic inthashCode() {final int prime = 31;int result = 1;
result= prime * result +id;
result= prime * result + ((name == null) ? 0: name.hashCode());returnresult;
}
@Overridepublic booleanequals(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;
}
}
User.java
packagecom.dzq.listener;import java.util.*;importjavax.servlet.ServletContext;importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;importjavax.servlet.annotation.WebListener;importjavax.servlet.http.HttpSession;importcom.dzq.domain.User;
@WebListenerpublic class MySCListener implementsServletContextListener {public voidcontextDestroyed(ServletContextEvent sce) {
}public voidcontextInitialized(ServletContextEvent sce) {
ServletContext context=sce.getServletContext();
context.setAttribute("usermap", new LinkedHashMap());
}
}
MySCListener
packagecom.dzq.utils;importjava.sql.Connection;importjava.sql.SQLException;importjavax.sql.DataSource;importcom.mchange.v2.c3p0.ComboPooledDataSource;public classDaoUtils {private static DataSource source=newComboPooledDataSource();privateDaoUtils(){
}public staticDataSource getSource(){returnsource;
}public staticConnection getConnection(){try{returnsource.getConnection();
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}
}
}
DaoUntils
packagecom.dzq.web;importjava.io.IOException;importjava.sql.SQLException;importjava.util.Map;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanHandler;importcom.dzq.domain.User;importcom.dzq.utils.DaoUtils;
@WebServlet("/LoginServlet")public class LoginServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String name=request.getParameter("name");
String password=request.getParameter("password");
String sql="select * from user where name=? and password =?";
User user=newUser();
QueryRunner runner=newQueryRunner(DaoUtils.getSource());try{
user=runner.query(sql, new BeanHandler(User.class),name,password);
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}if(user==null){
response.getWriter().write("用户名密码不正确");
}else{
ServletContext context=this.getServletContext();
Map map=(Map) context.getAttribute("usermap");
HttpSession session=map.get(user);if(session!=null)
session.invalidate();
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
LoginServlet.java
packagecom.dzq.web;importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;
@WebServlet("/LogOutServlet")public class LogOutServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {if(request.getSession(false)!=null){
request.getSession().invalidate();
}
response.sendRedirect(request.getContextPath()+"/index.jsp");
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
LogOutServlet.java
packagecom.dzq.web;importjava.io.IOException;importjava.sql.SQLException;importjava.util.Map;importjavax.servlet.ServletContext;importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;importorg.apache.commons.dbutils.QueryRunner;importorg.apache.commons.dbutils.handlers.BeanHandler;importcom.dzq.domain.User;importcom.dzq.utils.DaoUtils;
@WebServlet("/KickServlet")public class KickServlet extendsHttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//获取用户id
String id=request.getParameter("id");
User user=null;//根据id查询用户
String sql="select * from user where id =?";
QueryRunner runner=newQueryRunner(DaoUtils.getSource());try{
user=runner.query(sql, new BeanHandler(User.class),id);
ServletContext context=this.getServletContext();
Map map=(Map) context.getAttribute("usermap");
HttpSession session=map.get(user);if(session!=null)
session.invalidate();
response.sendRedirect(request.getContextPath()+"/userlist.jsp");
}catch(SQLException e) {
e.printStackTrace();throw newRuntimeException(e);
}//找到session//杀死session
}protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
KickServlet.java
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/0417?Unicode=true&characterEncoding=utf-8
root
c3p0-config.xml
踢人管理踢人管理系统
请登录
欢迎回来,${sessionScope.user.name }用户列表
注销