监听器---java
2016-04-27 10:22
471 查看
监听器
web监听器客户端请求
服务端操作
ServletContext(application)
HttpSession(session)
ServletRequest(request)
servlet规范中定义的一种特殊类
用于监听servletcontext,httpsession,servletRequest等域对象的创建与销毁事件
用于监听域对象的属性发生修改的事件
在事件发生前后做一些处理
用途
统计在线人数和在线用户
统计启动时加载初始化信息
统计网站访问量
跟spring结合
第一个监听器
步骤
创建一个实现监听器借口的类(ServletContextListener)配置web.xml进行注册(Design-outline-listener)
启动顺序
优先级监听器>过滤器>Servlet
监听器
按照监听对象划分用于监听应用程序环境对象 ServletContext
用于监听用户会话 HttpSession
用于监听请求消息 ServletRequest
监听事件划分
监听域对象自身的创建和销毁
监听域对象中的属性的增加和删除
监听绑定到HttpSession域中的某个对象的状态
ServletContext
用途定时器
全局属性对象
ServletContextEvent对象可以调用一系列的方法
调用获取初始化参数
String myuser = servletContextEvent.getServletContext().getInitParameter("user"); //web.xml设置 <context-param> <param-name>user</param-name> <param-value>juedaiyuer</param-value> </context-param>
HttpSession事件监听
用途统计在线人数
记录访问日志
实现了HttpSessionListener接口
session服务参数配置
//配置session存活时间 <session-config> <session-timeout>0</session-timeout> </session-config>
ServletRequest事件监听
用途读取参数
记录访问历史
//后台日志显示的启动情况(打印刷存在感)
requestInitialized
sessionCreated
requestDestroyed
同理可以根据ServletRequestEvent这个事件对象来获取request的参数(get一系列的方法)
String myname = servletRequestEvent.getServletRequest().getParameter("name"); url:http://localhost:8080/FirstListener/?name=juedaiyuer
后台就会获取到name参数
监听域对象中属性的变更的监听器
域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器ServletContext
ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放。request,一个用户可有多个;session,一个用户一个;而servletContext,所有用户共用一个
例子
购物网站来说,从数据库提取物品信息,如果采用session存储这些物品信息,每一个用户都需要访问一次数据库;采用上下文的话,每一个用户只需要访问上下文读入物品信息即可.
接口
ServletContextAttributeListenerHttpSessionAttributeListener
ServletRequestAttributeListener
接口中定义的方法
属性的添加,替换,删除
attributeAdded
attributeRemoved
attributeReplaced
在一个jsp页面传递参数值
request.setAttribute();
getAttribute和getParameter的区别
getParameter必须是url带参数形式
getAttribute获取参数的方式只有setAttribute设置参数的时候,才能够有效
ServletContextAttributeListener
package Listener; import java.text.MessageFormat; import javax.servlet.ServletContextAttributeEvent; import javax.servlet.ServletContextAttributeListener; public class MyServletContextAttributeListener implements ServletContextAttributeListener { public void attributeAdded(ServletContextAttributeEvent arg0) { // TODO Auto-generated method stub String str = MessageFormat.format("ServletContext域对象中添加了属性:{0} 属性值:{1}",arg0.getName(),arg0.getValue()); System.out.println(str); } public void attributeRemoved(ServletContextAttributeEvent arg0) { // TODO Auto-generated method stub String str = MessageFormat.format("ServletContext域对象中删除了属性:{0} 属性值:{1}",arg0.getName(),arg0.getValue()); System.out.println(str); } public void attributeReplaced(ServletContextAttributeEvent arg0) { // TODO Auto-generated method stub String str = MessageFormat.format("ServletContext域对象中替换了属性:{0} ",arg0.getName()); System.out.println(str); } }
web.xml配置
Test.jsp添加测试片段
<% application.setAttribute("name", "juedaiyuer"); application.setAttribute("name", "zhanhunyiran"); application.removeAttribute("name"); %>
HttpSessionAttributeListener
<% session.setAttribute("user", "user01"); session.setAttribute("user", "user02"); session.removeAttribute("user"); %>
ServletRequestAttributeListener
<% request.setAttribute("user", "user01"); request.setAttribute("user", "user02"); request.removeAttribute("user"); %>
绑定HttpSession监听器
Session钝化机制session一般情况存储于内存,当用户达到一定数量级,会影响到服务器性能,采用的钝化机制.
本质在于把服务器中不经常使用的session对象暂时序列化到文件系统中或者是数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成.
tomcat钝化管理器
session钝化机制由SessionManager管理
实际开发用到的并不是很多
org.apache.catalina.session.StandardManager
当Tomcat服务器被关闭或重启时,tomcat服务器会将当前内存中的session对象钝化到服务器文件系统中
另一种情况是web应用程序被重新加载时,内存中的session对象也会被钝化到文件系统中
钝化后的文件被保存: tomcat安装路径:/work/Catalina/hostname/applicationname/SESSION.ser
org.apache.catalina.session.Persistentmanager管理
同上
配置主流内存的Session对象数目,将不常使用的session对象保存在文件系统或数据库中,当用到的时候重新加载
默认情况下,tomcat提供两个钝化驱动类
org.apache.Catalina.FileStore和org.apache.Catalina.JDBCStore
接口
HttpSessionBindingListener
提供方法:
绑定:valueBound方法
解除绑定:valueUnbound方法
HttpSessionActivationListener
提供方法:
1. 钝化 sessionWillPassivate
2. 活化 sessionDidActivate
不需要在web.xml文件中注册
创建一个javabean
HttpSessionBindingListener的示例
用myEclipse创建一个类实现HttpSessionBindingListener接口package entity; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; public class User implements HttpSessionBindingListener { private String username; private String password; public void valueBound(HttpSessionBindingEvent arg0) { // TODO Auto-generated method stub System.out.println("valueBound---name:"+arg0.getName()); } public void valueUnbound(HttpSessionBindingEvent arg0) { // TODO Auto-generated method stub System.out.println("valueUnbound---name:"+arg0.getName()); } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } <%@page import="entity.User"%> session.setAttribute("currentUser", new User()); session.removeAttribute("currentUser");
HttpSessionActivationListener的示例
javabeanpackage entity; import java.io.Serializable; import javax.servlet.http.HttpSessionActivationListener; import javax.servlet.http.HttpSessionEvent; public class User2 implements HttpSessionActivationListener,Serializable { private String name; private static final long serialUID = 1; public void sessionDidActivate(HttpSessionEvent se) { // TODO Auto-generated method stub System.out.println("活化到硬盘,session的id:"+se.getSession().getId()); } public void sessionWillPassivate(HttpSessionEvent se) { // TODO Auto-generated method stub System.out.println("钝化到硬盘,session的id:"+se.getSession().getId()); } public User2(String name) { this.name = name; } }
servlet3.0监听器使用
@WebListener 该注解用于将类声明为监听器,被@WebListener标注的类必须实现以下至少一个接口 *Listener 无法定义监听器的顺序
统计在线用户及人数
统计在线人数package manager; import javax.servlet.annotation.WebListener; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; @WebListener public class MySessionManger implements HttpSessionListener { private int userNumber; @Override public void sessionCreated(HttpSessionEvent arg0) { // TODO Auto-generated method stub userNumber++; arg0.getSession().getServletContext().setAttribute("userNum", userNumber); } @Override public void sessionDestroyed(HttpSessionEvent arg0) { // TODO Auto-generated method stub userNumber--; arg0.getSession().getServletContext().setAttribute("userNum", userNumber); } }
将在线用户数保存在上下文
使用了EL表达式
当前用户在线人数${userNum}
统计在线用户
统计访问者的来源(ip),使用request对象
源代码
相关文章推荐
- Java设计模式--策略模式d
- 10 Exception handling Best Practices in Java Programming
- spring.Net之Ioc在MVC中的使用
- Java基础-01
- mybatis+springmvc 多数据源切换
- 深入理解Java:注解(Annotation)--注解处理器
- 【Spring】Spring MVC原理及配置详解
- Java序列化id
- Spring定时器--时间设置规则(转载)
- Java Integer 判等误区
- 策略模式--Java篇
- java异常体系
- Java多线程编程实战指南(设计模式篇,黄文海)-之管道线模式
- java中静态代码块的用法 static用法详解
- studio中java文件右下角显示红色j而不是C标识
- JAVA中字符串函数subString的用法小结
- Java文件路径
- java继承关系中成员变量,构造方法,成员方法的关系
- Java中的异常注意点
- Maven那点事儿(Eclipse版)