详细了解java监听器和过滤器


Posted in Java/Android onJuly 09, 2021

1、介绍:

1)一组来自于Servlet规范下的接口,共有8个接口。在Tomcat中存在于Servlet-api.jar

2)监听器接口需要由开发人员亲自实现,Http服务器提供的jar中并没有对应的实现类

3)监听器接口用于监控【作用域对象生命周期的变化时刻】以及【作用域对象共享数据的变化时刻】

2、作用域对象:

1)在Servlet规范中,认为在服务端内存中可以在某些条件下为两个Servlet之间提供数据共享方案的对象,被称为【作用域对象】

2)在Servlet规范下的作用域对象:

ServletContext:全局作用域对象

HttpSession:会话作用域对象

HttpServletRequest:请求作用域对象

3、监听器接口实现类开发规范:三步

1)根据监听的实际情况,选择对应的监听器接口进行实现

2)重写监听器接口中声明的【监听事件处理方法】

3)在web.xml文件中将监听器接口实现类注册到Http服务器中

4、ServletContextListener

1)作用:通过这个接口合法的检测全局作用域对象的两个时刻

被初始化时刻 被销毁时刻

2)监听事件处理方法

public void contextInitialized():在全局作用域对象被Http服务器初始化是调用

public void contextDestroyed():在全局作用域对象被Http服务器销毁时调用

5、ServletContextAttributeListener接口:

1)作用:通过这个接口合法的检测全局作用域对象共享数据变化的时刻

2)监听事件处理方法:

public void contextAdded():在全局作用域对象添加共享数据时调用

public void contextReplaced():在全局作用域对象更新共享数据时调用

public void contextRemoved():在全局作用域对象删除共享数据时调用

6、全局作用域对象共享数据变化时刻

ServletContext application=request.getServletContext();

application.setAttribute("key1",100); //新增共享数据

application.setAttribute("key1",200); //更新共享数据

application.removeAttribute("key1"); //删除共享数据

代码实现

以下就以ServletContextListener接口和ServletContextAttributeListener接口

第一步:选择ServletContextListener接口进行实现

第二步:重写监听器接口声明的【监听事件处理方法】

public class OneListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Initialized............");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Destroyed.............");
    }
}

第三步:在web.xml中将监听器接口实现类注册到Http服务器中

<listener>
    <listener-class>school.xauat.listener.OneListener</listener-class>
</listener>

由于ServletContext【全局作用对象的生命周期】贯穿网站的整个运行期间

Servlet之间数据共享中有具体的ServletContext生命周期

因此在Tomcat服务器启动过程时,执行contextInitialize()方法

Initialized............

在Tomcat服务器准备关闭时,执行contextDestroyed()方法

Destroyed.............

第一步:选择ServletContextAttributeListener接口进行实现

第二步:重写监听器接口声明的【监听事件处理方法】

public class OneListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        System.out.println("ServletContextAttribute is added......");
    }
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae){
        System.out.println("ServletContextAttribute is removed......");
    }
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae){
        System.out.println("ServletContextAttribute is replaced......");
    }
}

第三步:在web.xml文件中将监听器接口实现类注册到Tomcat服务器中

<servlet>
    <servlet-name>OneServlet</servlet-name>
    <servlet-class>school.xauat.controller.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>OneServlet</servlet-name>
    <url-pattern>/one</url-pattern>
</servlet-mapping>
<listener>
    <listener-class>school.xauat.listener.OneListener</listener-class>
</listener>

监听事件

public class OneServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过请求对象获取全局作用域对象
        ServletContext application=request.getServletContext();
        //向全局作用域对象中添加共享数据
        application.setAttribute("key",100);
        //更改全局作用域对象中的共享数据
        application.setAttribute("key",500);
        //删除全局作用域对象中的共享数据
        application.removeAttribute("key");
    }
}

运行结果

详细了解java监听器和过滤器

Servt规范扩展-----------过滤器接口

1、介绍:

1)来自于Servlet规范下的接口,在Tomcat中存在于servlet-api.jar包中

2)Filter接口实现类由开发人员负责提供的,Http服务器不负责提供

3)Filter接口会在Http服务器调用资源文件之前,对Http服务器进行拦截

2、具体作用:

1)拦截Http服务器,帮助Http服务器去检测当前请求的合法性

2)拦截Http服务器,对当前请求进行增强操作

3、Filter接口实现类的开发步骤:三步

1)创建一个java类实现Filter接口

2)重写Filter接口中的doFilter方法

3)在web.xml文件中将过滤器接口实现类注册到Http服务器

过滤器检测请求合法性

第一步:创建一个java类实现Filter接口

第二步:重写doFilter接口中的doFilter()方法

/**
 * http://localhost:8080/myWeb/mm.jpg?age=89
 */
public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //通过拦截的请求对象来得到请求包中的参数信息,从而得到来访用户的真实年龄
        String age=servletRequest.getParameter("age");
        //根据这个年龄帮助我们的Http服务器判断本次请求的合法性
        if(Integer.valueOf(age)<70){
            //将拦截请求对象和相应对象交换给Tomcat,由Tomcat继续调用资源文件
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //过滤器代替Http服务器拒绝本次请求
            servletResponse.setContentType("text/html;charset=utf-8");
            PrintWriter out=servletResponse.getWriter();
            out.print("<center><font style='color:red;font-size:40px'>不合适!!!!</font></center>");
        }
    }
}

