Java教程

JavaWeb学习(九) ---------- 监听器接口与过滤器接口

本文主要是介绍JavaWeb学习(九) ---------- 监听器接口与过滤器接口,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

  • 一、监听器接口
  • 二、过滤器接口


一、监听器接口

1.介绍

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

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

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

2.作用域对象

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

(2) 分类:

我们上篇文章在介绍数据共享时介绍了三种对象

ServletContext : 全局作用域对象
HttpSession :会话作用域对象
HttpServletRequest : 请求作用域对象

3.开发规范

(1) 根据实际监听对象,选择对应监听器接口进行实现

(2) 重写监听器接口声明监听事件处理方法

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

4.ServletContextListener 接口

(1) 作用:

通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻

(2) 监听事件处理方法:

public void contextInitlized() : 在全局作用域对象被Http服务器初始化被调用
public void contextDestory() : 在全局作用域对象被Http服务器销毁时候触发调用

5.ServletContextAttributeListener 接口

(1) 作用:

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

(2) 监听事件处理方法:

public void contextAdd() :  在全局作用域对象中添加共享数据
public void contextReplaced() : 在全局作用域对象更新共享数据
public void contextRemove() : 在全局作用域对象删除共享数据

6.全局数据域对象共享数据变化时刻

ServletContext application = request.getServletContext();
application.setAttribute("key1",100); //新增共享数据application.setAttribute("key1",200); //更新共享数据
pplication.removeAttribute("key1");  //删除共享数据

7.使用方法

1.新建 listener 包,在此包下选择新建Web listener

在这里插入图片描述
2.我们发现MyListener这个类继承了ServletContextListener,HttpSessionListener, HttpSessionAttributeListener 三个接听器接口,且其中方法框架已经重写好了,我们可以向方法中填写代码以达到在作用域对象发生变化时刻完成一些操作的目的。
在这里插入图片描述

package listener;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

@WebListener
public class MyListener implements ServletContextListener, HttpSessionListener, HttpSessionAttributeListener {

    public MyListener() {
    }

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        /* This method is called when the servlet context is initialized(when the Web application is deployed). */

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        /* This method is called when the servlet Context is undeployed or Application Server shuts down. */

    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        /* Session is created. */
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        /* Session is destroyed. */
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent sbe) {
        /* This method is called when an attribute is added to a session. */
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent sbe) {
        /* This method is called when an attribute is removed from a session. */
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent sbe) {
        /* This method is called when an attribute is replaced in a session. */
    }
}
<listener>
      <listener-class>listener.MyListener</listener-class>
</listener>

如果我们手动去继承监听器接口,需要将上述代码粘贴到web.xml中
上面直接创建监听器接口实现类,自带注解 @WebListener , 则不需要进行监听器注册

二、过滤器接口

1.介绍

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

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

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

2.作用

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

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

3.开发步骤

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

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

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

4.Filter拦截地址

(1) 地址格式

<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>拦截地址</url-pattern>
</filter-mapping>

(2) 命令作用

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

(3) 要求 Tomcat 在调用网站中任意文件时,调用 MyFilter 来拦截

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

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

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

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

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

5.代码实例

我们现在要完成一个登录检测程序,提交的数据有用户名和年龄,要求年龄小于18岁的用户在尝试登录网页时显示出未成年人禁止入内。

1.我们先建立Filter类,并重写其doFilter方法,以完成数据过滤
在这里插入图片描述
新建Filter类中,需要重写的方法框架已经给你写好,往里面填代码就行了
在这里插入图片描述

有了这个注解就不用在web.xml中引入类的路径,但filter-mapping中的内容还是要写的
在这里插入图片描述
MyFilter 代码

package filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.*;

import java.io.IOException;
import java.io.PrintWriter;

@WebFilter(filterName = "MyFilter")
public class MyFilter implements Filter {
    public void init(FilterConfig config) throws ServletException {
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        String age = request.getParameter("age");
        if (Integer.valueOf(age) > 18) {
            chain.doFilter(request, response);
        } else {
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out = response.getWriter();
            out.print("<center><font style='color:red;font-size:40px'>未成年人禁止入内!</font></center>");
        }
    }
}

2.创建网页用于提交数据

check.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
      <center>
        <form action="/myWeb/MyServlet" method="get">
             用户名: <input type="text" name="username">
             年龄: <input type="text" name="age">
             <input type="submit" value="submit">
        </form>

      </center>
</body>
</html>

在这里插入图片描述
3.编写Servlet类,用于接收浏览器的请求数据

package controller;

import jakarta.servlet.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;

import java.io.IOException;

@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("我已收到请求");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

4.在web.xml配置拦截地址,要求在数据提交MyServlet之前进行拦截

<filter-mapping>
     <filter-name>MyFilter</filter-name>
     <url-pattern>/MyServlet</url-pattern>
</filter-mapping>

打开Tomcat,跳转到check.html, 输入如下数据,点击提交。
在这里插入图片描述
在这里插入图片描述

这篇关于JavaWeb学习(九) ---------- 监听器接口与过滤器接口的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!