现在的位置: 首页 > 综合 > 正文

Java Web 中的监听(Listener)

2019年03月08日 ⁄ 综合 ⁄ 共 5488字 ⁄ 字号 评论关闭

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,但为有序封装
}

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

抱歉!评论已关闭.