JavaWeb学习(6)(核心三大组件、过滤器(Filter)原理、配置过滤器与error页面)

目录

一、JavaWeb的核心三大组件。

(1)Servlet。

(2)Filter。

(3)Listener。

二、过滤器(Filter)原理。

(1)基本介绍。

(2)图解介绍。

(3)过滤器(Filter)生命周期。

1、查阅javaEE文档。

2、有关生命周期的三个方法。

(4)如何实现过滤器?

1、编写一个类并实现javax.Servlet.Filter接口。

2、重写拦截请求方法doFilter()。

3、给过滤器进行配置,配置拦截的url(路径)。

(5)过滤器的配置方式。

1、第一种方式------XML配置方式。

2、过滤器链原理。

3、第二种方式------注解配置方式。

4、多个过滤器的执行顺序。

使用XML时由标签的先后位置决定!

使用注解时:由类的位置决定!

(6)过滤器的拦截方式与配置错误页面。


一、JavaWeb的核心三大组件。

(1)Servlet。
  • 用于处理客户端的请求。

  • Servlet是JavaWeb应用的基础。它提供了一种方式来接收HTTP请求、执行特定操作(如业务逻辑处理、数据库交互等),并返回响应给客户端。


(2)Filter。
  • 用于拦截请求或响应。
  • Filter可以对进入的请求进行预处理,或者对出去的响应进行后处理。它们可以用于实现如日志记录、请求过滤、数据压缩、响应修改等功能。

(3)Listener。
  • 用于监听应用、会话或请求的生命周期事件。
  • Listener允许开发者在特定的事件发生时执行代码。例如在应用启动或关闭时、会话创建或销毁时、或者请求被发送到服务器时。

二、过滤器(Filter)原理。

(1)基本介绍。
  • 过滤器JavaWeb三大组件之一,它与Servlet很相似!然而过滤器是用来拦截请求的,而不是处理请求的。

  • 在JavaWeb应用中,过滤器(Filter)是一种用于在请求到达Servlet之前或响应返回给客户端之前,对请求和响应进行预处理和后处理的组件。
  • 过滤器的工作原理基于"过滤"的概念。即它们可以检查、修改、甚至拒绝或允许请求和响应。

(2)图解介绍。
  • 当用户请求某个Servlet时,会先执行部署在这个请求上的过滤器(Filter)。
  • 如果Filter"放行",那么会继续执行用户请求的Servlet。
  • 如果Filter"不放行",那么就不会执行用户请求的Servlet。

(3)过滤器(Filter)生命周期。
1、查阅javaEE文档。

2、有关生命周期的三个方法。
  • init(FilterConfig对象)。

  • 在服务器启动时会创建Filter实例,并且每个类型的Filter只创建一个实例,从此不再创建!在创建完Filter实例后,会马上调用init()方法完成初始化工作,这个方法只会被执行一次(完成资源的初始化工作。如:读取配置参数、建立数据库连接等)。


  • doFilter(ServletRequest req,ServletResponse res,FilterChain chain)。

  • 这个方法会在用户每次访问目标资源的url(路径)时执行。如果需要"放行",那么需要调用FilterChain对象的doFilter()方法。如果不调用FilterChain的doFilter()方法,那么目标资源将无法执行。


  • destroy()。

  • 服务器会在创建Filter对象之后,把Filter放到缓存中一直使用,通常不会销毁它。一般会在服务器关闭时销毁Filter对象,在销毁Filter对象之前,服务器会调用Filter对象的destory()方法。


(4)如何实现过滤器?
1、编写一个类并实现javax.Servlet.Filter接口。
  • 注意该接口中有两个默认方法。init()、destory()方法。
  • 注意Filter对象在服务器启动时就会创建。

2、重写拦截请求方法doFilter()。
  • 自编写的AFilter类完成第1步与第2步。
  • 下面就是实现javax.Servlet.Filter接口并重写了三个生命周期方法的类的代码。
java 复制代码
package com.fs.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * @Title: AFilter
 * @Author HeYouLong
 * @Package com.fs.filter
 * @Date 2024/11/29 上午10:12
 * @description: 拦截器A类实现Filter接口
 */
