文章转载于: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,但为有序封装
}
-----> >> 结束