Filter体现职责链模式

Filter体现职责链模式

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

 1. 前言

       Filter—Filter 技术是servlet2.3 新添加�的功能。完毕的流程:对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对server响应进行后处理。

       Filter体现了一种职责琏模式。那么他是怎样体现的呢?

2. 职责链模式

      在详细的解释这个之前先看看职责链模式的定义:使多个对象都有机会处理请求 ,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一个链,并沿着这条链传递请求,直到有一个对象处理它为止。

       对于Filter而言就是,请求传给详细的web资源(比方jsp/servlet)之前要经过Filter的预处理,在web资源处理完毕返回给client之前也要被Filter处理一遍。就好比以下的这样的图

  Filter体现职责链模式

       当创建了多个Filter之后,client传来一个Request请求,它就面对着这一个Filter链,职责琏模式就体如今这里。这个请求会在这个Filter链上一个一个被传递下去对它进行预处理,处理完毕之后就传给下一个Filter直到最后一个,然后才交给web进行对应的訪问和处理。它的uml图(并非完毕的结构图,仅仅是体现职责琏模式的结构图)例如以下:

     Filter体现职责链模式

       一个Filter接口定义了三个方法:init()(初始化方法);destroy()(销毁方法);doFilter()(核心的职责方法);两个详细类实现了Filter接口:ConcreteFilter1和ConcreteFilter2;

      一个FilterChain接口定义了一个方法:doFilter();一个详细的实现类ConcreteFilterChain;

     
当中FilterChain基本的作用是完毕找到下一个Filter。

3. 详细的实现

     以下是对于上面结构图的一个简单实现,帮助我们理解一下Filter体现的职责琏模式。

   ConcreteFilter1类

package com.test.filter;

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;

/**
 * ConcreteFilter1类
 * @author pf
 *
 */
public class ConcreteFilter1 implements Filter {
	
//	private String encoding;
	
	@Override
	public void destroy() {
		System.out.println("ConcreteFilter1()的destroy()运行");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("----ConcreteFilter1()的chain.doFilter()调用之前:对用户请求(request)进行预处理");
		//继续运行
		//后面有filter继续调用,没有的话就进入到了jsp,一直调用最后
		chain.doFilter(request, response);
		System.out.println("ConcreteFilter1()的chain.doFilter()调用之后:对server响应(response)进行后处理");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
//		System.out.println("init開始");
//		this.encoding = filterConfig.getInitParameter("encoding");
//		System.out.println("init得到encoding:" + encoding);
		System.out.println("ConcreteFilter1()的init()方法调用");
		
	}

}

ConcreteFilter2类

package com.test.filter;

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;

/**
 * 採用Filter统一处理字符集
 * @author pf
 *
 */
public class ConcreteFilter2 implements Filter {
	
//	private String encoding;
	@Override
	public void destroy() {
		System.out.println("ConcreteFilter2()的destroy()运行");
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		System.out.println("ConcreteFilter2()的chain.doFilter()调用之前");
//		request.setCharacterEncoding(encoding);
		//后面有filter继续调用,没有的话就进入到了jsp,一直调用最后
		chain.doFilter(request, response);
		System.out.println("ConcreteFilter2()的chain.doFilter()调用完毕");
	}

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
//		System.out.println("init開始");
//		this.encoding = filterConfig.getInitParameter("encoding");
//		System.out.println("init得到encoding:" + encoding);
		System.out.println("ConcreteFilter2()的init()方法调用");
	}

}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
	
	<filter>
		<filter-name>ConcreteFilter1</filter-name>
		<filter-class>com.test.filter.ConcreteFilter1</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ConcreteFilter1</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
		<filter>
		<filter-name>ConcreteFilter2</filter-name>
		<filter-class>com.test.filter.ConcreteFilter2</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>ConcreteFilter2</filter-name>
		<url-pattern>*.jsp</url-pattern>
	</filter-mapping>
	
</web-app>


完毕之后启动server,我这里是tomcat,会显演示样例如以下信息:

Filter体现职责链模式

说明在启动server的时候就会创建我们的Filter对象

