本文研究的总结。欢迎转载,但请注明出处: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. android横竖屏控制

    代码中设置activity屏幕为全屏,并设置横竖屏状态 getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowM ...

  2. Linux 在下面MATLAB下载

    网上找了很长一段时间都没有很好的连接,或者是一个普通的软件, 在这里,给大家一个连接: ed2k://|file|[%E7%9F%A9%E9%98%B5%E5%AE%9E%E9%AA%8C%E5%AE ...

  3. uav 11258 String Partition (DP)

    Problem F - String Partition                                                                         ...

  4. qml动画控制器AnimationController

    AnimationController: 一般的动画是使用定时器来完毕的,可是AnimationController同意给定的动画,手动控制,能够通过控制她的progress属性来操作动画的进度. c ...

  5. 性能优化——统计信息——SQLServer自动更新和自动创建统计信息选项

    原文:性能优化--统计信息--SQLServer自动更新和自动创建统计信息选项 原文译自:http://www.mssqltips.com/sqlservertip/2766/sql-server-a ...

  6. web前端知识体系小结(转)

    1. 前言 大约在几个月之前,让我看完了<webkit技术内幕>这本书的时候,突然有了一个想法.想把整个web前端开发所需要的知识都之中在一个视图中,形成一个完整的web前端知识体系,目的 ...

  7. Ceph 存储集群

    Ceph 存储集群 Ceph 作为软件定义存储的代表之一,最近几年其发展势头很猛,也出现了不少公司在测试和生产系统中使用 Ceph 的案例,尽管与此同时许多人对它的抱怨也一直存在.本文试着整理作者了解 ...

  8. List subList()的一个demo

    只要保证toIndex不大于size并且fromIndex不大于toIndex即可(谁会传一个负数的下标呢?) public List<E> subList(int fromIndex, ...

  9. “GDI+ 发生一般错误” 解决方法

    System.Runtime.InteropServices.ExternalException: GDI+ 发生一般错误 对应的帐户没有写权限,给予帐户写权限 版权声明:本文博主原创文章,博客,未经 ...

  10. 【剑指offer】最小的k的数量

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26966159 题目描写叙述: 输入n个整数,找出当中最小的K个数.比如输入4,5,1,6, ...