JDK设计模式之——责任链(Filter)
责任链的设计模式可以参考Servlet的FilterChain。FilterChain中的每个Filter(过滤器)就像一个个的链条
web开发中 有时候需要对接口request和response进行过滤操作(特殊字符过滤,权限过滤等)
- 接口Filter
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
过滤器Filter中doFliter方法完成实际的过滤操作,通过参数FilterChain把多个过滤器串联起来。
doFilter(ServletRequest request, ServletResponse response)
Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked.
执行fliterChain的doFilter方法,会执行下一个filter的doFilter方法同时FliterChain会当做参数传给下一个Filter。(Filter的执行循序 和在web.xml配置的顺序一致)
责任链设计模式的特点是
|
过滤器Filter1 code11 chain.doFilter() code12 |
过滤器Filter2 code21 chain.doFilter() code22 |
| Servlet的request请求 | Servlet的resopnse响应 |
|
执行code11后通过chain.doFilter()方法, 代码会到Filter2中去 然后执行code21(如果有下一个filter 会接着执行下一个filter) |
执行完所有的过滤器之后 开始response返回 先从最末的一个过滤器开始返回 于是response时候的代码执行顺序是code22 code12 |
上面的执行顺序会是 code11 code21 code22 code12 FilterChain通过参数传递起到串联所有Filter的作用,通过执行chain.doFilter()来进入下一个Filter
chain.doFilter()以上的代码是对resquest进行过滤,以下的代码对返回response过滤
代码证明:
1.首先声明一个Servlet
package javaee.net.cn.websocket; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {;
System.out.println("doGet>>>>>>>>>>>>>>>>>>");
} }
2.声明两个过滤器
package javaee.net.cn.websocket; 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 NoteFilter implements Filter { @Override
public void destroy() {
System.out.println("note destory<<<<<<<<<<<<<<<<"); } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("request note filter");
chain.doFilter(request, response);
System.out.println("response note filter"); } @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("note init<<<<<<<<<<<<<<"); } }
package javaee.net.cn.websocket; 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 HtmlFilter implements Filter { @Override
public void destroy() {
System.out.println("html destory<<<<<<<<<<<<<<<<"); } @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("request html filter");
chain.doFilter(request, response);
System.out.println("response html filter"); } @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("html init<<<<<<<<<<<<<<"); } }
3.在web.xml中配置Servlet和过滤器(在web.xml中 必须先配置所有的过滤器 在配置Servlet)
<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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">
<display-name>Tab3</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<filter>
<filter-name>NoteFilter</filter-name>
<filter-class>javaee.net.cn.websocket.NoteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoteFilter</filter-name>
<url-pattern>/myServlet</url-pattern>
</filter-mapping> <filter>
<filter-name>HtmlFilter</filter-name>
<filter-class>javaee.net.cn.websocket.HtmlFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HtmlFilter</filter-name>
<url-pattern>/myServlet</url-pattern>
</filter-mapping>
<!--上面配置fliter 下面配置Servlet -->
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>javaee.net.cn.websocket.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>
</web-app>
4.浏览器输入web.xml配置的url路径:http://127.0.0.1:8080/myServlet
输出结果是:
request note filter
request html filter
doGet>>>>>>>>>>>>>>>>>>
response html filter
response note filter
和上面分析一致
JDK设计模式之——责任链(Filter)的更多相关文章
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- JAVA设计模式之责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- 【GOF23设计模式】责任链模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...
- Java设计模式之责任链设计模式
职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...
- C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- Head First设计模式之责任链模式
一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...
随机推荐
- android中ScrollView嵌套ListView或GridView显示位置问题
Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...
- 用grunt对css代码进行压缩
1.先安装Node.js环境 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器.Node.js的下载链接 安装完后进行验证 2.安装grunt及插件 通 ...
- python数据结构(二)------元组
元组是不可变序列,因此,元组的操作非常简单,本文就简单介绍一下,并解释下元组存在的意义: 2.2.1 元组的创建 2.2.2 tuple函数 2.2.3 基本元组操作 2.2.4 元组存在的意义 2. ...
- python Strip函数和Split函数的用法总结 (python2.0,但用法与3.0是差不多的)
strip函数原型 声明:s为字符串,rm为要删除的字符序列. 只能删除开头或是结尾的字符或是字符串.不能删除中间的字符或是字符串. s.strip(rm) 删除s字符串中开头.结尾处, ...
- SQL,group by分组后分别计算组内不同值的数量
select name as 姓名,sum( case when cargo='笔' then 1 else 0 end ) as 笔,sum( case when cargo='橡皮' then 1 ...
- Swagger2基本注解使用
@Api:用在请求的类上,表示对类的说明 tags="说明该类的作用,可以在UI界面上看到的注解" value="该参数没什么意义,在UI界面上也看到,所以不需要配置&q ...
- python之支付
一,alipay方式 1,国内的alipay支付:我在网上找了好多的教程,大多数都是属于国内内支付的,所以在这里我就不详细介绍了, 操作:https://www.cnblogs.com/xuanan/ ...
- 使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)
zhuan:https://segmentfault.com/a/1190000002697929 本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称 P2V .采用 ...
- 关于SQL2008R2连接服务器出错问题
在安装SQL2008R2后,在公司里用VS2013测试可以连接,可是回到寝室却出了问题,当打开SSMS连接服务器的时候会提示: “在与SQL Server建立连接时出现与网络相关的或特定于实例的错误. ...
- C语言fprintf, fwrite, fscanf, fread混用问题
int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...