Java Web 中的监听

本文详细介绍了JavaWeb中的三类监听器:Web项目应用域监听、应用域属性监听及感知Session监听。通过具体实例展示了如何使用这些监听器来监控Web应用的不同层面的状态变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转载于:http://blog.sina.com.cn/s/blog_a0a19e800101egu0.html

Java Web 中的监听器
监听器的分三类
1:Web项目应用域监听
a:ServletContext应用域监听
⑴实现ServletContextListener接口
⑵contextInitialized()方法,这方法代表Servlet容器启动时,触发该方法

⑶contextDestroyed()方法,这方法代表Servlet容器关闭时,触发该方法

实例:
 public void contextInitialized(ServletContextEvent sce) {
  //得到配置参数
  ServletContext application=sce.getServletContext();
  String driver=application.getInitParameter("driver");
  String url=application.getInitParameter("url");
  String user=application.getInitParameter("user");
  String password=application.getInitParameter("password");
  Connection connection=null;
  
  try {
   Class.forName(driver);
   connection=DriverManager.getConnection(url,user,password);
   System.out.println("==================成功执行....");
  } catch (Exception e) {
   e.printStackTrace();
  }
  finally{
   try {
    if(connection!=null){
     connection.close();
     
    }
   } catch (Exception e2) {
    e2.printStackTrace();
   }
  }
 }

b:HttpSession应用域监听
⑴实现HttpSessionListener接口
⑵sessionCreated()方法,这方法代表Session创建时,触发该方法
⑶sessionDestroyed()方法,这方法代表Session销毁时,触发该方法

实例:
public void sessionCreated(HttpSessionEvent event) {
  HttpSession session=event.getSession();
  ServletContext application=session.getServletContext();
  String sessionid=session.getId();
  if(session.isNew()){
   String username=(String) session.getAttribute("username");
   username=(username==null)? "游客":username;
   Map online=(LinkedHashMap)application.getAttribute("online");// LinkedHashMap继承与HashMap,但为有序封装
   if(online==null){
    online=new LinkedHashMap();
   }
   online.put(sessionid, username);
   System.out.println("添加用户_"+username);
   application.setAttribute("online", online);
  }
 }

public void sessionDestroyed(HttpSessionEvent event) {
  HttpSession session=event.getSession();
  ServletContext application=session.getServletContext();
  String sessionid=session.getId();
  Map online=(LinkedHashMap)application.getAttribute("online");// LinkedHashMap继承与HashMap,但为有序封装
  if(online!=null){
   online.remove(sessionid);
  }
  application.setAttribute("online", online);
 }
c:ServletRequest应用域监听
⑴实现ServletRequest接口
⑵requestInitialized()方法,这方法代表request请求激活时,触发该方法
⑶requestDestroyed()方法,这方法代表request请求死亡时,触发该方法

实例:
public void requestDestroyed(ServletRequestEvent event) {
  HttpServletRequest request = (HttpServletRequest) event
    .getServletRequest();
  HttpSession session = request.getSession();
  //得到用户
  String username = (String) session.getAttribute("username");
  username = (username == null) ? "游客" : username;
  String sessionid = session.getId();
  String ip = request.getRemoteAddr();
  String page = request.getRequestURI();
  UserInfo userInfo=new UserInfo();
  userInfo.setSessionid(sessionid);
  userInfo.setUsername(username);
  userInfo.setIp(ip);
  userInfo.setPage(page);
   //判断用户是否存在
  if(userInfoDao.findUserBySessionId(sessionid)){
   userInfoDao.updateUserinfo(userInfo);//存在则更新信息
   System.out.println("更新用户_" + username);
  }else{
   userInfoDao.addUserInfo(userInfo);//不存在则添加用户信息
   System.out.println("添加用户_" + username);
  }

}
2:应用域属性监听
每一个域都有自己的属性监听,如ServletContextAttributeListener就是ServletContext的属性监听,其他两个域也是一样的!其中都有3个方法
a:attributeAdded()方法,这方法代表该域中添加了一个值时,触发该方法
b:attributeRemoved()方法,这方法代表该域中删除了一个值时,触发该方法
c:attributeReplaced()方法,这方法代表该域中有一个值被替换了时,触发该方法
实例:
package cn.ouyang.lintener.uitls;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

public class MyServletContextAttributeEvent implements ServletContextAttributeListener{
 //当前范围属性添加时触发此监听
 public void attributeAdded(ServletContextAttributeEvent event) {
  ServletContext application=event.getServletContext();
  System.out.println(application+"范围内添加了名:"+event.getName()+"值为:"+event.getValue());
 }
 //当前范围属性被移除触发此监听
 public void attributeRemoved(ServletContextAttributeEvent event) {
  ServletContext application=event.getServletContext();
  System.out.println(application+"范围内移除了名:"+event.getName()+"值为:"+event.getValue());
 }
 //当前范围属性更改时触发此监听
 public void attributeReplaced(ServletContextAttributeEvent event) {
  ServletContext application=event.getServletContext();
  System.out.println(application+"范围内替换了名:"+event.getName()+"值为:"+event.getValue());
 }

}
3:感知Session监听
a:HttpSessionBindingListener监听
⑴在需要监听的实体类实现HttpSessionBindingListener接口
⑵重写valueBound()方法,这方法是在当该实体类被放到Session中时,触发该方法
⑶重写valueUnbound()方法,这方法是在当该实体类从Session中被移除时,触发该方法
b:HttpSessionActivationListener监听
⑴在需要监听的实体类实现HttpSessionActivationListener接口
⑵重写sessionWillPassivate()方法,这方法是在当该实体类被序列化时,触发该方法
⑶重写sessionDidActivate()方法,这方法是在当该实体类被反序列化时,触发该方法

实例代码:
package com.ouyang.listener.entity;

import java.io.Serializable;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

import com.ouyang.listener.utils.doCount;

public class UserInfo implements HttpSessionBindingListener,Serializable {

private static final long serialVersionUID = 1L;
 private String name;
 private String ip;
 public String getIp() {
  return ip;
 }
 public void setIp(String ip) {
  this.ip = ip;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }

public void valueBound(HttpSessionBindingEvent event) {
  doCount.onlineCount++;
  event.getSession().setAttribute("username",ip);
  event.getSession().setAttribute("online", doCount.onlineCount);
 }
 public void valueUnbound(HttpSessionBindingEvent event) {
  doCount.onlineCount--;
  event.getSession().setAttribute("online", doCount.onlineCount);
 }

}
 
package com.ouyang.listener.utils;

import java.util.LinkedHashMap;
import java.util.Map;

import com.ouyang.listener.entity.UserInfo;

public class doCount {
 public static int onlineCount=0;
 
 public static Map usermap=new LinkedHashMap();// LinkedHashMap继承与HashMap,但为有序封装
}


-----> >> 结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值