Fliter & Listener

Listener

监听器

作用

监听某一事件的发生。状态的改变。

监听器内部实现机制

接口回调

接口回调

A在执行循环,当循环到5的时候, 通知B。

事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。

web监听器

8个,3类

如何创建监听器

定义一个类,实现相关的监听器接口,然后在web.xml中配置。

也可以直接通过编译器创建。

监听作用域的创建和销毁

作用域 ------ 对应的类 ------- 对应的监听器接口

request — httpServletRequest ----- ServletRequestListener

session — httpSession ---- HttpSessionListener

application — ServletContext------- ServletContextListener

1.request — httpServletRequest ----- ServletRequestListener

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener; public class listenertest2 implements ServletRequestListener{
//监听作用域对象的销毁
public void requestDestroyed(ServletRequestEvent sre) {
//这样写是为了直观看到监听器是否被使用,实际项目中根据需求书写
System.out.println("RequestListener 销毁了");
}
//监听作用域对象的创建
public void requestInitialized(ServletRequestEvent sre) {
//这样写是为了直观看到监听器是否被使用,实际项目中根据需求书写
System.out.println("RequestListener 创建了");
}
}
作用

监听request对象的创建和销毁

作用域
request创建:
访问服务器上的任意资源都会有请求出现。
访问 html: 会
访问 jsp: 会
访问 servlet : 会
request销毁:
服务器已经对这次请求作出了响应。

2.session — httpSession ---- HttpSessionListener

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener; public class listenertest3 implements HttpSessionListener{
//监听作用域对象的创建
public void sessionCreated(HttpSessionEvent se) {
System.out.println("SessionListener 创建了");
}
//监听作用域对象的销毁
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("SessionListener 销毁了");
}
}
作用

监听session对象的创建与销毁

统计在线人数.

作用域
session的创建
只要调用getSession
html: 不会
jsp: 会 getSession();
servlet: 会
session的销毁
超时 30分钟
非正常关闭 销毁 ​ 正常关闭服务器(序列化)

3.application — ServletContext------- ServletContextListener

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener; public class listenertest1 implements ServletContextListener{
//监听作用域对象的创建
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ContextListener 创建了");
}
//监听作用域对象的销毁
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ContextListener 销毁了");
}
}
作用

监听application 对象的创建与销毁

利用它来,在servletcontext创建的时候,

  1. 完成自己想要的初始化工作
  2. 执行自定义任务调度。 执行某一个任务。 Timer
作用域

servletcontext创建:

​ 启动服务器的时候

servletContext销毁:

​ 关闭服务器. 从服务器移除项目

监听三个作用域属性状态变更

作用域 --------- 对应监听其属性的监听器接口

servletContext — ServletContextAttributeListener

request — ServletRequestAttributeListener

session — HttpSessionAttributeListener

servletContext — ServletContextAttributeListener

request — ServletRequestAttributeListener

session — HttpSessionAttributeListener

监听HttpSession中的存值状态

这一类监听器不用注册

HttpSessionBindingListener

1. 让javaBean 实现该接口即可

@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("对象被绑定进来了");
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("对象被解除绑定");
}
作用

监听对象与session 绑定和解除绑定 的动作

HttpSessionActivationListener

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent; public class bean02 implements HttpSessionActivationListener,Serializable {
int a;
public bean02(int a) {
super();
this.a = a;
}
//get和set方法得写上不然通过jsp的EL表达式取不到值
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println("sessoin 钝化");
}
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println("sessoin 活化");
}
}
作用

用于监听现在session的值 是 钝化 (序列化)还是活化 (反序列化)的动作

钝化 (序列化)

把内存中的数据 存储到硬盘上

活化 (反序列化)

把硬盘中的数据读取到内存中。

session的钝化活化的用意何在

session中的值可能会很多, 并且我们有很长一段时间不使用这个内存中的值, 那么可以考虑把session的值可以存储到硬盘上【钝化】,等下一次在使用的时候,在从硬盘上提取出来。 【活化】

如何让session的在一定时间内钝化.

做配置即可

1. 在tomcat里面 conf/context.xml 里面配置

		对所有的运行在这个服务器的项目生效  

2. 在conf/Catalina/localhost/context.xml 配置

		对 localhost生效。  localhost:8080

3. 在自己的web工程项目中的 META-INF/context.xml

		只对当前的工程生效。

	maxIdleSwap : 1分钟不用就钝化
directory : 钝化后的那个文件存放的目录位置,可自定义。 D:\tomcat\apache-tomcat-7.0.52\work\Catalina\localhost\ListenerDemo\wf <Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="wf"/>
</Manager>
</Context>

Filter

过滤器,对客户端发出的请求进行过滤。在浏览器发出请求后,就由过滤器进行过滤,然后才交给servlet处理。其实过滤器起到拦截作用。

作用
  1. 对一些敏感词汇进行过滤
  2. 统一设置编码
  3. 自动登录

如何使用filter

1.定义一个类实现Filter接口

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class filter02 implements Filter { //过滤器销毁时调用
public void destroy() { }
//在执行过滤时调用
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("fliter02");
//chian的作用是当过滤器检测后,如果不用把请求过滤掉,那么就使用chain把请求传递到下一个地方。
chain.doFilter(request, response);
}
//过滤器创建时调用
public void init(FilterConfig fConfig) throws ServletException { }
}

2.过滤器注册

在web.xml中注册和servlet注册方法基本一样

  <filter>
<display-name>FilterDemo</display-name>
<filter-name>filter02</filter-name>
<filter-class>test4.filter02</filter-class>
</filter>
<filter-mapping>
<filter-name>filter02</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Filter的生命周期

