Tomcat之Listener&Filter
1.Listener详解
1.Listener介绍
监听器,监听某一个事件的发生或者某一个状态的改变,不论什么监听器的实现都是基于接口回调,监听器的内部机制就是接口回调。
2.监听器原理
没考虑回调的做法:
TestA.java
package com.nikehu.demo;
public class TestA {
public void print(){
for (int i = 0; i < 10; i++) {
System.out.println("循环到了--"+i);
if(i==5){
System.out.println("循环到了5了,该通知TestB");
TestB tb = new TestB();
tb.printFive();
}
}
}
}
TestB.java
package com.nikehu.demo;
public class TestB {
public void printFive(){
System.out.println("A已经循环到了5,所以TestB的这个方法将被调用");
}
}
接口回调
需求:A在执行循环,当A触发某一事件时或,某一状态改变时通知B;
实现先把某一个对象传递给A,当A触发某一条件时,通过这个对象来调用B中的方法。不是直接传递B的实例,而是床底一个接口的实例过去。不能直接new B(),也不能传一个B的实例,A和B之间借助接口去联系上
TestA.java
package com.nikehu.demo;
import com.nikehu.demo01.PrintListener;
public class TestA {
public void print(PrintListener p){
for (int i = 0; i < 10; i++) {
System.out.println("循环到了--"+i);
if(i==5){
System.out.println("循环到了5了,该通知监听器了");
p.print();
}
}
}
}
PrintListener.java
package com.nikehu.demo01;
/**
* 打印监视器
* @author 猪猪
* 1988
*/
public interface PrintListener {
/**
* 一旦触发某一条件就调用这个方法
*/
void print();
}
TestB.java
package com.nikehu.demo;
import com.nikehu.demo01.PrintListener;
public class TestB implements PrintListener{
public void printFive(){
System.out.println("A已经循环到了5,所以TestB的这个方法将被调用");
}
@Override
public void print() {
System.out.println("A已经循环到了5,所以TestB的这个方法将被调用");
}
}
Test01.java
package com.nikehu.demo;
import org.junit.Test;
import com.nikehu.demo01.PrintListener;
public class Test01 {
@Test
public void test01(){
TestA ta = new TestA();
ta.print(new TestB());
}
@Test
public void test02(){
TestA ta = new TestA();
ta.print(new PrintListener(){
@Override
public void print() {
System.out.println("匿名内部类实现了Printlistener这个接口");
}
});
}
}
Web监听器总共有8个,可以划分成三种各类型:
第一种:监听三个作用域创建和销毁
第二种:监听三个作用域属性状态变更
第三种:监听HttpSession里面存值的状态变更
3.Listener监听三个作用域创建和销毁
作用域:pageContext,request,session,application
监听的是:
request,—HttpServletRequest—ServletRequestListener
session,—HttpSession—HttpSessionListener
application —ServletContext—ServletContextListener
ServletContext:
1.启动服务器的时候创建
2.关闭服务器或项目从服务器移除的时候销毁
如何注册监听器:
1.定义一个类实现接口
package com.nike.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener初始化了");
}
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener销毁了");
}
}
2.注册|配置监听器
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" 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">
<display-name>listener01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<