Filter(过滤器) 学习①
MVC 设计模式概览
实现MVC(Model, View, Controller)模式的应用程序由以下几部分构成:
- 模型: 封装应用程序的数据和业务逻辑 POJO(Plain Old Java Object)
- 视图: 实现应用程序的信息显示功能 JSP
- 控制器:接受来自用户的输入,调用模型层,响应对应的视图组件:Servlet, Filter
- 使用Filter 作为控制器的好处,使用一个过滤器来作为控制器,可以方便的在用用程序里对所有的资源(包括静态资源进行控制访问 )
- Servlet VS Filter
- Servlet 能做的Filter 是否都可以完成? Yes
- Filter 能做的Servlet 都可以完成吗?拦截资源却不是Servlet 所擅长的,Filter中有一个FilterChain, 这个API 在Servlet 中却没有。
Filter 简介:
- Filter 的基本功能是对 Servlet 容器调用Servlet 的过程进行拦截,从而在Servlet 进行响应处理的前后实现一些特殊的功能。
- 在Servlet API 中定义了三个接口来供开发人员编写Filter 程序: Filter, FilterChain, FilterConfig
- Filter 程序是一个实现了Filter 接口的Java 类, 与Servlet 程序相似, 它由Servlet 容器进行调用和执行
- Filter 程序需要在web.xml 文件中进行注册和设置它所能拦截的资源: Filter程序可以拦截JSP, Servlet, 静态图片文件和HTML文件
- 使用Filter 作为控制器的好处: 使用一个过滤器来作为控制器,可以方便的在应用程序中对所有资源(包括静态资源)进行控制访问。
① Filter 是什么?
-
- Java WEB的重要组件,可以对发送到Servlet 的请求进行拦截,并对响应也进行拦截。
-
- Filter 是实现了Filter 接口的JAVA类
- Filter 需要在WEB.XML 文件中进行配置和映射
② 如何创建一个Filter, 并把他跑起来
-
- 创建一个Filter 类: 实现Filter 接口
- 在web.xml 文件中配置并映射该Filter, 其中url-pattern 指定该Filter 可以拦截那些资源,即可以通过哪些url 访问到该Filter 资源
代码如下:
package hellofilter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class HelloFilter implements Filter{ @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..."); } @Override public void destroy() { System.out.println("destroy..."); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 注册Filter --> <filter> <filter-name>helloFilter</filter-name> <filter-class>hellofilter.HelloFilter</filter-class> </filter> <!-- 映射Filter --> <filter-mapping> <filter-name>helloFilter</filter-name> <url-pattern>/test.jsp</url-pattern> </filter-mapping> </web-app>
③ Filter 相关的API:
-
- Filter 接口:
-
-
- public void init(FilterConfig filterConfig) throws ServletException 类似于Servlet 的init 方法, 在创建Filter 对象后,立即被调用,且只被调用一次。 Filter 对象在Servlet 容器加载当前WEB 应用时即被创建。该方法用于对当前的Filter 进行初始化操作, Filter 实例是单例的。
- FilterConfig 类似于Servlet 的Config
- 可以在web.xml 文件中配置当前Filter 的初始化参数, 配置方式和Servlet 类似。
- public void init(FilterConfig filterConfig) throws ServletException 类似于Servlet 的init 方法, 在创建Filter 对象后,立即被调用,且只被调用一次。 Filter 对象在Servlet 容器加载当前WEB 应用时即被创建。该方法用于对当前的Filter 进行初始化操作, Filter 实例是单例的。
-
-
-
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 真正Filter 的逻辑代码要编写在该方法中,每次拦截都会调用该方法
-
-
-
-
- FilterChain: Filter链, 多个Filter 可以构成一个Filter 链。
- doFilter(ServletRequest request, ServletResponse response, FilterChain chain): 把请求传给Filter 链的下一个Filter, 若当前Filter 是 Filter 链的最后一个Filter, 将把请求给到目标Servlet (或JSP)
- FilterChain: Filter链, 多个Filter 可以构成一个Filter 链。
-
-
当发现不符合Filter 条件的时候可以直接调用别的 jsp 文件
-
-
-
-
- 多个Filter 拦截的顺序和<filter-mapping> 配置的顺序有关,靠前的先被调用。
-
-
-
-
-
- public void destroy(): 释放当前Filter 所占用的资源的方法。在Filter 被销毁之前调用,且只调用一次。
-