java web應用中,怎樣壓縮響應的html文件

在這篇文章中,咱們將學到怎樣在java應用中壓縮響應的html文件php

1. 簡介

如今,訪問一個網站的頁面大小對於訪問速度和寬帶需求是很是重要的。在這篇文章中,咱們將使用[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>

2. html 壓縮

htmlcompressor 有不少配置選項。你能夠在上面介紹的文章中的 htmlcompressor主頁中看到。下面是一個簡單的初始化例子: HtmlCompressor compressor = new HtmlCompressor(); 文中所聲明的 htmlcompressor 是十分消耗資源的,因此每使用一次都應該從新初始化一個實例。並使他完成多個請求。
這裏的 compressor只要不是static 生成,他就是線程安全的,你能夠使用它來同時處理多個請求。java

3. compression filter

咱們這裏將採用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);
  }

}

通過咱們的重寫,咱們能在發送到客戶端以前將文件壓縮。安全

4. 示例下載

下面給出實例項目源碼[weblink url="http://download.csdn.net/detail/yyw258520/6872077"] how-to-compress-response-html-in-java-web-application.zip[/weblink]java-web

相關文章
相關標籤/搜索