监听器---java

监听器

web监听器

客户端请求
服务端操作

ServletContext(application)
HttpSession(session)
ServletRequest(request)

servlet规范中定义的一种特殊类
用于监听servletcontext,httpsession,servletRequest等域对象的创建与销毁事件
用于监听域对象的属性发生修改的事件
在事件发生前后做一些处理

用途

  1. 统计在线人数和在线用户
  2. 统计启动时加载初始化信息
  3. 统计网站访问量
  4. 跟spring结合

第一个监听器

步骤

  1. 创建一个实现监听器借口的类(ServletContextListener)
  2. 配置web.xml进行注册(Design-outline-listener)

启动顺序

优先级

监听器>过滤器>Servlet

监听器

按照监听对象划分

  1. 用于监听应用程序环境对象 ServletContext
  2. 用于监听用户会话 HttpSession
  3. 用于监听请求消息 ServletRequest

监听事件划分

  1. 监听域对象自身的创建和销毁
  2. 监听域对象中的属性的增加和删除
  3. 监听绑定到HttpSession域中的某个对象的状态

ServletContext

用途

  1. 定时器
  2. 全局属性对象

ServletContextEvent对象可以调用一系列的方法

调用获取初始化参数

String myuser = servletContextEvent.getServletContext().getInitParameter("user");

//web.xml设置
<context-param>
<param-name>user</param-name>
<param-value>juedaiyuer</param-value>
</context-param>

HttpSession事件监听

用途

  1. 统计在线人数
  2. 记录访问日志

实现了HttpSessionListener接口

session服务参数配置

//配置session存活时间
<session-config>
    <session-timeout>0</session-timeout>
</session-config>

ServletRequest事件监听

用途

  1. 读取参数
  2. 记录访问历史

    //后台日志显示的启动情况(打印刷存在感)

    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存储这些物品信息,每一个用户都需要访问一次数据库;采用上下文的话,每一个用户只需要访问上下文读入物品信息即可.

接口

  1. ServletContextAttributeListener
  2. HttpSessionAttributeListener
  3. ServletRequestAttributeListener

接口中定义的方法

属性的添加,替换,删除

  1. attributeAdded
  2. attributeRemoved
  3. 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的示例

javabean

package 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,servlet,监听器)