第三步:在web.xml文件中将过滤器接口实现类注册到Http服务器

<!--将过滤器类文件交给Tomcat-->
<filter>
    <filter-name>OneFilter</filter-name>
    <filter-class>school.xauat.filter.OneFilter</filter-class>
</filter>
<!--通知Tomcat在调用何种资源文件是需要被当前过滤器拦截-->
<filter-mapping>
    <filter-name>OneFilter</filter-name>
    <url-pattern>/mm.jpg</url-pattern>
</filter-mapping>

过滤器对请求对象进行增强服务

当有多个以post的请求访问服务器时,需要对每个Servlet接口实现类中doPost()方法进行以下操作,增加的开发的难度。

response. setCharacterEncoding("utf-8")

以下展示过滤器的作用:

第一步:创建java实现Filter接口

第二步:重写Filter接口下的doFilter()方法

public class OneFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

第三步:在web.xml文件中将过滤器接口实现类注册到Http服务器

<servlet>
        <servlet-name>OneServlet</servlet-name>
        <servlet-class>school.xauat.controller.OneServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>OneServlet</servlet-name>
        <url-pattern>/one</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>TwoServlet</servlet-name>
        <servlet-class>school.xauat.controller.TwoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TwoServlet</servlet-name>
        <url-pattern>/two</url-pattern>
    </servlet-mapping>
    <!--注册Filter类-->
    <filter>
        <filter-name>OneFilter</filter-name>
        <filter-class>school.xauat.filter.OneFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>OneFilter</filter-name>
        <!--通知Tomcat在调用所有资源文件之前都需要调用OneFilter进行拦截-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

OneServlet

public class OneServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过请求对象获取请求体中的请求参数
        String userName=request.getParameter("userName");
        System.out.println("OneServlet----->"+userName);
    }
}

TwoServlet

public class TwoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //通过请求对象获取请求体中的请求参数
        String userName=request.getParameter("userName");
        System.out.println("TwoServlet---->"+userName);
    }
}

4、Filter拦截地址的格式

1)命令格式:

<filter-mapping>

<filter-name><OneFilter/filter-name>

<url-pattern>拦截地址</url-pattern>

</filter-mapping>

2)命令作用:

拦截地址通知Tomcat在调用和何种资源文件之前需要调用OneFilter过滤进行拦截

3)要求Tomcat在调用某一个具体文件之前,来调用OneFilter进行拦截

<url-pattern>/目录/文件名</url-pattern>

4)要求Tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter进行拦截

<url-pattern>/目录/*</url-pattern>

5)要求Tomcat在调用任意文件夹下的某种类型文件之前,来调用OneFilter拦截

<url-pattern>*.jpg</url-pattern>

6)要求Tomcat在调用网站中任意文件时,来调用OneFilter拦截

<url-pattern>/*</url-pattern>

总结

本篇文章就到这里了,希望能给你带来帮助,也希望你能够多多关注三水点靠木的更多内容!

Java/Android 相关文章推荐
SpringCloud的JPA连接PostgreSql的教程
Jun 26 Java/Android
Java 数组内置函数toArray详解
Jun 28 Java/Android
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
Jul 01 Java/Android
springboot 启动如何排除某些bean的注入
Aug 02 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
Sep 25 Java/Android
MyBatis自定义SQL拦截器示例详解
Oct 24 Java/Android
关于Mybatis中SQL节点的深入解析
Mar 19 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
解决springboot druid数据库连接失败后一直重连的方法
Apr 19 Java/Android
Flutter Navigator 实现路由传递参数
Apr 22 Java/Android
Java使用jmeter进行压力测试
java解析XML详解
使用@Value值注入及配置文件组件扫描
Jul 09 #Java/Android
详细了解MVC+proxy
Jul 09 #Java/Android
Spring实现内置监听器
Jul 09 #Java/Android
新手初学Java网络编程
Jul 07 #Java/Android
Java 语言中Object 类和System 类详解
Jul 07 #Java/Android
You might like
与数据库连接
2006/10/09 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
Symfony查询方法实例小结
2017/06/28 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
PHP使用HTML5 FormData对象提交表单操作示例
2019/07/02 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
为jquery.ui.dialog 增加“自动记住关闭时的位置”的功能
2009/11/24 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
JavaScript-定时器0~9抽奖系统详解(代码)
2017/08/16 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去
2019/07/23 Javascript
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
学习Python selenium自动化网页抓取器
2018/01/20 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
使用Django清空数据库并重新生成
2020/04/03 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
2020/04/15 Python
用pandas划分数据集实现训练集和测试集
2020/07/20 Python
Python如何执行系统命令
2020/09/23 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
Geekbuying波兰:购买中国电子产品
2019/10/20 全球购物
大学生创业计划书的范文
2014/01/07 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python