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 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)

当发现不符合Filter 条件的时候可以直接调用别的 jsp 文件

          • 多个Filter 拦截的顺序和<filter-mapping> 配置的顺序有关,靠前的先被调用。
      • public void destroy(): 释放当前Filter 所占用的资源的方法。在Filter 被销毁之前调用,且只调用一次。

 


 

 

 

posted on 2016-04-10 11:57  我表情悠哉  阅读(145)  评论(0编辑  收藏  举报

导航