2011-02-16 140 views
0

我已经看到很多例子,关于如何&为什么要包装一个响应。根据我的理解,扩展为HttpServletResponseWrapper的类提供了一个servlet流,用于通过响应写入数据(以及我们可以根据需要添加的其他一些方法)。这样一个servlet可以在定制的响应流上写入数据。即使使用ResponseWrapper后,我们是否需要将数据写入原始响应?

此外,在自定义类中,我们可以修改流内容,如:删除空间,大小写转换或压缩等。但是,只要servlet完成工作并关闭响应流,就可以执行任何此类操作。所以基本上自定义类只用于保存响应数据。当控制权返回到servlet过滤器时,我们需要进一步在原始响应流上写入数据。我的上述认识

参考代码

CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response); 
chain.doFilter(request, wrapper); 
response.setContentLength(caw.toString().length()); 
out.write(caw.toString()); 
out.close(); 

其他参考资料

http://jango.wordpress.com/2009/04/27/js-minify-filter-in-java/

http://onjava.com/pub/a/onjava/2003/11/19/filters.html?page=3

现在,请给我解释一下由balusc

建议的代码

它是否也不需要将数据写入响应流?请告诉我,我错过了一些部分。

回答

0

有两种方法:按你所说

  • 方法:保存书面由servlet到一些临时缓冲区中的数据,应用需要修改它和servlet完成后,将其写入到输出流。

  • balusc的方法:为输出流创建一个包装器,用于动态执行所需的修改,并用它包装输出流。实际上,在balusc的例子中,它实际上并不起作用 - 在flush()操作期间有一个写入输出流的临时缓冲区。

一般来说,后一种方法更好,因为它不需要额外的内存并且不会引入延迟方面的开销。但是,对于复杂的修改可能很难实现。

+0

你可以举一些例子(不是代码,但是一些示例应用程序的名称),它可能很难实现,也很复杂。它会让我清楚这个概念。 – 2011-02-16 18:00:01

0

理想情况下,您的响应包装对正在写入输出流的内容执行某种类型的服务。在某些情况下,您也可能需要封装输出流。您可以通过覆盖响应包装器中的getOutputStream()方法(以及可能的getWriter()方法)来实现此目的,以便它返回自定义输出流(或Writer)。当内容被写入自定义输出流(或Writer)时,您执行以下三种操作之一(通常):

  1. (可能修改数据并将其写入原始输出流)。
  2. 将其缓冲(部分或全部),(可能修改数据并将其写入原始输出流)。
  3. 完全丢弃数据(我肯定这里有一些用例...在某处)。
相关问题