`
zyq070
  • 浏览: 21812 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Servlet 过滤器对装饰者模式的使用

 
阅读更多

 

     所谓装饰者模式(decorator -pattern)动态的给对象添加职责。装饰者较被装饰者拥有更多的功能,且除本身的功能外还可以调用被装饰者的功能。

比较常见的例子是Java I/O 装饰者:


其中,各类的作用如下:

FileInputStream 作为被装饰者 提供了读取文件的基本操作

BufferedInputStream 作为装饰者,加入了额外两个功能:1 缓冲功能(改进读入大文件的性能)

2 readLine()方法(read one line per time)增强了读入的速率

LineNumberInputStream 也是个装饰者,通过名字我们能看出其增加了计算Line Number function

好了 ,有了对装饰者模式的初步认识了,Let’s go to the theme:

What is the Filter ?

Basely  Filter is a java component which used to :

1 Intercept the request coming from Client and process

2 intercept the response before arriving at Client

容器根据DD中的配置来判断Filterinvoke order 及请求的URL来具体要调用Filter

下面是一段过滤器的配置例子:

<filter>

     <filter-name>FilterRequest</filter-name>

     <filter-class>com.example.web.FilterRequest</filter-class>

     <init-param>

            <param-name>name<param-name/>

           <param-value>Bruce</param-value>

     </init-param>

</filter>

<filter-mapping>

<filter-name> FilterRequest </filter-name>

<url-pattern>/filter/*.do</url-pattern>

</filter-mapping>

过滤器还可以针对具体的servlet (假设已有FilterServletservlet)

<filter-mapping>

<filter-name> FilterRequest </filter-name>

<servlet-name>FilterServlet</servlet-name>

</filter-mapping>

过滤器类要实现位于javax.servlet 内的Filter类,像servlet一样过滤器也有生命周期:

  init() : 初始化

   doFilter() : 处理过滤操作

  destroy() : 删除Filter实例

看下doFilter(ServletRequest req, ServletResponse resp, FilterChain)方法

具体代码不说了,方法内利用FilterChain.doFilter(req,resp) 来完成过滤器的内联和回调。

ServletRequest 请求处理可以在该方法调用之前进行处理,那ServletResponse的处理呢?是否是在该方法调用后处理呢?

其实在在FilterChain.doFilter(req,resp)回调后 ServletResponse 已经返回客户端,再次处理已经没有意义。

此处的处理用到了装饰者类:

FilterChain.doFilter(req,resp)方法执行之前 ServletResponse 类进行包装:

CompressionResponseWrapper  wrapperResp = new  CompressionResponseWrapper(response);

CompressionResponseWrapper 是一个包装类 ,封装了对于response的操作

只有调用FilterChain.doFilter(req, wrapperResp)

可以参照下图:

 


  • 大小: 23.5 KB
  • 大小: 27.7 KB
分享到:
评论

相关推荐

    用装饰模式装饰HttpServletRequest对象

    通过这种方式,装饰模式使得在不修改HttpServletRequest本身的情况下,我们可以扩展其功能,解决了在Servlet过滤器中无法直接修改请求参数的问题。 总之,装饰模式在Servlet编程中提供了一种灵活的、非侵入式的扩展...

    javaweb过滤器

    ### JavaWeb过滤器详解 #### 过滤器概述 在JavaWeb开发中,过滤器扮演着极其重要的角色,它能够实现在请求到达目标资源(如...同时,结合装饰模式的应用也能让过滤器的功能更加灵活多变,满足不同场景下的需求。

    java过滤器中文乱码POST和GET

    主要解决表单提交中文乱码问题,主要针对页面GET提交的处理编码问题,设计知识 过滤器,servlet,装饰设计模式等

    filter_filter_源码.zip

    这种模式遵循“装饰者”设计原则,使得我们可以动态地添加或移除过滤器,而不会影响到其他过滤器或者整体流程。 在Java Web开发中,Servlet规范定义了`javax.servlet.Filter`接口,它是实现过滤器的关键。这个接口...

    Java 企业设计模式

    在Java EE的过滤器链中,每个过滤器都可以处理请求或将其传递给下一个过滤器。 10. **状态模式**:状态模式允许对象在其内部状态改变时改变其行为。在处理业务流程中的不同状态(如订单状态、用户状态)时,状态...

    JAVA与模式J2EE模式Eclipse开发java企业设计模式.

    在J2EE的Servlet过滤器中,装饰器模式被广泛使用,用于在请求处理前后添加额外的功能。 7. **适配器模式**:它将不兼容的接口转换为可以使用的接口。在Java EE中,例如,适配器可以用来封装不同数据源,使它们能被...

    java 的研磨设计模式(模式)

    在Java的Servlet过滤器中可以看到责任链模式的运用。 12. 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的操作。Java Swing中的ActionListener接口就是一个命令模式的例子。 13....

    JAVA web模式设计之道.zip

    5. **装饰器模式**:Web应用中的权限控制和日志记录常常使用装饰器模式,它可以动态地给对象添加新的行为或责任,而不会破坏封装性。 6. **适配器模式**:在集成第三方库或服务时,适配器模式可以帮助将不兼容的...

    java实现装饰器模式(Decorator Pattern)

    Java 实现装饰器模式(Decorator Pattern) 装饰器模式是结构型设计模式之一,它允许向一个现有的对象添加新的功能,同时又...它广泛应用于软件开发中,例如在 Java 中的输入/输出流、Java Servlet API 中的过滤器等。

    java设计模式

    在Java中,可以使用装饰器模式或者组合模式实现过滤器。比如在Web开发中,Servlet Filter就是一种典型的过滤器模式应用,它在请求到达目标Servlet之前对其进行处理,如身份验证、日志记录等。 2. **观察者模式...

    23种设计模式的Java实现

    Java中的Servlet过滤器机制就是职责链模式的应用。 13. **命令模式**:将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的操作。Java的Swing和AWT事件模型采用了命令模式。 14. **解释器模式*...

    Java与模式.rar

    Java事件处理模型和Servlet过滤器就是责任链模式的应用。 10. **组合模式**:允许你将对象组织成树形结构来表现“部分-整体”的层次结构。在Java中,`java.awt.Container`和`java.awt.Component`类层次就体现了组合...

    123种JAVA设计模式和15种J2EE设计模式.pdf

    这种模式在Java的Web应用中非常常见,例如在Servlet过滤器(Filter)和Spring拦截器(Interceptor)中都可以看到该模式的应用。 文档还提到了在处理请求和响应过程中,需要对不同类型的请求执行不同的处理逻辑。这...

    j2ee的设计模式(最新版)

    5. **装饰器模式**:用于在不改变原有对象的基础上,动态地给对象添加新的功能,如在Servlet过滤器中,通过装饰器可以增加日志、安全检查等功能。 6. **适配器模式**:当需要将不同的接口或API集成在一起时,适配器...

    j2ee设计模式java程序

    在Java EE的过滤器或拦截器中,可以使用策略模式来选择不同的处理逻辑。 4. **装饰器模式**:Java EE的Servlet API广泛使用了装饰器模式,允许在不改变原有类的基础上动态添加功能。例如,HttpServlet、Filter和...

    Java与模式

    Java Servlet中的过滤器链(`FilterChain`)就是这一模式的典型应用。 这些设计模式是Java开发中不可或缺的知识点,掌握它们不仅有助于写出高质量的代码,还能提高团队之间的沟通效率,因为大家都遵循了共同的设计...

    JAVA设计模式.影印版

    Java Servlet的过滤器链就是责任链模式的一个例子。 13. **命令模式**:将请求封装为一个对象,以便使用不同的请求、队列请求、记录请求或支持撤销操作。Java Swing中的`ActionListener`接口就是一个命令模式的应用...

    jAVA的设计模式 java学习资料

    在J2EE中,如Servlet过滤器,它可以在不影响其他对象的情况下,为HTTP请求添加额外的功能。 7. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。在J2EE中,远程代理用于处理EJB的远程调用,而虚拟...

    JAVA设计模式

    Java Servlet的过滤器链就是一个很好的例子。 16. 迭代器模式(Iterator):迭代器模式提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。Java集合框架中的`Iterator`接口和各种集合类实现了迭代器模式。...

    buildType设计模式课程设计

    在Java Web中,比如Servlet过滤器,它允许我们向已存在的对象添加新的行为或责任,而无需修改原有代码。 8. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能...

Global site tag (gtag.js) - Google Analytics