您的位置:首页 > 编程语言 > Java开发

Java Web 中的监听(Listener)

2014-03-29 22:11 435 查看
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,但为有序封装

}

-----> >> 结束

 

注:部分内容为转载,出处请百度搜索--->>>南昌奥斯科技
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: