JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量

转载请注明出处: http://blog.csdn.net/qq_26525215
本文源自大学之旅_谙忆的博客

在Web项目中,我们对下面这几个监听器必须熟练的使用,它们的作用真的很大。熟练的使用后,可以使我们少绕弯路,少写很多代码、

事件源             监听对像的创建和销毁           监听对像上属性的添加和删除
HttpSession       HttpSessionListener        HttpSessionAttributeListener - HttpSessionEvent

ServletRequest    ServletRequestListenr          ServletRequestAttributeListener - ServletRequestEvent

ServletContext   ServletContextListener      ServletContextAttributeListener - ServletContextEvent

监听ServletContext的创建和销毁:

开发步骤:
第一步:实现ServletContextListener接口。

implements ServletContextListener

第二步:实现两个方法。
contextInitialized
contextDestroyed

ServletContext对象(项目)创建:
public void contextInitialized(ServletContextEvent sce) 

ServletContext对象(项目)消亡:
public void contextDestroyed(ServletContextEvent sce) 

第三步:在web.xml中添加<listener/>节点。
为什么要配web.xml呢,因为我们的项目在启动的时候就需要监听,不可能由项目内部的类来完成,所以这个实现得依靠服务器了(在这里是Tomcat)

位置是在:filter- mapping标签之后 | listener | servlet标签之前

<listener>
    <listener-class>
       完整类名
    </listener-class>
</listener>

这一点与swing中的添加监听有所区别。

第四步:测试
1、发布项目启动。
2、通过Tomcat管理控制台停止此项目。(注意,不要通过myEclipse直接停Java虚拟机了)

监听ServletContext上的属性变化:

实现ServletContextAttributeListener接口:

implements ServletContextAttributeListener

实现三个方法:

    添加属性时自动调用
    public void attributeAdded(ServletContextAttributeEvent e) {
    }

    删除属性时自动调用
    public void attributeRemoved(ServletContextAttributeEvent e) {
    }

    修改属性时自动调用
    public void attributeReplaced(ServletContextAttributeEvent e) {
    }

配置web.xml:

<listener>
    <listener class>
        完整类名
    </listener-class>
</listener>

例如:在jsp页面中:

<%
     application.setAttribute("aa", "abc");//调用添加或修改属性时的方法
     application.removeAttribute("aa");//调用删除属性时的方法
%>

实例-网站在线人信息与网页点击量

分析:

网页点击量:

记录一个网站的点击量。
当服务器关闭时,必须要保存到文件中或是数据库中去。
当服务器启动时,先从文件中读取并放到ServletContext。
在Filter中(用ServletRequestListenr也可以)记录访问量,每次访问都加1。

好处:信息不是太重要,没有必要每次用户访问都访问数据库或是操作文件。

在为不影响用户的速度感受,应该开始一个新的线程同去操作数据。
这样即使在后台使用同步技术,用户也不会感觉到速度很慢。

在线人信息:

利用HttpSessionListener,监听HttpSession的创建和销毁。
sessionCreated
sessionDestroyed

Session的默认有效时间为30分。可以通过配置的方式修改它的值。
可以调用session.invalidate方法销毁当前Session.

主要作用是记录当前所有在线人数,无论是用户还是游客。

HttpSessionAttributeListener
主要作用是:记录当前在登录人数。注意,登录是指注册成为合法用户并成功登录的人。

源码:

index.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>在线人的信息与网站点击量的实现</title>
  </head>

  <body>
    <h3>在线人的信息与网站点击量的实现</h3>
    <a href='<c:url value="servlet/ShowServlet"></c:url>'>查看在线人信息</a>
    <hr/>
    <form action='<c:url value="servlet/LoginServlet"></c:url>' method="post">
         姓名:<input type="text" name="name" />
         <input type="submit" value="登录">
    </form>

    <br/>点击量:${count}
  </body>
</html>

MyServletRequestListenr

统计访问量:

package cn.hncu.listeners;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class MyServletRequestListenr implements ServletRequestListener{

    //有一个请求就会运行这里
    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ServletContext sct = sre.getServletContext();
        new MyThread(sct).start();
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
    }
}

class MyThread extends Thread{
    private ServletContext sct = null;
    private static Object obj = new Object();
    public MyThread(ServletContext sct) {
        this.sct=sct;
    }

    @Override
    public void run() {
        synchronized (obj) {
            sct.setAttribute("count", (Integer) sct.getAttribute("count") + 1);
        }
    }
}

MyServletContextListener

将访问量数据持久化:

package cn.hncu.listeners;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class MyServletContextListener implements ServletContextListener{

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        //从服务器硬盘把之前存储的点击量数据读取出来
        ServletContext sct = sce.getServletContext();
        String path = sct.getRealPath("/count.txt");

        try {
            BufferedReader br = new BufferedReader(new FileReader(path));
            String line = br.readLine();
            Integer count = Integer.valueOf(line);
            sct.setAttribute("count", count);
        } catch (Exception e) {
            //如果出异常了,我们认为文件还不存在,服务器第一次启动
            e.printStackTrace();
            sct.setAttribute("count",new Integer(0));
        }

    }

    //关闭服务器时
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        //把当前servletContext容器中存储的点击量数据 永久化到  服务器硬盘
        ServletContext sct = sce.getServletContext();
        String path = sct.getRealPath("/count.txt");

        try {
            PrintWriter pw = new PrintWriter(path);
            pw.write(""+sct.getAttribute("count"));
            pw.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

    }

}

MyHttpSessionListener

统计在线人的信息

package cn.hncu.listeners;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class MyHttpSessionListener implements HttpSessionListener {

    //有 游客/用户 来访问了
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        List<HttpSession> guests = (List<HttpSession>) se.getSession().getServletContext().getAttribute("guests");//在线人的集合
        if(guests==null){//第一个访问网站的人--沙发
            guests = new ArrayList<HttpSession>();
            se.getSession().getServletContext().setAttribute("guests", guests);//设置guests属性
        }
        guests.add(se.getSession());//将第一个用户的session添加到在线人集合
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        List<HttpSession> guests = (List<HttpSession>) se.getSession().getServletContext().getAttribute("fuses");
        if(guests.contains(se.getSession())){
            guests.remove(se.getSession());
        }
    }
}

MyHttpSessionAttributeListener

统计在线用户的信息:

package cn.hncu.listeners;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener{

    //session添加属性了,就会调用下面的attributeAdded方法
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        if(se.getName().equals("name")){//代表添加了name属性
            System.out.println("用户"+se.getValue()+"登录了");
            List<HttpSession> logins = (List<HttpSession>) se.getSession().getServletContext().getAttribute("logins");

            if(logins==null){
                logins = new ArrayList<HttpSession>();
                se.getSession().getServletContext().setAttribute("logins", logins);
            }
            logins.add(se.getSession());
        }
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
    }

}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>

  <filter>
    <filter-name>charset</filter-name>
    <filter-class>cn.hncu.filter.CharsetFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>charset</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>cn.hncu.listeners.MyServletContextListener</listener-class>
  </listener>
  <listener>
    <listener-class>cn.hncu.listeners.MyServletRequestListenr</listener-class>
  </listener>
  <listener>
    <listener-class>cn.hncu.listeners.MyHttpSessionAttributeListener</listener-class>
  </listener>
  <listener>
    <listener-class>cn.hncu.listeners.MyHttpSessionListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>ShowServlet</servlet-name>
    <servlet-class>cn.hncu.servlets.ShowServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/servlet/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ShowServlet</servlet-name>
    <url-pattern>/servlet/ShowServlet</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

演示结果:

完整源码链接:

https://github.com/chenhaoxiang/Java/tree/master/myOnlinesWeb

myOnlinesWeb.zip文件。

转载请注明出处: http://blog.csdn.net/qq_26525215
本文源自大学之旅_谙忆的博客

时间: 2024-10-01 20:48:32

JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量的相关文章

JavaWeb-网站在线用户信息、网站访问量以及管理踢出用户实例

转载请注明出处: http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 这个稍微比上个版本做得完善了一点,用了JavaBean来封装用户信息,添加了一个管理踢用户的功能. 上一个的用户访问量是通过监听request来统计的,在这个实例中,我们也可以通过过滤器来实现统计网站访问量. 直接看源码吧,感觉没多少要讲的,我习惯把解释写在代码中. 部分源码 index.jsp: <%@ page language="java" import=&

保护隐私技术不过关 360滥删Cookie引发用户投诉

中介交易 SEO诊断 淘宝客 云主机 技术大厅 近日,有多名网友在网上反映,他们经常出现新浪微博需要反复登陆,网页游戏加载突然变得异常缓慢等情况.而这些网民一个共同的特征就是都使用了360浏览器. 360浏览器Cookie信息丢失 网民频发抱怨 据宁波一位名为"小隐隐于宅"的网友介绍,她本来使用360浏览器,但最近总是出现网页打不开或只能显示一部分,"莫名其妙的速度慢,杀毒,没发现病毒,用电脑医生,好了没几分钟又故态重萌",但她卸载360浏览器后,改用搜狗浏览器后,

JavaWeb实现文件上传下载功能实例解析_java

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

JavaWeb 后端 &lt;十三&gt; 之 监听器 JSTL国际化

1. 监听器 1.1   概述 监听器: 主要是用来监听特定对象的创建或销毁.属性的变化的!                     是一个实现特定接口的普通java类! 对象:          自己创建自己用 (不用监听)          别人创建自己用 (需要监听)   Servlet中哪些对象需要监听?          request / session / servletContext          分别对应的是request监听器.session相关监听器.servletCo

javaweb Servlet开发总结(二)_java

一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: <servlet> <servlet-name>ServletConfigDemo1</servlet-name> <servlet-class>gacl.servlet.study.ServletConfigDemo1</servl

JavaWeb实现文件上传与下载实例详解_java

 在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,common-fileupload是依赖于

Servlet 技术

servlet 一.什么是Servlet Servlet是用Java编写的服务器端程序,由服务器端调用和执行的任何Java类. Servlet是使用Java Servlet应用程序设计接口(API)及相关类和方法的Java程序. 浏览器端也就是客户端运行的Java程序叫做Applet,而服务器端运行的Java程序叫做Servlet. 二.Servlet的主要功能 Servlet的主要功能在于交互式地浏览和修改数据生成动态Web内容.过程为: 1.客户端发送请求至服务器端. 2.服务器将请求信息发

一个用servlet实现导出csv文件的实例

servlet 作者:李书鹏 tukeyli@sohu.com 关键字: Java Servlet CSV 本文实现了一个基于servlet技术的简单的csv文件导出的程序实例. 代码如下,其中setCsvData函数的作用是设置导出的数据,并将结果保存于Vector中,实际应用时可以任意扩展该函数: package common; import java.io.IOException;import java.io.PrintWriter;import java.util.Vector;impo

【Alljoyn】Alljoyn学习笔记五 AllJoyn开源技术基础概念解析

AllJoyn开源技术基础概念解析 摘要: 总线(Bus) 实现P2P通信的基础 AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus 总线附件(Bus Attachment) 每一个连接到总线上的Alljoyn应用程序被称为总线附件,可用C++或Java编写 每个总线附件 ... 总线(Bus) 实现P2P通信的基础 AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus总线附件(Bus Attachment) 每一个连接到总线上的Alljoy