monitor - juedaiyuer/researchNote GitHub Wiki

#监听器#

web监听器

客户端请求
服务端操作

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

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

用途

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

第一个监听器

##步骤##

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

创建监听器的一个类

web.xml的配置

##启动顺序##

优先级

监听器>过滤器>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对象

源代码

⚠️ **GitHub.com Fallback** ⚠️