当前位置: 首页 > news >正文

(过滤器)Filter和(监听器)listener

过滤器 Filter

Filter是什么?

  • JavaWeb的一个重要组件,可以对发送到servlet的请求进行拦截过滤,也可以对响应进行拦截

  • Filter是实现了Filter接口的Java类

  • Filter需要在web.xml中进行注册,也可以通过注解来注册。

如何创建一个Filter—只需要创建一个类,实现Filter接口即可。

字符集的过滤器

package afternoon.filter;
​
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/*
    字符编码集的过滤器
    过滤拦截什么请求?
 */
@WebServlet
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
​
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
​
        //放行
        filterChain.doFilter(servletRequest, servletResponse);
        
        /*
            给response添加响应头,text/html,后台向前台输出字符串的时候
            当后台向前台输出的是json串的格式时,不需要设置这个。
         */
        response.addHeader("content-type","text/html;charset=utf-8");
    }
}

监听器 listener

专门用于对其他对象身上发生的事件或状态改变进行监听和响应的处理

主要监听作用域的对象的改变

监听器监听的是域对象,不是监听对象的某个地址

JavaEE(servlet)三大件

servlet、filter、listener

监听器的分类

  • 监听域对象自身的创建和销毁

package afternoon.listener;

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 HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        ServletRequestListener.super.requestDestroyed(sre);
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ServletRequestListener.super.requestInitialized(sre);
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSessionListener.super.sessionCreated(se);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSessionListener.super.sessionDestroyed(se);
    }
}
  • 监听域对象中属性的增加和删除

package afternoon.listener;
​
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/*
    监听域对象中属性的增加和删除
 */
​
@WebListener
public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener {
​
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeAdded(scae);
    }
​
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeRemoved(scae);
    }
​
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeReplaced(scae);
    }
​
    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeAdded(srae);
    }
​
    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeRemoved(srae);
    }
​
    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeReplaced(srae);
    }
​
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeAdded(se);
    }
​
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeRemoved(se);
    }
​
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        HttpSessionAttributeListener.super.attributeReplaced(se);
    }
}
​
  • 监听绑定到session中的某个对象的状态的事件监听

package afternoon.listener;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

/*
    监听绑定到session中的某个对象的状态的事件监听
 */
public class HelloSessionListener implements HttpSessionActivationListener {


    //在钝化之前被调用
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        HttpSessionActivationListener.super.sessionWillPassivate(se);
    }

    //在活化之后被调用
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        HttpSessionActivationListener.super.sessionDidActivate(se);
    }

    /*
        活化:从磁盘中读取session对象
        钝化:向磁盘中写入session对象
     */
}

活化:从磁盘中读取session对象

钝化:向磁盘中写入session对象

@WebListener注解加上以后才可以监听域对象

配置监听器

  • 注解

@WebListener
  • XML配置

<listener>
        <listener-class>afternoon.listener.HelloListener</listener-class>
    </listener>

相关文章:

  • Java 并发编程解析 | 如何正确理解Java领域中的锁机制,我们一般需要掌握哪些理论知识?
  • Vue项目流程7,交易页面,提交订单,支付页面,利用element UI 以及 QRCode 完成微信支付,弹出框按钮的相关工作,个人中心以及子路由我的订单
  • 在Java中使用SFTP传输文件
  • OC5860降压芯片,MPS2459脚位一样,节省肖特基规格书
  • 哈工大李治军老师操作系统笔记【4】:系统调用的实现(Learning OS Concepts By Coding Them !)
  • 【光学】基于matlab色散曲线拟合【含Matlab源码 2053期】
  • (多级缓存)多级缓存
  • 复习三:线性表
  • C/C++语言100题练习计划 87——火柴棒等式(枚举实现)
  • 数仓架构演进
  • 约瑟夫问题对应算法的实现(思路分析) [Java][数据结构]
  • 深圳市第十二届职工技术创新运动会暨2022年深圳技能大赛—集成电路应用开发职业技能竞赛
  • 携职教育:对于想进入财务工作的人来说,第一个证考CPA还是CMA?
  • PostgreSQL 创建数据库、创建用户、赋予权限、创建表、主键总结
  • SynchroTrap:基于相似度的异常检测算法
  • 【node学习】协程
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • Fundebug计费标准解释:事件数是如何定义的?
  • input实现文字超出省略号功能
  • JavaScript服务器推送技术之 WebSocket
  • python 装饰器(一)
  • rc-form之最单纯情况
  • SpiderData 2019年2月13日 DApp数据排行榜
  • sublime配置文件
  • tab.js分享及浏览器兼容性问题汇总
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • XML已死 ?
  • 半理解系列--Promise的进化史
  • 从重复到重用
  • 近期前端发展计划
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 三栏布局总结
  • 学习ES6 变量的解构赋值
  • 学习笔记:对象,原型和继承(1)
  • 译自由幺半群
  • 正则与JS中的正则
  • zabbix3.2监控linux磁盘IO
  • 数据可视化之下发图实践
  • ​iOS实时查看App运行日志
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​ubuntu下安装kvm虚拟机
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (4)logging(日志模块)
  • (day6) 319. 灯泡开关
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (八)Flask之app.route装饰器函数的参数
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转载)Linux网络编程入门
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .net 反编译_.net反编译的相关问题
  • .NET 中的轻量级线程安全
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .NET设计模式(11):组合模式(Composite Pattern)