Java Web 中的监听(Listener)

来源:互联网 发布:广告牌生成器软件 编辑:程序博客网 时间:2024/05/18 21:10

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

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

实例:
 public voidcontextInitialized(ServletContextEvent sce) {
  //得到配置参数
  ServletContextapplication=sce.getServletContext();
  Stringdriver=application.getInitParameter("driver");
  Stringurl=application.getInitParameter("url");
  Stringuser=application.getInitParameter("user");
  Stringpassword=application.getInitParameter("password");
  Connectionconnection=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) {
  HttpSessionsession=event.getSession();
  ServletContextapplication=session.getServletContext();
  Stringsessionid=session.getId();
  if(session.isNew()){
   Stringusername=(String) session.getAttribute("username");
   username=(username==null)?"游客":username;
   Maponline=(LinkedHashMap)application.getAttribute("online");//LinkedHashMap继承与HashMap,但为有序封装
   if(online==null){
    online=newLinkedHashMap();
   }
   online.put(sessionid,username);
   System.out.println("添加用户_"+username);
   application.setAttribute("online",online);
  }
 }

public voidsessionDestroyed(HttpSessionEvent event) {
  HttpSessionsession=event.getSession();
  ServletContextapplication=session.getServletContext();
  Stringsessionid=session.getId();
  Maponline=(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=newUserInfo();
  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;

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

public class MyServletContextAttributeEvent implementsServletContextAttributeListener{
 //当前范围属性添加时触发此监听
 public voidattributeAdded(ServletContextAttributeEvent event) {
  ServletContextapplication=event.getServletContext();
  System.out.println(application+"范围内添加了名:"+event.getName()+"值为:"+event.getValue());
 }
 //当前范围属性被移除触发此监听
 public voidattributeRemoved(ServletContextAttributeEvent event) {
  ServletContextapplication=event.getServletContext();
  System.out.println(application+"范围内移除了名:"+event.getName()+"值为:"+event.getValue());
 }
 //当前范围属性更改时触发此监听
 public voidattributeReplaced(ServletContextAttributeEvent event) {
  ServletContextapplication=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;

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

importcom.ouyang.listener.utils.doCount;

public class UserInfo implementsHttpSessionBindingListener,Serializable {

private static final longserialVersionUID = 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 voidvalueBound(HttpSessionBindingEvent event) {
  doCount.onlineCount++;
  event.getSession().setAttribute("username",ip);
  event.getSession().setAttribute("online",doCount.onlineCount);
 }
 public void valueUnbound(HttpSessionBindingEventevent) {
  doCount.onlineCount--;
  event.getSession().setAttribute("online",doCount.onlineCount);
 }

}
 
package com.ouyang.listener.utils;

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

importcom.ouyang.listener.entity.UserInfo;

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


-----> >> 结束
 
注:部分内容为转载,出处请百度搜索--->>>南昌奥斯科技

0 0