创建

​ 在服务器启动的时候就创建。

销毁

​ 服务器停止的时候。

Filter执行顺序

  1. 客户端发出请求,先经过过滤器, 如果过滤器放行,那么才能到servlet
  2. 如果有多个过滤器, 那么他们会按照注册的映射顺序 来 排队。 只要有一个过滤器, 不放行,那么后面排队的过滤器以及咱们的servlet都不会收到请求。

Filter细节:

  1. init方法的参数 FilterConfig , 可以用于获取filter在注册的名字 以及初始化参数。 其实这里的设计的初衷与ServletConfig是一样的。
  2. 如果想放行,那么在doFilter 方法里面操作,使用参数 chain
	chain.doFilter(request, response); 放行, 让请求到达下一个目标。
  1. /* 写法格式与servlet一样。

    1. 全路径匹配 以 / 开始

      /LoginServlet

    2. 以目录匹配 以 / 开始 以 * 结束

      /demo01/*

    3. 以后缀名匹配 以 * 开始 以后缀名结束

      *.jsp *.html *.do

  2. 针对 dispatcher 设置

    REQUEST : 只要是请求过来,都拦截,默认就是REQUEST

    FORWARD : 只要是转发都拦截。

    ERROR : 页面出错发生跳转

    INCLUDE : 包含页面的时候就拦截。

JavaWeb之Fliter & Listener的更多相关文章

  1. JavaWeb基础—监听器Listener

    javaWeb三大组件: servlet listener(用的不多) filter 什么叫监听器: 初次相见:AWT 二次相见:SAX(XML解析时)Bundle 绑定 监听器是一个接口,内容由我们 ...

  2. Javaweb基础--->监听器listener(转发)

    JavaWeb中的监听器 1.基本概念 JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext, HttpSession和 Servl ...

  3. 深入分析JavaWeb Item38 -- 监听器(Listener)高速学习

    一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其它对象身上发生的事件或状态改变进行监听和对应处理的对象,当被监视的对象发生情况时,马上採取对应的行动.监听器事实上就是一个实现特定接口的普 ...

  4. 深入分析JavaWeb Item39 -- 监听器(Listener)学习进阶

    一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...

  5. JavaWeb 三大器--Listener、Filter 和Interceptor 总结

    说明:web.xml的加载顺序是:[Context-Param]->[Listener]->[Filter]->[Servlet],而同个类型之间的实际程序调用的时候的顺序是根据对应 ...

  6. JavaWeb学习笔记--Listener

    JSP中的监听器   Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止.Session会话的开始和销毁.用户请求的开始和结束等等.有时程序员需要在这些事件发生的时机执行一 ...

  7. javaWeb学习之Listener监听

    ] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet  listener  filt ...

  8. javaweb(4)之Listener&Filter

    监听器 (Listener) 介绍 监听器用于监听 web 应用中某些对象.信息的创建.销毁.增加,修改,删除等动作的发生,然后作出相应的响应处理.当范围对象的状态发生变化的时候,服务器自动调用监听器 ...

  9. JavaWeb 补充(Filter&Listener)

    目录 Filter:过滤器 Listener:监听器 Filter:过滤器 1. 概念:     * 生活中的过滤器:净水器,空气净化器,土匪.     * web中的过滤器:当访问服务器的资源时,过 ...

随机推荐

  1. 动态数组原理【Java实现】(六)

    前言 接下来我们进入集合学习,看过很多文章一上来就是讲解原理感觉会特别枯燥,任何成熟解决方案的出现都是为了解决问题,若通过实际问题引入然后再来讲解原理想必学起来必定事半功倍,从我写博客的那一天起,我就 ...

  2. c#时间戳相互转换

    /// <summary> /// 获取时间戳 /// </summary> /// <returns></returns> public static ...

  3. 清新简约风格毕业论文答辩PPT模板推荐

    不管是学生还是老师,应该经常会需要学生答辩的PPT模板,今天给大家推荐织梦58的学生答辩ppt模板. 模版来源:http://ppt.dede58.com/gongzuohuibao/26494.ht ...

  4. 怎么将CAD转PNG格式?这两种方法值得收藏

    在从事相关CAD工作的小伙伴们都知道,CAD中不光需要绘制各种各样的图纸,还需要根据工作的需要来进行图纸格式的转换工作.那有的时候就需要将CAD转换成PNG格式的图片进行使用.那怎么将CAD转PNG格 ...

  5. 如何搭建node - express 项目

    基于博主也是个菜鸟,亲身体验后步骤如下: 首先,我们需要安装node.js,  https://www.runoob.com/nodejs/nodejs-install-setup.html 安装完成 ...

  6. grant localhost and % for mysql

  7. Python—创建进程池的方式

    创建进程池 from multiprocessing import Pool import time,os result = [] # 存放所有worker函数的返回值 def worker(msg) ...

  8. Python语法速查: 3. 字符串格式化

    返回目录 (1)简易字符串格式化 字符串属于不可变序列,只能生成新的,不能改变旧的.“字符串格式化”有点像以前C语言的sprintf,可以将若干变量代入格式化的字符串,生成一个符合要求的新字符串. 转 ...

  9. LINUX中查看、添加、删除PATH以及永久添加PATH

    1.查看PATH变量 echo $PATH 会出现: 路径1:路径2:路径3 2.添加PATH变量 export PATH=$PATH:新添加的路径 用此方法添加的PATH,在关闭或者重启LINUX后 ...

  10. JVM的类加载过程以及双亲委派模型详解

    JVM的类加载过程以及双亲委派模型详解 这篇文章主要介绍了JVM的类加载过程以及双亲委派模型详解,类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象 ...