JavaWeb进阶--监听器

监听器:
 

监听器的常见应用场景:


监听器的开发步骤:
 


案例:监听器的基本实现 WebListenerDemo

MyFirstListener.java:

package com.imooc.listener;
/**
 * 全局对象监听器
 * @author lcs
 */

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

public class MyFirstListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		System.out.println("context destroyed... ...");

	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		System.out.println("context initialized... ...");

	}

}

在web.xml进行配置:
 

  <!-- 配置监听器类路径 -->
  <listener>
  	<listener-class>com.imooc.listener.MyServletContextListener</listener-class>
  </listener>

多监听器启动顺序:

根据web.xml文件的注册顺序进行启动,根据其逆序进行关闭
 


监听器分类:
按监听对象:

按监听事件:
 


域对象自身的创建和销毁事件监听器:

ServletContext:
 

ServletContextListener:

package com.imooc.listener;

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

public class MyServletContextListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent sce) {
		String appName = (String)sce.getServletContext().getAttribute("app_name");
		String version = (String)sce.getServletContext().getAttribute("version");
		
		System.out.println("MyServletContextListener destroyed,appName:" + appName + ",version:" + version);


	}

	@Override
	public void contextInitialized(ServletContextEvent sce) {
		String appName = sce.getServletContext().getInitParameter("app_name");
		String version = sce.getServletContext().getInitParameter("version");

		sce.getServletContext().setAttribute("app_name", appName);
		sce.getServletContext().setAttribute("version", version);

		System.out.println("MyServletContextListener init,appName:" + appName + ",version:" + version);

	}

}

web.xml对其进行的配置:
 

  <!-- 初始化参数 -->
  <context-param>
  	<param-name>app_name</param-name>
  	<param-value>Listener Web</param-value>
  </context-param>
  
  <context-param>
  	<param-name>version</param-name>
  	<param-value>1.0</param-value>
  </context-param>

  <listener>
  	<listener-class>com.imooc.listener.MyServletContextListener</listener-class>
  </listener>

HttpSession: 

HttpSessionListener.java:

package com.imooc.listener;

import java.util.Date;

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

public class MyHttpSessionListener implements HttpSessionListener {

	@Override
	public void sessionCreated(HttpSessionEvent hse) {
		String sessionId = hse.getSession().getId();
		Date createTime = new Date(hse.getSession().getCreationTime());
		
		System.out.println("session id:"+sessionId+"\n创建时间:"+createTime);

	}

	@Override
	public void sessionDestroyed(HttpSessionEvent hse) {
		String sessionId = hse.getSession().getId();
		System.out.println("session destroyed,session id:"+sessionId);
		System.out.println("销毁时间:"+new Date());
	}

}

在web.xml文件进行的配置:

  <listener>
  	<listener-class>com.imooc.listener.MyHttpSessionListener</listener-class>
  </listener>

  <!-- 设置session对象的有效期,单位是分钟,强制在期限过后对session对象进行销毁 -->
  <session-config>
  	<session-timeout>1</session-timeout>
  </session-config>

在不同浏览对其进行访问:
 

在服务器控制台会输出:
两个session信息

session id:A325711922A990D9C392AED2EF0CA12F
创建时间:Thu Apr 25 15:33:52 CST 2019
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
session id:0F0377034FFF83F4AFCF295999C8DE89
创建时间:Thu Apr 25 15:34:02 CST 2019
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
request listener,request destroyed... ...
session destroyed,session id:0F0377034FFF83F4AFCF295999C8DE89

等待一分钟以后:两个session分别会销毁

销毁时间:Thu Apr 25 15:35:29 CST 2019
session destroyed,session id:A325711922A990D9C392AED2EF0CA12F
销毁时间:Thu Apr 25 15:35:29 CST 2019

ServletRequest:
 

ServletRequest:
ServletRequestListener.java:
 

package com.imooc.listener;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;

public class MyServletRequestListener implements ServletRequestListener {

	@Override
	public void requestDestroyed(ServletRequestEvent sre) {
		System.out.println("request listener,request destroyed... ...");

	}

	@Override
	public void requestInitialized(ServletRequestEvent sre) {
		HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();

		String path = request.getRequestURI();
		String par = request.getParameter("par");

		System.out.println("request listener,path:" + path + ",par is :" + par);

	}

}

在web.xml里的配置信息:
 

  <listener>
  	<listener-class>com.imooc.listener.MyServletContextAttributeListener</listener-class>
  </listener>

输出结果:

点击初始化:
会在服务器控制台输出

request listener,path:/WebListenerDemo/,par is :null
session id:E8CC834C80F59C4D8B3EEC39E91A92B6
创建时间:Thu Apr 25 15:49:24 CST 2019
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/,par is :null
request listener,request destroyed... ...
request listener,path:/WebListenerDemo/servlet_request.jsp,par is :request_par
request listener,request destroyed... ...

属性创建、替换和消除监听器:


以ServletContextAttributeListener为例:
 

package com.imooc.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

public class MyServletContextAttributeListener implements ServletContextAttributeListener {

	@Override
	//增加属性
	public void attributeAdded(ServletContextAttributeEvent scae) {
		System.out.println("ServletContext#attAdded#name:" + scae.getName() + "#value:"	+ scae.getValue());

	}

	@Override
	//移除属性
	public void attributeRemoved(ServletContextAttributeEvent scae) {
		System.out.println("ServletContext#attRemoved#name:" + scae.getName() + "#value:"	+ scae.getValue());

	}

	@Override
	//替换属性
	public void attributeReplaced(ServletContextAttributeEvent scae) {
		System.out.println("ServletContext#attReplaced#name:" + scae.getName() + "#value:"	+ scae.getValue());

	}

}

在web.xml配置属性:

 <listener>
  	<listener-class>com.imooc.listener.MyServletContextAttributeListener</listener-class>
  </listener>

attribute_init.jsp:
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
    application.setAttribute("servletcontextPar", "servletcontext_par");
%>
<!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></title>
</head>
<body>
  <h1>attribute_add_listener_test</h1>
</body>
</html>

 

输出结果:
点击属性初始化:

跳转到页面:
 

在服务器后台输出:属性已被添加

 


Session对象状态监听器:

执行过程: 

测试代码:

User.java:继承了HttpSessionBindingListener,不需要在web.xml进行注册

package com.imooc.model;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class User implements HttpSessionBindingListener {
	
	private String username;
	private String password;

	@Override
	public void valueBound(HttpSessionBindingEvent hsbe) {
		String name = hsbe.getName();
		
		System.out.println("value bound,name:"+name);

	}

	@Override
	public void valueUnbound(HttpSessionBindingEvent hsbe) {
		String name = hsbe.getName();
		
		System.out.println("value unbound,name:"+name);

	}

	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;
	}

}

首页代码:

  	<label>
		<span>BindingListener测试</span>
		<a href="bound.jsp" target="_blank">绑定测试</a>
		<a href="unbound.jsp" target="_blank">解绑测试</a>
	</label>

bound.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
   session.setAttribute("user", new com.imooc.model.User());
%>
<!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></title>
</head>
<body>
  <h1>binding_listener_test</h1>
</body>
</html>

unbound.jsp:
 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
   session.removeAttribute("user");
%>
<!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></title>
</head>
<body>
  <h1>unbinding_listener_test</h1>
</body>
</html>

测试结果:

分别点击:绑定测试、解绑测试

先后挑战到两个页面:

 



项目:Java过滤器监听器项目

github地址:
 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值