• JavaWeb显示器


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



    A:监听器的定义

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

         
         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");
    	}
    }
    

           



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

  • 相关阅读:
    Matlab中transpose函数的使用
    Matlab中cell2mat的使用
    Matlab中find函数的使用
    Matlab中数组下标是logical,如何处理?
    Matlab中mat2cell的使用
    判断一棵树是否是另一棵树的子树
    链表中倒数第k个结点
    古德-图灵估计
    好书记录
    编程思路总结——递归
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4841990.html
Copyright © 2020-2023  润新知