javaweb之listener详解

listener介绍

1.1 什么是监听器

Javaweb中的监听器是用于监听web常见对象HttpServletRequest,HttpSession,ServletContext

 

1.监听web对象创建与销毁的监听器

ServletContext创建与销毁要监听ServletContextListener

Httpsession的创建与与销毁监听HttpSessionListener

HttpServletRequest创建与销毁监听ServletRequestListener

 

2.监听web对象属性变化包括属性的(添加,删除,替换(key值一样的时候,调用两次set就会触发这个事件))

ServletContex的属性变化的监听ServletContextAttributeListener

Httpsession的属性变化的监听HttpSessionAttributeListener

HttpServletRequest的属性的变化的监听ServletRequestAttributeListener

3.监听session绑定javaBean(sessionset对象的时候触发)

HttpSessionBindingListener

HttpSessionActivationListener

 

1.2 监听器的作用

1.监听web对象创建与销毁.

2.监听web对象的属性变化

3.监听session绑定javaBean操作.

1.3 监听机制相关概念

1.事件----一件事情

2.事件源---产生这件事情的源头

3.注册监听---将监听器与事件绑定,当事件产生时,监听器可以知道,并进行处理。

4.监听器---对某件事情进行处理监听的一个对象

 

1.4 监听器的创建步骤

1创建监听器接口

2重写接口方法.

3配置web.xml

4测试监听器

listener对象创建与销毁

2.1 ServletContextlistener

2.1.1 创建监听器接口

public class MyServletContexListner implements ServletContextListener {

public void contextDestroyed(ServletContextEvent arg0) {

System.out.println("ServletContext上下文死亡");

}

public void contextInitialized(ServletContextEvent arg0) {

System.out.println("ServletContext上下文初始化的");

}

}

2.1.2 重写接口方法

2.1.3 配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<listener>

<listener-class>xiao.it.java.MyServletContexListner</listener-class>

</listener>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

2.1.3 测试监听器

启动tomcat或是停止tomcat

如上所示,web server启动的时候,应用的上下文被初始化了,所以出现了ServletContext上下文初始化,当web server停止的时候出现了ServletContext上下文死亡。这个就相当于我们的application对象。

2.2 HttpSessionListener

2.1创建监听器接口

public class MyHttpsessionListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent arg0) {

System.out.println("session被创建了");

}

public void sessionDestroyed(HttpSessionEvent arg0) {

System.out.println("session被销毁了");

}

}

 

2.2重写接口方法.

2.3配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<!--

<listener>

<listener-class>xiao.it.java.MyServletContexListner</listener-class>

</listener>

 -->

<listener>

<listener-class>xiao.it.java.MyHttpsessionListener</listener-class>

</listener>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

 

2.4测试监听器

2.4.1 session创建监听

1访问地址的时候session被创建,刷新的时候已经不会再创建了,因为浏览器中已经有sessionId了,所以已经不会再创建了

2 getSession的时候


2.4.1 session销毁监听

  1 默认超时30分钟

2 关闭服务器

3 调用sessioninvalidate()方法销毁

4 setMaxInactiveInterval(int interval) 可以设置超时时间

2.3 HttpServletRequestListener

2.3.1创建监听器接口

public class MyHttpServletRequestListener implements ServletRequestListener{

public void requestDestroyed(ServletRequestEvent arg0) {

System.out.println("request销毁了");

}

public void requestInitialized(ServletRequestEvent arg0) {

System.out.println("request创建了");

}

}

 

2.3.2重写接口方法.

2.3.3配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<listener>

<listener-class>xiao.it.java.MyHttpServletRequestListener</listener-class>

</listener>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

2.3.4测试监听器

访问浏览器对象

 

创建的时候主要是在访问浏览器的时候,会调用service()方法,service()方法调用开始或者销毁的时候会销毁request对象。

 

listener对象属性维护

3.1 ServletContextAttributeListener

3.1.1创建监听器接口

