当前位置: 首页 > 图灵资讯 > 技术篇> 过滤器的使用及其实现原理

过滤器的使用及其实现原理

来源:图灵教育
时间:2023-06-05 09:31:03

1.目前OA项目有哪些缺陷?56

-DeptServlet、EmpServlet、OrderServlet。每一个Servlet都在处理自己的相关业务。在执行这些Servlet之前,需要判断用户是否登录。如果用户登录,可以继续操作。如果没有登录,用户需要登录。判断用户是否登录的代码是固定的,需要在每个Servlet类别中编写。显然,代码没有重复使用。每一个Servlet都要解决中文乱码问题,还有公共代码。目前这些代码都是重复编写的,还没有实现重用。如何解决这个问题?

-Servlet规范中的Filter过滤器可以用来解决这个问题。

我们在上一节课《course26》中写了这个改造

2.什么是Filter,有什么用,执行原则是什么?56

-Filter是过滤器。

-Filter可以在Servlet执行目标程序之前添加代码。也可以在目标Servlet执行后添加代码。过滤规则可以在之前和之后添加。

-一般来说,公共代码是在过滤器中编写的。

过滤器的使用及其实现原理_ide

3.过滤器怎么写?563.1第一步:

编写Java类实现接口:jarkata.servlet.Filter。并在此接口中实现所有方法。

-init方法:Filter对象第一次创建后调用,只调用一次。

-dofilter方法:只要用户发送一个请求,就执行一次。如果发送N个请求,则执行N个请求。在此方法中编写过滤规则。

-destroy方法:在filter对象被释放/销毁之前调用,并且只调用一次。

3.2第二步:

在web.在xml文件中配置Filter。这种配置与Servlet非常相似。

     <filter>          <filter-name>filter2</filter-name>          <filter-class>com.bjpowernode.javaweb.servlet.Filter2</filter-class>      </filter>      <filter-mapping>          <filter-name>filter2</filter-name>          <url-pattern>*.do</url-pattern>      </filter-mapping>

或使用注释:@WebFilter({"*.do"})

com中的代码.bjpowernode.javaweb.servletAServlet

package com.bjpowernode.javaweb.servlet;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;///介绍Filter过滤器   56@WebServlet("/a.do")public class AServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest requset, HttpServletResponse response)            throws ServletException, IOException {        System.out.println(执行AServlet中的doget方法);    }}

BServlet

package com.bjpowernode.javaweb.servlet;import jakarta.servlet.ServletException;import jakarta.servlet.annotation.WebServlet;import jakarta.servlet.http.HttpServlet;import jakarta.servlet.http.HttpServletRequest;import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;///介绍Filter过滤器   56@WebServlet("/b.do")public class BServlet extends HttpServlet {    @Override    protected void doGet(HttpServletRequest requset, HttpServletResponse response)            throws ServletException, IOException {        System.out.println(BServlet中的doget方法已经实施”);    }}

Filter1

package com.bjpowernode.javaweb.servlet;import jakarta.servlet.*;import jakarta.servlet.annotation.WebFilter;import java.io.IOException;///这是过滤器  56//@WebFilter("/abc")//@WebFilter("/a.do")//@WebFilter({"/a.do","/b.do"}/*属于前缀匹配。从/开始。*///@WebFilter("/dept/* 匹配所有路径。//@WebFilter(“/*”)/*以下路径属于模糊匹配中的扩展匹配。从星号开始,注意不要从/开始。*/@WebFilter("*.do()//这是模糊匹配的写法,意思是以.publicc可以匹配do结尾的路径 class Filter1 implements Filter {    public Filter1(){        System.out.println(执行无参数结构方法);    }    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println(init方法执行。");    }    @Override    public void doFilter(ServletRequest request, ServletResponse            response, FilterChain chain)            throws IOException, ServletException {        // 请求时添加过滤规则。        System.out.println(dofilter方法开始实施。");        //执行下一个过滤器,如果下一个不是过滤器,则执行目标程序Servlett  56        //就是向下走,没有它是不可能的        chain.doFilter(request,response);        // 在响应过程中添加过滤规则。        System.out.println(dofilter方法执行结束);    }    @Override    public void destroy() {        System.out.println(执行destroy方法);    }}

4.注意:56

-默认情况下,Servlet对象在服务器启动时不会新建对象。

-默认情况下,Filter对象将在服务器启动时建立新的对象。

-Servlet是单例的。Filter也是单例的。(单实例。)

4.1目标Servlet是否执行取决于两个条件:56

-第一:是否在过滤器中编写:chain.doFilter(request,response);代码。

-第二:用户发送的请求路径是否与Servlet的请求路径一致。

-chain.doFilter(request,response);本行代码的作用:

-执行下一个过滤器,如果下面没有过滤器,执行最终的Servlet。

-注:Filter的优先级自然高于Servlet。

-/a.do对应Filter,也对应Servlet。所以在执行Servlet之前,必须先执行Filter。

4.2Filter的配置路径:57

-/a.do、/b.do、/dept/save。所有这些配置都是精确匹配的。

-/*匹配所有路径。

-*.do后缀匹配。不要从/开始。

-/dept/*前缀匹配。

4.3在web.在xml文件中配置时,Filter的执行顺序是什么?57

依靠filter-maping标签的配置位置,优先级越高。

按照栈数据结构调用过滤器的顺序。

com中的代码.bjpowernode.javaweb.servletFilter2

package com.bjpowernode.javaweb.servlet;import jakarta.servlet.*;import java.io.IOException;///这是过滤器  57public class Filter2 implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response            , FilterChain chain) throws IOException, ServletException {        System.out.println(Filter2 doFilter begin");        chain.doFilter(request,response);        System.out.println(Filter2 doFilter end");    }    @Override    public void destroy() {    }}

过滤器的使用及其实现原理_ide_02

4.4使用@WebFilter时,Filter的执行顺序是什么?57

-执行顺序是:比较Filter这个类名。

-比如FilterA和FilterB,首先执行FilterA。

-例如,Filter1和Filter2首先执行Filter1.

5.Filter的生命周期?57

与Servlet对象的生命周期一致。

唯一的区别:Filter默认情况下,在服务器启动阶段实例化。Servlet不会。

6.Filter过滤器有一个设计模式:57

-责任链设计模式。

6.1过滤器的最大优点:

-调用顺序不会在程序编译阶段确定。因为Filter的调用顺序是配置到web.在xml文件中,只需修改web.在xml配置文件中,filter-maping的顺序可以调整filter的执行顺序。显然,filter的执行顺序是在程序运行阶段动态组合的。因此,这种设计模式被称为责任链设计模式。

-最大的核心思想是责任链设计模式:

-在程序运行阶段,动态组合程序的调用顺序。

7.用过滤器改造OA项目,用EL和JSTL改造OA项目写57。

上一篇:

mybatis小技巧

下一篇:

使用EL和JSTL改造oa