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. Vue 从入门到进阶之路(十三)

    之前的文章我们介绍了一下 vue 中的作用域插槽,本章我们来看一下动态组件与 v-once 指令. <!DOCTYPE html> <html lang="en" ...

  2. maven配置阿里云仓库镜像

    全局配置 修改settting文件 在mirrors标签下添加子节点. <mirror> <id>nexus-aliyun</id> <mirrorOf> ...

  3. 学习使人快乐9--eclipse常用快捷键总结

    Ctrl + F11 按上次方式执行Ctrl + Shift + / 加上注释/**/Ctrl + Shift + \ 取消注释/**/Ctrl + /  加上或消除行注释Ctrl + D 删除当前行 ...

  4. Pycharm2019最新激活注册码(pycharm激活教程)

    给大家分享一下PyCharm2019最新可用的激活注册码.激活Pycharm专业版的方法有很多,这里主要给大家分享最有效的两种,一种是使用最新可用的注册激活码,一种是使用破解补丁的方法,这种方法虽然麻 ...

  5. 常用adb命令总结

    前言 很早就想整理一下自己平时常用的一些adb命令,不仅为了便于以后查找,而且整理的过程自己又重新复习了一遍,但是当我开始在度娘一搜的时候,发现很多人已经写的非常详细了,尤其是当我发现了这篇adb概括 ...

  6. Command CompileSwiftSources failed with a nonzero exit code

    Xcode错误提示:Command CompileSwiftSources failed with a nonzero exit code,网上找了好多才搞定,通过在Build Setting里面自添 ...

  7. 【课件】git零基础快速入门实战--重点讲解,在实际生产中整合idea对版本、分支的管理等

    1.git简单描述 git是重要的版本管理工具,几乎每个码农都有自己的git账号管理自己的代码,同时很多公司也是用git管理公司的代码, 因此掌握git在实际生产中的常规使用非常重要. 2.git学习 ...

  8. Redis之高可用、集群、云平台搭建(非原创)

    文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Cluster(分布式集群)实战五.Java之Je ...

  9. MYSQL主从复制--传统方式

    目录 0.MYSQL主从复制概述 1.主从复制的作用 2.主从复制存在的问题 3.主从复制问题的解决办法 4.主从复制的原理(面试必问) 1.MYSQL主从复制-传统方式 1.环境准备 2.Maste ...

  10. 房屋布局分析《Physics Inspired Optimization on Semantic Transfer Features: An Alternative Method for Room Layout Estimation》

    视觉算法在智能审核系统上的演进与实践 刘天悦 贝壳找房 / 资深工程师 https://static001.geekbang.org/con/56/pdf/1088777747/file/%E8%A7 ...