本文研究的总结。欢迎转载,但请注明出处: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");
}
}

       



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

JavaWeb显示器的更多相关文章

  1. MVC设计模式JavaWeb实现

    JSP开发模式 jsp开发模式的发展 1.模式1:(适合小型项目的技术的开发)     a.第一版本号.纯jsp(封装数据.处理数据,显示数据)     b.第二版本号,Jsp+JavaBean.   ...

  2. 从啥也不会到可以胜任最基本的JavaWeb工作,推荐给新人的学习路线(二)

    在上一节中,主要阐述了JavaScript方面的学习路线.先列举一下我朋友的经历,他去过培训机构,说是4个月后月薪过万,虽然他现在还未达到这个指标. 培训机构一般的套路是这样:先教JavaSE,什么都 ...

  3. JavaWeb——Servlet

    一.基本概念 Servlet是运行在Web服务器上的小程序,通过http协议和客户端进行交互. 这里的客户端一般为浏览器,发送http请求(request)给服务器(如Tomcat).服务器接收到请求 ...

  4. JavaWeb——Listener

    一.基本概念 JavaWeb里面的listener是通过观察者设计模式进行实现的.对于观察者模式,这里不做过多介绍,大概讲一下什么意思. 观察者模式又叫发布订阅模式或者监听器模式.在该模式中有两个角色 ...

  5. .JavaWeb文件上传和FileUpload组件使用

    .JavaWeb文件上传 1.自定义上传 文件上传时的表单设计要符合文件提交的方式: 1.提交方式:post 2.表单中有文件上传的表单项:<input type="file" ...

  6. Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转

    前言:最近这两天工作上,要实现一个功能,在好友阿聪的帮助下,算是比较好的解决了这个需求. B/S的Web网站,需要实现点击按钮时,根据客户端连接的显示屏(监视器)数量进行,单双屏跳转显示新页面. 由于 ...

  7. javaWeb应用打包

    在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  8. JavaWeb——tomcat安装及目录介绍

    一.web web可以说,就是一套 请求->处理->响应 的流程.客户端使用浏览器(IE.FireFox等),通过网络(Network)连接到服务器上,使用HTTP协议发起请求(Reque ...

  9. 做JavaWeb开发不知Java集合类不如归家种地

    Java作为面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.但是使用数组存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多个对象的引用放入容 ...

随机推荐

  1. RH033读书笔记(10)-Lab 11 Process Control

    Lab 11 Process Control Sequence 1: Job Control 1. [student@stationX ~]$ su - 2. Begin some jobs in t ...

  2. Codeforces Round #270(利用prim算法)

    D. Design Tutorial: Inverse the Problem time limit per test 2 seconds memory limit per test 256 mega ...

  3. Make a dent in the universe

    李自成<一个数学家平反>.就像我第一次读同一,我感到鼓舞的野心文."野心是世界的驱动力的最好的结果几乎所有的工作. " 心野心是要留下点什么在自己身后的永恒价值 在这个 ...

  4. 由<a href = "#" > 引发的思考

    原文:由<a href = "#" > 引发的思考 前阵子在一个移动项目中,通过 <a href = "#" >  的方式 绑定clic ...

  5. Visual Studio 使用及调试必知必会

    原文:Visual Studio 使用及调试必知必会   一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2: ...

  6. RunJS推荐用于个人使用(使用方便JS、css实时预览、编辑、管理等功能)

    RunJS,在线编写.展示html.js.css代码,拥有实时预览.分享.Fork.代码高亮.自己主动完毕等多项特性,提供文件上传.多种登录方式. 地址:http://runjs.cn/ waterm ...

  7. [Apache Spark源代码阅读]天堂之门——SparkContext解析

    略微了解Spark源代码的人应该都知道SparkContext,作为整个Project的程序入口,其重要性不言而喻,很多大牛也在源代码分析的文章中对其做了非常多相关的深入分析和解读.这里,结合自己前段 ...

  8. form 为什么上传文件enctype现场

    FORM要素enctype属性指定表单数据server当提交所使用的编码类型,默认默认值它是"application/x-www-form-urlencoded". 这样的编码方式 ...

  9. Cordova探险系列(一个)

    最早接触PhoneGap平台是在1年多之前,可以使用HTML.CSS和JavaScript跨平台来编写Android或者IOS设备程序.而且应用的核心代码不须要多少改动就行移植.确实让我感觉的到它应该 ...

  10. android 反编译,反,注射LOG

    反编译smali注射显示LOG该代码.以后使用: .class public Lnet/iaround/connector/DebugClass; .super Ljava/lang/Object; ...