博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb-Servlet技术的监听器-解析与实例-网站在线用户信息与网页点击量
阅读量:6948 次
发布时间:2019-06-27

本文共 8074 字,大约阅读时间需要 26 分钟。

转载请注明出处: http://blog.csdn.net/qq_26525215

本文源自【】

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

事件源             监听对像的创建和销毁           监听对像上属性的添加和删除 HttpSession       HttpSessionListener        HttpSessionAttributeListener - HttpSessionEventServletRequest    ServletRequestListenr          ServletRequestAttributeListener - ServletRequestEventServletContext   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标签之前

完整类名

这一点与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:

完整类名

例如:在jsp页面中:

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

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

分析:

网页点击量:

记录一个网站的点击量。当服务器关闭时,必须要保存到文件中或是数据库中去。当服务器启动时,先从文件中读取并放到ServletContext。在Filter中(用ServletRequestListenr也可以)记录访问量,每次访问都加1。好处:信息不是太重要,没有必要每次用户访问都访问数据库或是操作文件。在为不影响用户的速度感受,应该开始一个新的线程同去操作数据。这样即使在后台使用同步技术,用户也不会感觉到速度很慢。

在线人信息:

利用HttpSessionListener,监听HttpSession的创建和销毁。sessionCreatedsessionDestroyedSession的默认有效时间为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" %>      在线人的信息与网站点击量的实现        

在线人的信息与网站点击量的实现

查看在线人信息

姓名:
点击量:${count}

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
guests = (List
) se.getSession().getServletContext().getAttribute("guests");//在线人的集合 if(guests==null){
//第一个访问网站的人--沙发 guests = new ArrayList
(); se.getSession().getServletContext().setAttribute("guests", guests);//设置guests属性 } guests.add(se.getSession());//将第一个用户的session添加到在线人集合 } @Override public void sessionDestroyed(HttpSessionEvent se) { List
guests = (List
) 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
logins = (List
) se.getSession().getServletContext().getAttribute("logins"); if(logins==null){ logins = new ArrayList
(); se.getSession().getServletContext().setAttribute("logins", logins); } logins.add(se.getSession()); } } @Override public void attributeRemoved(HttpSessionBindingEvent se) { } @Override public void attributeReplaced(HttpSessionBindingEvent se) { }}

web.xml:

charset
cn.hncu.filter.CharsetFilter
charset
/*
cn.hncu.listeners.MyServletContextListener
cn.hncu.listeners.MyServletRequestListenr
cn.hncu.listeners.MyHttpSessionAttributeListener
cn.hncu.listeners.MyHttpSessionListener
LoginServlet
cn.hncu.servlets.LoginServlet
ShowServlet
cn.hncu.servlets.ShowServlet
LoginServlet
/servlet/LoginServlet
ShowServlet
/servlet/ShowServlet
index.jsp

演示结果:

完整源码链接:

myOnlinesWeb.zip文件。

转载请注明出处: http://blog.csdn.net/qq_26525215

本文源自【】

你可能感兴趣的文章
Web压力测试记录
查看>>
seci-log 1.12 发布 增加了http 旁路抓包审计
查看>>
对于舞蹈的认识与评价
查看>>
Android与服务器端数据交互(基于SOAP协议整合android+webservice)
查看>>
SSH视频教程学习笔记
查看>>
Java代理模式 与 Java 动态代理
查看>>
我是如何开始去了解Python函数式编程--Python函数式编程初涉
查看>>
解决文字和表情存储到msql数据库出现异常问题
查看>>
oracle python
查看>>
Python 17.3 WSGI接口
查看>>
mysql日常小练习-20171012
查看>>
java之CountDownLatch看看笔记
查看>>
Implement_strStr --leetcode
查看>>
我的友情链接
查看>>
centos 7设置smtp发送163邮件
查看>>
文件服务器之Branchcache分布式缓存
查看>>
我的友情链接
查看>>
Java设计模式百例 - 抽象工厂模式
查看>>
依赖倒置原则 DIP(Dependence Inversion Principle)
查看>>
智能硬件的简单剖析
查看>>