缓存过滤器(J2EE design pattern摘记及感想3)

这是个Decorator模式。我们要做的是,得到response后,缓存下来,下次一个request来后,先检查缓存中有没有相应的response可用。要用到Filter,及HttpServletResponseWrapper。doFilter(request,response)是关键方法,它让我们能级联调用下去,直到无Filter时,就调用doGet,doPost。request在被塞入前可被包装。这个缓存过滤器,实际上起到了拦截doFilter级联调用的作用,因为若缓存里已有想要的东西了,实在没必要再调用下去。现在关键是如何来缓存这个response。这里用到了response的包装类。该包装替换了原来的outputStream,所以当调用outputStream的write时,就可以把结果保存于数组中了。

建立级联Filter

先说如何建立那些级联Filter吧。这个过程我们通过配置web.xml实现。解析该xml,每个<filter>tag对之间制定的就是一个Filter,有多个filter的话,就要把他们按照定义顺序,串联起来,即通过FilterChain制定下面的链。<filter-mapping>tag对之间的制定filter作用于何种格式的url上。本例中,我们只配置了一个filter: CacheFilter.

串串烧:

现在有个request来了,我们看到web.xml配置了CacheFilter,所以不能直接调用doGet,只能调用CacheFilter的doFilter,并把FilterChain作为参数传给他(这些都是后台做的,非自己编码部分。最有可能的情况是一开始解析web.xml时,就把这些Filter事先生成好了)。doFilter方法首先看这个request是否已被缓存过,若是的话,则直接写回(用原始的outputStream)结果,若不是,则包装response成CacheResponseWrapper,然后级联调用chain.doFilter。这时候,已经没有其它的filter了,就调用最终Servlet的doGet方法,该doGet方法首先准备好写的数据,然后调用被包装的response的getOutputStream方法,然后用该outputStream写数据。这个得到的outputStream实际上是自定义的CacheOutputStream,通过它写数据,实际上是把数据保存在了数组中。之后控制权回到了CacheFilter.doFilter,它从包装后的response得到数据,缓存起来以备后用,并把该缓存结果写回(用原始的outputStream)。

在缺省无wrapper的情况下,我们得到的outputStream是通过网络不断的增量式的发送给客户端的。包装之后,我们得到的outputStream以流的形式,收集和存储数据。当然我们不光可以缓存数据,还可以在CacheResponseWrapper提供对数据进行后处理的接口,供Filter调用

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值