在这篇文章中,咱们将学到怎样在java应用中压缩响应的html文件php
如今,访问一个网站的页面大小对于访问速度和宽带需求是很是重要的。在这篇文章中,咱们将使用[weblink url="http://code.google.com/p/htmlcompressor"]htmlcompressor[/weblink] 来压缩咱们的java web项目,提升访问的效率。
咱们这里采用maven来加载咱们的 htmlcompressor:
maven的依赖关系: html
<dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.googlecode.htmlcompressor</groupId> <artifactId>htmlcompressor</artifactId> <version>1.5.2</version> </dependency> </dependencies>
htmlcompressor 有不少配置选项。你能够在上面介绍的文章中的 htmlcompressor主页中看到。下面是一个简单的初始化例子: HtmlCompressor compressor = new HtmlCompressor(); 文中所声明的 htmlcompressor 是十分消耗资源的,因此每使用一次都应该从新初始化一个实例。并使他完成多个请求。
这里的 compressor只要不是static 生成,他就是线程安全的,你能够使用它来同时处理多个请求。java
咱们这里将采用java web的过滤器来压缩咱们的项目: Compression filter web
package com.byteslounge.web.filter; 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; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletResponse; import com.googlecode.htmlcompressor.compressor.HtmlCompressor; @WebFilter( filterName = "CompressResponseFilter", urlPatterns = { "/pages/*" } ) public class CompressResponseFilter implements Filter { private HtmlCompressor compressor; @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { CharResponseWrapper responseWrapper = new CharResponseWrapper( (HttpServletResponse) resp); chain.doFilter(req, responseWrapper); String servletResponse = new String(responseWrapper.toString()); resp.getWriter().write(compressor.compress(servletResponse)); } @Override public void init(FilterConfig config) throws ServletException { compressor = new HtmlCompressor(); compressor.setCompressCss(true); compressor.setCompressJavaScript(true); } @Override public void destroy() { } }
能够在上面的过滤器中看到,咱们配置了CSS和JavaScript的压缩。 文章中不包括fileter的全部细节。但你能够猜到,当文件通过这个过滤器之后,会在chain.doFilter()以后将响应信息返回客户端。因此咱们须要重写一下这个方法,咱们应在在返回以前就将文件压缩。 这是基于HttpServletResponseWrapper 实现。使用CharResponseWrapper 的定义以下:
CharResponseWrapper api
package com.byteslounge.web.filter; import java.io.CharArrayWriter; import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class CharResponseWrapper extends HttpServletResponseWrapper { private final CharArrayWriter output; @Override public String toString() { return output.toString(); } public CharResponseWrapper(HttpServletResponse response) { super(response); output = new CharArrayWriter(); } @Override public PrintWriter getWriter() { return new PrintWriter(output); } }
通过咱们的重写,咱们能在发送到客户端以前将文件压缩。安全
下面给出实例项目源码[weblink url="http://download.csdn.net/detail/yyw258520/6872077"] how-to-compress-response-html-in-java-web-application.zip[/weblink]java-web