随便訪问一个页面再次查看console

Filter体现职责链模式

       关闭server:说明在关闭server的时候销毁创建的Filter对象

     Filter体现职责链模式

       从上面的运行结果再来看一下Filter。我们设置了两个Filter,各自是ConcreteFilter1和ConcreteFilter2.依照我们在web.xml中配置的顺序来运行,先运行了ConcreteFilter1,在运行ConcreteFilter2.

      可是注意观察,他们在真正调用chain的doFilter方法之后的调用顺序正好相反了。所以我们从这个结果能够看到Filter的运行顺序是遵循”后进先出”的原则。现将传来的url依照配置中的顺序进行预处理,可是确实先依照相反的filter顺序运行处理好的请求。

以下是讲他的调用过程画了一个时序图:

Filter体现职责链模式

3. 总结:

       通过上面代码运行的结果来看,Filter非常好的实现了职责链模式,对于不论什么一个请求来讲都有一条Filter链能够处理它,详细是哪一个处理了我们事实上并不知道可是在到达servlet之前就是已经给我们处理好了,这样子就非常好的做到了对象之间的解耦和。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118399.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 8天学通MongoDB——第七天 运维技术

    8天学通MongoDB——第七天 运维技术

    2021年9月14日
  • 如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相…

    如何知道一个网站的后台地址_看我如何攻破LOL钓鱼网站后台查清背后的大量账号被盗号的真相…说英雄联盟准备出手游,但内测资格一直没公开,有骗子利用这个机会,伪造官方给用户发送带有钓鱼链接的邮件来盗号。.方子就是其中一个受害者,除了他,我也去了英雄联盟的贴吧看了下,确实有很多人收到了这类邮件。由于反馈这事的人比较多,加上我平常也玩LOL,所以整理了下线索,开整。目前一共有两条线索。1.钓鱼邮件:j6****j9@***zol.com2.钓鱼网站:www.iku****.cn首先是发送钓鱼网…

    2022年7月26日
  • pycharm安装配置教程_python安装pycharm的方法

    pycharm安装配置教程_python安装pycharm的方法TOC关于pycharm的下载安装以及环境的配置过程(python语言编辑器)下面是pycharm的链接:https://pan.baidu.com/s/1SFHWnGsRsC1XxCG8pQfrlw提取码:zj4h复制这段内容后打开百度网盘手机App,操作更方便哦!或者百度搜索后直接下载:一:安装过程:1、进入安装界面,直接点next进入下一个界面。2、记好此时的安装位置,点n…

    2022年8月29日
  • 2019最新版Eclipse下载与安装

    2019最新版Eclipse下载与安装首先:eclispe提供了两种下载方式。一种是下载安装程序,下载后直接运行安装程序,根据安装程序的提示选择安装选项并完成安装;一种是下载eclispe压缩包,下载后手动解压即可。下面分别介绍两种安装方式。一、首先进入Eclipse下载页面1.下载地址:https://www.eclipse.org/downloads/二、安装程序的方式如果是64位的Windows操作系统,可以直接单击图…

    2022年5月29日
  • 【Latex】Latex插入图片「建议收藏」

    【Latex】Latex插入图片「建议收藏」\begin{figure}[h]%H为当前位置,!htb为忽略美学标准,htbp为浮动图形\centering%图片居中\includegraphics[width=0.5\textwidth]{figure1.png}%插入图片,[]中设置图片大小,{}中是图片文件名\caption{AistheVOCdataset,BistheVisDronedataset,CistheCOCOdataset,andDistheOUC-UAV-Detdataset}

    2022年5月25日
  • deepfakes怎么用_黑科技▍如何使用 Deepfakes 给主播换脸?教程来了

    deepfakes怎么用_黑科技▍如何使用 Deepfakes 给主播换脸?教程来了下面放教程:1.获取deepfakes工具包gitclonehttps://github.com/deepfakes/faceswap.git2.补齐依赖包:pipinstalltqdmpipinstallcv2pipinstallopencv-contrib-pythonpipinstalldlibpipinstallkeraspipinstalltensorfl…

    2022年5月26日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号