所谓装饰者模式(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中的配置来判断Filter的invoke
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 (假设已有FilterServlet的servlet)
<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本身的情况下,我们可以扩展其功能,解决了在Servlet过滤器中无法直接修改请求参数的问题。 总之,装饰模式在Servlet编程中提供了一种灵活的、非侵入式的扩展...
### JavaWeb过滤器详解 #### 过滤器概述 在JavaWeb开发中,过滤器扮演着极其重要的角色,它能够实现在请求到达目标资源(如...同时,结合装饰模式的应用也能让过滤器的功能更加灵活多变,满足不同场景下的需求。
主要解决表单提交中文乱码问题,主要针对页面GET提交的处理编码问题,设计知识 过滤器,servlet,装饰设计模式等
这种模式遵循“装饰者”设计原则,使得我们可以动态地添加或移除过滤器,而不会影响到其他过滤器或者整体流程。 在Java Web开发中,Servlet规范定义了`javax.servlet.Filter`接口,它是实现过滤器的关键。这个接口...
在Java EE的过滤器链中,每个过滤器都可以处理请求或将其传递给下一个过滤器。 10. **状态模式**:状态模式允许对象在其内部状态改变时改变其行为。在处理业务流程中的不同状态(如订单状态、用户状态)时,状态...
在J2EE的Servlet过滤器中,装饰器模式被广泛使用,用于在请求处理前后添加额外的功能。 7. **适配器模式**:它将不兼容的接口转换为可以使用的接口。在Java EE中,例如,适配器可以用来封装不同数据源,使它们能被...
在Java的Servlet过滤器中可以看到责任链模式的运用。 12. 命令模式:将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的操作。Java Swing中的ActionListener接口就是一个命令模式的例子。 13....
5. **装饰器模式**:Web应用中的权限控制和日志记录常常使用装饰器模式,它可以动态地给对象添加新的行为或责任,而不会破坏封装性。 6. **适配器模式**:在集成第三方库或服务时,适配器模式可以帮助将不兼容的...
Java 实现装饰器模式(Decorator Pattern) 装饰器模式是结构型设计模式之一,它允许向一个现有的对象添加新的功能,同时又...它广泛应用于软件开发中,例如在 Java 中的输入/输出流、Java Servlet API 中的过滤器等。
在Java中,可以使用装饰器模式或者组合模式实现过滤器。比如在Web开发中,Servlet Filter就是一种典型的过滤器模式应用,它在请求到达目标Servlet之前对其进行处理,如身份验证、日志记录等。 2. **观察者模式...
Java中的Servlet过滤器机制就是职责链模式的应用。 13. **命令模式**:将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持可撤销的操作。Java的Swing和AWT事件模型采用了命令模式。 14. **解释器模式*...
Java事件处理模型和Servlet过滤器就是责任链模式的应用。 10. **组合模式**:允许你将对象组织成树形结构来表现“部分-整体”的层次结构。在Java中,`java.awt.Container`和`java.awt.Component`类层次就体现了组合...
这种模式在Java的Web应用中非常常见,例如在Servlet过滤器(Filter)和Spring拦截器(Interceptor)中都可以看到该模式的应用。 文档还提到了在处理请求和响应过程中,需要对不同类型的请求执行不同的处理逻辑。这...
5. **装饰器模式**:用于在不改变原有对象的基础上,动态地给对象添加新的功能,如在Servlet过滤器中,通过装饰器可以增加日志、安全检查等功能。 6. **适配器模式**:当需要将不同的接口或API集成在一起时,适配器...
在Java EE的过滤器或拦截器中,可以使用策略模式来选择不同的处理逻辑。 4. **装饰器模式**:Java EE的Servlet API广泛使用了装饰器模式,允许在不改变原有类的基础上动态添加功能。例如,HttpServlet、Filter和...
Java Servlet中的过滤器链(`FilterChain`)就是这一模式的典型应用。 这些设计模式是Java开发中不可或缺的知识点,掌握它们不仅有助于写出高质量的代码,还能提高团队之间的沟通效率,因为大家都遵循了共同的设计...
Java Servlet的过滤器链就是责任链模式的一个例子。 13. **命令模式**:将请求封装为一个对象,以便使用不同的请求、队列请求、记录请求或支持撤销操作。Java Swing中的`ActionListener`接口就是一个命令模式的应用...
在J2EE中,如Servlet过滤器,它可以在不影响其他对象的情况下,为HTTP请求添加额外的功能。 7. **代理模式**:为其他对象提供一种代理以控制对这个对象的访问。在J2EE中,远程代理用于处理EJB的远程调用,而虚拟...
Java Servlet的过滤器链就是一个很好的例子。 16. 迭代器模式(Iterator):迭代器模式提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。Java集合框架中的`Iterator`接口和各种集合类实现了迭代器模式。...
在Java Web中,比如Servlet过滤器,它允许我们向已存在的对象添加新的行为或责任,而无需修改原有代码。 8. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能...