1.目前OA项目有哪些缺陷?56
-DeptServlet、EmpServlet、OrderServlet。每一个Servlet都在处理自己的相关业务。在执行这些Servlet之前,需要判断用户是否登录。如果用户登录,可以继续操作。如果没有登录,用户需要登录。判断用户是否登录的代码是固定的,需要在每个Servlet类别中编写。显然,代码没有重复使用。每一个Servlet都要解决中文乱码问题,还有公共代码。目前这些代码都是重复编写的,还没有实现重用。如何解决这个问题?
-Servlet规范中的Filter过滤器可以用来解决这个问题。
我们在上一节课《course26》中写了这个改造
2.什么是Filter,有什么用,执行原则是什么?56-Filter是过滤器。
-Filter可以在Servlet执行目标程序之前添加代码。也可以在目标Servlet执行后添加代码。过滤规则可以在之前和之后添加。
-一般来说,公共代码是在过滤器中编写的。
编写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.servletAServletpackage 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方法); }}
BServletpackage 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方法已经实施”); }}
Filter1package 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.servletFilter2package 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() { }}
-执行顺序是:比较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。
![](/images/780-200-2.jpg)