public class MyServletContextListener implements ServletContextAttributeListener {

public void attributeAdded(ServletContextAttributeEvent serv) {

System.out.println("servletcontext添加");

}

public void attributeRemoved(ServletContextAttributeEvent par) {

System.out.println("servletcontext删除");

}

public void attributeReplaced(ServletContextAttributeEvent param) {

System.out.println("servletcontext替换");

}

}

3.1.2重写接口方法.

3.1.3配置web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<listener>

<listener-class>xiao.it.java.MyServletContextListener</listener-class>

</listener>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

3.1.4测试监听器

<%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="utf-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<title>Insert title here</title>

</head>

<body>

<%

        getServletContext().setAttribute("dsa", "dsa");

%>

</body>

</html>


如上图所示当页面初始化的时候就变更了,同名刷新用户

3.2 HttpSessionAttributeListener

      同上

3.3 ServletRequestAttributeListener

同上

 

session监听绑定javabean

4.1 HttpSessionBindingListener

4.1.1 绑定对象

public class User implements HttpSessionBindingListener{

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void valueBound(HttpSessionBindingEvent arg0) {

System.out.println("用户被绑定");

}

public void valueUnbound(HttpSessionBindingEvent arg0) {

System.out.println("用户被解除绑定");

}

}

4.1.2 实现绑定方法

4.1.3 测试绑定

<%@page import="xiao.its.ajax.User"%>

<%@ page language="java" contentType="text/html; charset=utf-8"

    pageEncoding="utf-8"%>

<%

 request.getSession().setAttribute("u", new User());

%>

4.2 HttpSessionActivationListener

活化钝化:是指实现了序列化接口的对象,放到session中的时候,如果当前对象没有实现序列化接口的话,那么当服务器停止的时候,就不会被钝化到tomcatD:\xampp\tomcat\work\Catalina\localhost\指定项目路径下,tomcat启动以后,加载session对象的页面就不能直接从缓存活化对象。只有实现了序列化接口对象才能被钝化,重新启动以后对象才能活化到页面上显示。

4.1 邦定对象

public class User implements Serializable, HttpSessionBindingListener,HttpSessionActivationListener{

private static final long serialVersionUID = 8729714622867334210L;

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public void valueBound(HttpSessionBindingEvent arg0) {

System.out.println("用户被绑定");

}

public void valueUnbound(HttpSessionBindingEvent arg0) {

System.out.println("用户被解除绑定");

}

public void sessionDidActivate(HttpSessionEvent arg0) {

System.out.println("活化");

}

public void sessionWillPassivate(HttpSessionEvent arg0) {

System.out.println("钝化");

}

}

4.2 实现绑定的方法

4.3 测试活化,钝化

1 关闭tomcat的时候



2 启动tomcat的时候

监听器小例子

业务:把所有收集到的session进行迭代,每个5秒定时销毁session

 

5.1 ServletContextlistener

public class MyServletContexListner implements ServletContextListener {

public void contextDestroyed(ServletContextEvent arg0) {

System.out.println("ServletContext上下文死亡");

}

public void contextInitialized(ServletContextEvent arg0) {

final List sessions=Collections.synchronizedList(new ArrayList());

ServletContext servletContext = arg0.getServletContext();

servletContext.setAttribute("sessions", sessions);

Timer t=new Timer();

t.schedule(new TimerTask() {

public void run() {

 for(Iterator  ite=sessions.iterator();ite.hasNext();){

 HttpSession session = (HttpSession) ite.next();

 session.invalidate();

 ite.remove();

 }

}

}, 1000, 5000);

}

}

5.2 HttpSessionlistener

public class MyHttpsessionListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent arg0) {

HttpSession session = arg0.getSession();

    ServletContext servletContext = session.getServletContext();

    List attribute = (List) servletContext.getAttribute("sessions");

    attribute.add(session);

    System.out.println("session被创建了");  

}

public void sessionDestroyed(HttpSessionEvent arg0) {

System.out.println("session被销毁了");

}

}

5.3 web.xml配置

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

id="WebApp_ID" version="2.5">

<listener>

<listener-class>xiao.it.java.MyServletContexListner</listener-class>

</listener>

<listener>

<listener-class>xiao.it.java.MyHttpsessionListener</listener-class>

</listener>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

5.4 测试结果



  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值