public class AFilter implements Filter {
    /**
     * 生命周期方法,过滤器创建之后马上调用(服务器),只执行一次
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("myfilter 出生...");
    }
    /**
     * 生命周期方法,过滤器销毁之前调用(服务器),只执行一次
     */
    @Override
    public void destroy() {
        System.out.println("myfilter 销毁...");
    }

    /**
     * 生命周期方法,请求的url被过滤器拦截的,每请求一次,doFilter()方法就会执行一次
     * @param servletRequest 父类请求对象
     * @param servletResponse 父类响应对象
     * @param filterChain 过滤器链对象
     * @throws IOException
     * @throws ServletException
     */

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter...");
        //放行当前拦截
        filterChain.doFilter(servletRequest, servletResponse);
    }
}
3、给过滤器进行配置,配置拦截的url(路径)。
  • 如果没有配置拦截的url。那么过滤器将不起作用!
  • 下面将学习如何配置过滤器。

(5)过滤器的配置方式。
1、第一种方式------XML配置方式。
  • 在我们的项目的web目录下的"web.xml"文件进行配置。

  • 与配置Servlet很像。<filter>标签、<filter-mapping>标签。

  • <filter-class>标签直接复制自编写类的全类名。
  • 下面的两种方法都可以。


  • XML文件中的所有内容。
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置Filter-->
    <filter>
        <!--filter-name是起个名字-->
        <filter-name>AFilter</filter-name>
        <filter-class>com.fs.filter.AFilter</filter-class>
    </filter>
    <!--映射-->
    <filter-mapping>
        <filter-name>AFilter</filter-name>
        <!-- 拦截的url 一般与通配符*一起使用 -->
        <!-- 拦截所有请求:/* 包括静态资源 -->
        <!-- 前缀匹配:/abc/* -->
        <!-- 后缀匹配:*.后缀名 -->
        <url-pattern>/*</url-pattern>
        <!--
        拦截指定名称的Servlet:
        <servlet-name>xxxServlet</servlet-name>
        -->
    </filter-mapping>

</web-app>
  • 启动工程,测试是否拦截成功。



  • 放行本次拦截。使用过滤器链对象的doFilter()方法。

2、过滤器链原理。
  • 过滤器链的图解。

3、第二种方式------注解配置方式。
  • 在编写的过滤器类上加注解@WebFilter("需拦截的url")。

4、多个过滤器的执行顺序。
使用XML时由标签<filter-mapper>的先后位置决定!


使用注解时:由类的位置决定!
  • 在JavaWeb中该注解一直没有得到解决。但是在后面的springboot的框架学习时,就有过滤器的一个参数(设置过滤器的执行顺序!)

(6)过滤器的拦截方式与配置错误页面。
  • 配置错误信息:就是当系统服务器出现异常时,拦截器执行并跳转到指定的错误页面(error.jsp)这样既能减轻服务器的压力,也能提高用户的体验!

  • XML(web.xml)配置文件内容。
XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--配置错误页面-->
    <error-page>
        <!--错误状态码-->
        <error-code>500</error-code>
        <!--异常类型-->
        <!--        <exception-type></exception-type>-->
        <!--错误页面路径-->
        <location>/error.jsp</location>
    </error-page>
</web-app>
  • error.jsp页面。
html 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>错误页面</title>
</head>
<body>
<%=response.getStatus()%>
<h1>系统出错了,请联系管理管理员!!</h1>
</body>
</html>
相关推荐
围观岳老师12 分钟前
JAVA根据Word模板生成word文件
java·开发语言·word
cwtlw17 分钟前
CSS学习记录11
前端·css·笔记·学习·其他
HiWorldNice19 分钟前
如何在Centos7中设置tomcat开机自启动
java·centos·tomcat
MavenTalk24 分钟前
Spring Cloud Alibaba:一站式微服务解决方案
java·数据库·spring boot·spring cloud·微服务·netflix
HUWD44 分钟前
Java 实现给pdf文件指定位置盖章功能
java·pdf
cwtlw1 小时前
如何创建maven工程
java·笔记·后端·学习·maven
路在脚下@1 小时前
Spring Boot中使用YAML配置文件
java·spring boot
发光者1 小时前
Maven、mybatis框架
java·数据库·maven·mybatis
梓沂1 小时前
pom.xml中dependencyManagement的作用
xml·java·前端
太空漫步111 小时前
逆序对个数
java·算法·排序算法