【java初学】Filter入门

Filter

1. StudentWEBSystem
增删改查

在这里插入图片描述

2. BaseServlet封装
2.1 目前Servlet程序问题
目前情况下,代码中为了完成功能实现了太多的Servlet程序,而且每一个Servlet程序对应的是一个功能。这样会导致代码中的Servlet冗余!!!

期望:
	相同模块的Servlet程序,按照方法封装的形式,处理成不同的方法,在同一个Servlet执行。
	一个Servlet程序可以调用多个方法,从而减少Servlet程序冗余问题。
	student.action ==> 通过参数形式告知当前Servlet程序,执行哪一个方法来完成功能。
	【祝昊狗天天404】
2.2 如何封装
2.2.1 URL问题
URL问题
	http://localhost:8080/Day40/资源名?参数
	参数 ==> method=需要执行的方法名字
	
	通过method参数对应方法名,在当前Servlet中,执行对应方法。所有方法的数据类型都是HttpServletRequest HttpServletResponse

在URL中
	1. 资源名是对应的Servlet程序资源名字 url-pattern
	2. 第一个URL参数 method=目标执行方法
2.2.2 Servlet程序和方法整合

在这里插入图片描述

2.2.3 BaseServlet代码实现
package util;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String methodName = req.getParameter("method");

        try {
            /*
            this关键字表示用于请求的对应Servlet资源对象
            我们可以这么认为继承之后service方法在每一个Servlet程序内容都可以使用
             */
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            method.invoke(this, req, resp);
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
3. 过滤器
3.1 JavaWEB三大组件之一过滤器
Filter
	1. 用于控制资源访问问题
	2. 编码集问题
	3. 敏感词汇过滤【难点 真·难点 动态代理】
3.2 Filter第一个代码
package com.qfedu.filter;

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

@WebFilter("/*")
public class FilterDemo1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Init Method Called...");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("过滤器放行...");
        chain.doFilter(request, response);
        System.out.println("过滤器回来...");
    }

    @Override
    public void destroy() {
        System.out.println("Destroy Method Called...");
    }
}

3.3 过滤和资源不得不说的故事

在这里插入图片描述

3.4 过滤器链
疫情期间我们去商城
	1. 口罩
	2. 健康吗
	3. 体温
	这里就形成了一个过滤器链

	在使用@WebFilter注解方式配置过滤器情况下,会根据当前Filter过滤类名按照字典顺序进行过滤操作。
	AFilter
	BFilter
	CFilter
	CFilter
	BFilter
	AFilter
	
利用过滤器链特征我们可以将一些比较重要的过滤器,前置操作。
例如:
	1. 通过过滤器约束用户的请求编码集和对应响应编码集 
	2. 关键内容的登陆要求,未登录无法操作。
	3. 在完成登陆之后,用户发送消息,对于用户发送的信息进行敏感词汇过滤
<?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_3_1.xsd"
         version="3.1">
    <!--  Filter 声明-->
    <filter>
        <filter-name>BFilter</filter-name>
        <filter-class>com.qfedu.filter.BFilterDemo1</filter-class>
    </filter>
    <filter>
        <filter-name>CFilter</filter-name>
        <filter-class>com.qfedu.filter.CFilterDemo1</filter-class>
    </filter>
    <filter>
        <filter-name>AFilter</filter-name>
        <filter-class>com.qfedu.filter.AFilterDemo1</filter-class>
    </filter>
    <!-- 匹配原则 -->
    <filter-mapping>
        <filter-name>BFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter-mapping>
        <filter-name>CFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>AFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值