JavaWeb显示器 A:监听器的定义 B:web监听器的主要用途: C:一个web监听器实例 D:监听器分类 E:监听器的实例--在线人数统计 F:servlet3.0下的使用:仅仅须要添加注解就可以

本文研究的总结。欢迎转载,但请注明出处:http://blog.csdn.net/pistolove/article/details/44310967



     专门用于其它对象身上发生的事件或状态改变进行监听和对应事件处理的对象,当被监听的对象发生改变时,马上採取对应的行动。

     
     client请求                                       ServletContext --> Application      上下文对象 由容器创建
                                    web监听器        Httpsession-->  Session         保存上下文信息的机制 保存每一个会话
     server端操作                                    ServletHttpRequest--> Request    客户发送请求时创建

     监听器是servlet规范中定义的一种特殊类;用于监听ServletContext、httpsession和ServletRequest等域对象的创建和销毁事件;用于监听域对象的属性发生改动的事件;能够再事件发生前、发生后做一些必要的处理。

B:web监听器的主要用途:

     1. 统计在线人数和在线用户
     2系统启动时载入初始化信息
     3统计站点訪问量
     4跟Spring结合

C一个web监听器实例

     步骤:
     1创建一个实现监听器接口的类
     2. 配置web.xml文件进行注冊

     监听器启动顺序:多个监听器启动顺序依照注冊顺序运行的
     优先级:监听器 >过滤器>servlet

D监听器分类

     依照监听的对象划分
     1用于监听应用程序对象 (ServletContext)的事件监听器
     2用于监听用户会话对象(HttpSession)的事件监听器
     3用于监听请求消息对象(ServletRequest)的事件监听器

     依照监听的事件划分
     1.监听域对象自身的创建和销毁的事件监听器
          ServletContext --> ServletContextListener
                 主要用途:定时器 全局属性对象

          HttpSession --> HttpSessionListener
                 主要用途:统计在线人数 记录訪问日志
           
          Session销毁:关闭server ; Session超时 。 关闭浏览器,Session过期
                 在web.xml中配置session过期时间

          ServletReqest ServletRequestListener
                 主要用途:读取參数 记录訪问历史

     2.监听域对象中的属性的添加和删除的事件监听器
          ServletContext --> servletContextAttributeListener           上下文
       
          HttpSession--> HttpSessionAttributeListner                      一次会话

          HttpServletRequest --> ServletRequestAtttibuteListener   一次请求

          request.getAttribute() 放在域对象中的參数
          request.getParameter()  request的请求參数 www.baidu.com/username=zs
          须要将username放到Attribute中,request.setAttribute("username","zs");放在域对象中的属性 直接通过EL表达式就可取出  <%=username%>。

在多次点击button请求时, 因为request在訪问结束后就销毁了,在request域中不存有上一次获取的參数,就会add。session和context在容器中都存有,就会直接replace。

     3.监听绑定到HttpSession域中的某个对象的状态的事件监听器
         绑定-->解除绑定 
             绑定:保存-setAttribute
             解除绑定:移除-removeAttribute

         钝化-->活化
            钝化:将Session对象持久化到存储设备上
            活化:将session对象将一个存储设备上恢复

         钝化原因:session放在server中的。当在线对象特别多,session内存开销非常大,session的钝化机制就可解决。将server中临时不使用的session对象 序列化到系统文件或数据库中;在须要使用时反序列化到系统内存中 整个过程由server自己主动完毕。


Tomcat两种Session钝化管理器:
<a>Session钝化机制由SessionManager管理
       org.apache.catalina.session.StandardManager
当Tomcatserver被关闭或重新启动时 tomcatserver会将当前内存中的Session对象钝化到server文件系统中。还有一种情况是web应用程序被又一次载入时 内存中的Session对象也会被钝化到server的文件系统中;钝化后的文件被保存:Tomcat安装路径/work/Catalina/hostname/applicationname/SESSION.ser

<b>org.apache.catalina.session.Persistentmanager
在钝化基础上进行扩张,能够配置主流内存的Session对象数目,将不常使用的Session对象保存到文件系统或数据库,当使用时再又一次载入默认情况下 tomcat提供两个钝化驱动类:org.apache.Catalina.FileStore 和 org.apache.Catalina.JDBCStore

HttpSessionBindingListener类
  绑定:valueBound方法
  解除绑定:valueUnbound方法 

HttpSessionActivationListener类
  钝化:sessionWillPassivate方法
  活化:sessionDidActivate方法

不须要在web.xml中注冊;钝化和活化必须实现序列化serializable接口才行。

E:监听器的实例--在线人数统计

import java.util.ArrayList;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import com.my.entity.User;
import com.my.util.SessionUtil;

/**
 * 计数监听器
 */
@WebListener
public class MyHttpSessionListener implements HttpSessionListener {
	
	private int userNumber = 0;
	
	@Override
	public void sessionCreated(HttpSessionEvent arg0) {
		userNumber++;
		arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
	}

	@Override
	public void sessionDestroyed(HttpSessionEvent arg0) {
		userNumber--;
		arg0.getSession().getServletContext().setAttribute("userNumber", userNumber);
		
		ArrayList<User> userList = null;//在线用户List
		
		userList = (ArrayList<User>)arg0.getSession().getServletContext().getAttribute("userList");
		
		if(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId())!=null){
			userList.remove(SessionUtil.getUserBySessionId(userList, arg0.getSession().getId()));
		}
	}
}
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;

import com.my.entity.User;
import com.my.util.SessionUtil;
@WebListener
public class MyServletRequestListener implements ServletRequestListener {

	private ArrayList<User> userList;//在线用户List
	
	@Override
	public void requestDestroyed(ServletRequestEvent arg0) {

	}

	@Override
	public void requestInitialized(ServletRequestEvent arg0) {
		
		userList  = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");
		
		if(userList==null)
			userList = new ArrayList<User>();
		
		HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();
		String sessionIdString = request.getSession().getId();
		
		if(SessionUtil.getUserBySessionId(userList,sessionIdString)==null){
			User user = new User();
			user.setSessionIdString(sessionIdString);
			user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
			user.setIpString(request.getRemoteAddr());
			userList.add(user);
		}
		arg0.getServletContext().setAttribute("userList", userList);
	}
}
import java.util.ArrayList;
import com.my.entity.User;

public class SessionUtil {

	public static Object getUserBySessionId(ArrayList<User> userList, String sessionIdString) {
		for (int i = 0; i < userList.size(); i++) {
			User user = userList.get(i);
			if (user.getSessionIdString().equals(sessionIdString)) {
				return user;
			}
		}
		return null;
	}
}
public class User {

	private String sessionIdString;

	private String ipString;

	private String firstTimeString;

	public String getSessionIdString() {
		return sessionIdString;
	}

	public void setSessionIdString(String sessionIdString) {
		this.sessionIdString = sessionIdString;
	}

	public String getIpString() {
		return ipString;
	}

	public void setIpString(String ipString) {
		this.ipString = ipString;
	}

	public String getFirstTimeString() {
		return firstTimeString;
	}

	public void setFirstTimeString(String firstTimeString) {
		this.firstTimeString = firstTimeString;
	}
}

F:servlet3.0下的使用:仅仅须要添加注解就可以

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener("This is My Servlet 3.0 Listener")
public class MyServletContextListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		System.out.println("contextDestroyed");
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		System.out.println("contextInitialized");
	}
}

       



版权声明:本文博主原创文章,博客,未经同意不得转载。