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. 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器

    目录 一.概述 二. 数据结构 2.1 链表 2.2 二叉堆 三. 从setTimeout理解Timer模块源码 3.1 timers.js中的定义 3.2 Timeout类定义 3.3 active ...

  2. [WPF 自定义控件]让Form在加载后自动获得焦点

    1. 需求 加载后让第一个输入框或者焦点是个很基本的功能,典型的如"登录"对话框.一般来说"登录"对话框加载后"用户名"应该马上获得焦点,用 ...

  3. 选择企业架构实践公开课的指导?TOGAF+ArchiMate+BangEA,EA工作者必学一门公开课

    我发现身边越来越多人谈数字化.谈企业架构,但是感觉谈的总是IT?知道好像不对,但是又好像也无法告诉别人这和传统的IT架构有什么不一样?网上找资料,看了很多也摸不到门路,也不知道别人讲的对不对.对了还好 ...

  4. SAP MCH1表和MCHA表更新逻辑

    SAP MCH1表和MCHA表更新逻辑 笔者所在的A项目里,批次是在material level 唯一, 意味着不同物料号可以有相同的批次号,只要物料号+批次号组合是唯一的即可. SE11 看MCH1 ...

  5. ios11下适配UItableView

    参考链接: https://www.cnblogs.com/spider-pei/p/7592906.html

  6. python小技巧 小知识

    python小技巧 小知识 python系统变量(修改调用shell命令路径)或用户空间说明 20150418 python调用系统命令,报找不到.怎么办? 类似执行shell的: [ -f /etc ...

  7. linux学习(七)Shell编程中的变量

    目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...

  8. opensciencegrid - GridFTP 安装

    最近配置一个GridFTP 用于测试其传输FTP性能, 在这里简单记录,备忘:使用本教程可以简单起一个GridFTP用于测试服务: 预配置环境: 测试系统:CentOS 7 1806 配置Yum仓库: ...

  9. appium+robotframework+python连接真机定位不到元素的问题处理

    这几天遇到了一个比较奇怪的问题,使用RF框架进行自动化测试的时候定位不到部分元素 并且这个元素的是有id的,更换了xpath定位也行不通,冥思苦想,加上谷歌百度,终于解决了 解决步骤如下: 1.定位问 ...

  10. RPM命令总结

    RPM软件管理程序 rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他 ...