您的位置:首页 > 编程语言 > Java开发

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

接口

ServletContextAttributeListener

HttpSessionAttributeListener

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的示例

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对象

源代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: