双管齐下--采用压缩传输加快网页显示速度

主题

      本文主要针对Tomcat、JBoss系列服务器,采用JSP、Java开发的网站在页面加载过程中对其中包含的Javascript脚本和CSS和图片等进行压缩传输,以加快页面的显示速度,经过试验对比,效果比较明显。

配置一:JBOSS服务器的配置

     在JBOSS的server.xml文件中找到Connector port="80"或者Connector port="8080"这一项,这是配置服务器端口的,在其中添加一个开启压缩传输的参数和要压缩传输的文件的后缀名。

image

     按照上面的配置完毕后,重新启动服务器,看看效果~~。

配置二:在项目中添加压缩函数

    配置完服务器后,网页的显示效果有了一定的提升,如果还想要进一步的提升,那么就需要自己辛苦一下,在项目中做一下配置了,在Web.xml中添加一个过滤器,对指定的文件进行gzip压缩,由于gzip的压缩效率很高,所以往往会取得不错的效果。

    具体的做法如下:

image

过滤器的实现代码如下:

package com.guet.cab.base.Filter;

import   java.io.IOException;    

import   java.util.Enumeration;    

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.http.HttpServletRequest;    

import   javax.servlet.http.HttpServletResponse;    

import   org.apache.commons.logging.Log;    

import   org.apache.commons.logging.LogFactory;    

public   class   CompressionFilter  implements   Filter {    

      protected   Log  log   = LogFactory.getFactory ().getInstance( this .getClass().getName());    

      @SuppressWarnings ( "unchecked" )    

      public   void   doFilter(ServletRequest request, ServletResponse response,    

              FilterChain chain)  throws   IOException, ServletException {    

          boolean   compress =  false ;    

          if   (request  instanceof   HttpServletRequest){    

              HttpServletRequest httpRequest = (HttpServletRequest) request;    

              Enumeration headers = httpRequest.getHeaders( "Accept-Encoding" );    

             while   (headers.hasMoreElements()){    

                  String value = (String) headers.nextElement();    

                  if   (value.indexOf( "gzip" ) != -1){    

                      compress =  true ;    

                  }    

              }    

          }    

          if   (compress){ // 如果浏览器支持则压缩     

              HttpServletResponse httpResponse = (HttpServletResponse) response;    

              httpResponse.addHeader( "Content-Encoding" ,  "gzip" );    

              CompressionResponse  compressionResponse =  new   CompressionResponse(httpResponse);    

              chain.doFilter(request,  compressionResponse );    

              compressionResponse .close();    

          }    

          else { // 如果浏览器不支持则不压缩     

              chain.doFilter(request, response);    

          }    

      }    

      public   void   init(FilterConfig config)  throws   ServletException {    

      }    

     

      public   void   destroy(){    

      }    

  }    

 

其中调用的两个函数分别为:

package com.guet.cab.base.Filter;

import java.io.IOException;
import java.util.zip.GZIPOutputStream;

import javax.servlet.ServletOutputStream;

public class CompressedStream  extends   ServletOutputStream {
	private   ServletOutputStream  out ;  

    private   GZIPOutputStream      gzip ;  

 /** 

 *   指定压缩缓冲流 

 *   @param   输出流到压缩 

 *   @throws   IOException   if   an   error   occurs   with   the   {@link  GZIPOutputStream } . 

 */   

    public   CompressedStream(ServletOutputStream out)  throws   IOException {  

       this . out   = out;  

       reset();  

   }  

   /**   @see   ServletOutputStream   *   */   

   public   void   close()  throws   IOException {  

       gzip .close();  

   }  

   /**   @see   ServletOutputStream   *   */   

   public   void   flush()  throws   IOException {  

      gzip .flush();  

   }  

   /**   @see   ServletOutputStream   *   */   

   public   void   write( byte [] b)  throws   IOException {  

       write(b, 0, b. length );  

   }  

   /**   @see   ServletOutputStream   *   */   

   public   void   write( byte [] b,  int   off,  int   len)  throws   IOException {  

       gzip .write(b, off, len);  

   }  

   /**   @see   ServletOutputStream   *   */   

   public   void   write( int   b)  throws   IOException {  

        gzip .write(b);  

   }  



   public   void   reset()  throws   IOException {  

       gzip   =  new   GZIPOutputStream ( out );  

   }  


}

函数2:

package com.guet.cab.base.Filter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public   class   CompressionResponse  extends   HttpServletResponseWrapper{ 

    protected   HttpServletResponse  response ;    

    private   ServletOutputStream  out ;    

    private   CompressedStream  compressedOut ;   

    private   PrintWriter  writer ;    

    protected   int   contentLength ;    

    public   CompressionResponse(HttpServletResponse response)  throws   IOException {    

       super (response); 

       this.response   = response;    

       compressedOut   =  new   CompressedStream(response.getOutputStream());  

    } 

    public   void   setContentLength( int   len) {  

       contentLength   = len;    

    } 

    public   ServletOutputStream getOutputStream()  throws   IOException {    

       if   ( null   ==  out ) {    

           if   ( null   !=  writer ) {   

              throw   new   IllegalStateException( "getWriter() has already been called on this response." );    

           } 

           out   =  compressedOut ;    

       } 

       return   out ;  

    } 

    public   PrintWriter getWriter()  throws   IOException {     

       if   ( null   ==  writer ) {    

           if   ( null   !=  out ) {    

              throw   new   IllegalStateException( "getOutputStream() has already been called on this response." ); 

           } 

           writer   =  new   PrintWriter( compressedOut );   

       } 

       return   writer ;    

    } 

    public   void   flushBuffer() {    

       try   {    

           if   ( writer   !=  null ) { 

              writer .flush(); 

           } else   if   ( out   !=  null ) {   

              out .flush();    

           } 

       } catch   (IOException e) {   

           e.printStackTrace();    

       } 

    } 

    public   void   reset() { 

       super .reset();    

       try   {    

           compressedOut .reset();    

       } catch   (IOException e) {   

           throw   new   RuntimeException(e);    

       } 

    } 

    public   void   resetBuffer() {    

       super .resetBuffer();    

       try   {    

           compressedOut .reset();    

       } catch   (IOException e) {   

           throw   new   RuntimeException(e); 

       } 

 

    } 

    public   void   close()  throws   IOException {    

       compressedOut .close();    

    } 

 

} 


 

编写完毕后重新启动服务器,测试没有问题后进行对比一下吧,性能肯定会有比较大的提高。

其他的一些加快网页加载速度的方法

      1.对js脚本和css文件进行压缩,压缩的目的是去掉其中的注释和空格等无用的东西,节省空间,在传输的过程中也会加快,如果想用程序实现自动压缩,建议使用yuicompressor这个开源的包,在sourcefrog上面都有的。

      2.如果不想麻烦的话可以使用网上热心的人提供的在线的压缩网页,如

jsmin在线js压缩工具

对其中的例子进行压缩的截图:

image

    3.还有就是别人做好的批处理程序,在Windows下安装JDK就可以使用,这个程序叫jsMinifier,有兴趣的话可以到网上查一下。

总结

      主要是为了解决网页内脚本和CSS等越来越多所造成的网页加载速度越来越慢的问题,本文采用的方法是先在服务器内部开启服务器压缩功能,然后在程序中进行自动二次压缩,并对脚本和CSS等进行手动压缩,经过三步压缩过程,网页的加载速度有了明显的提高。

posted @ 2011-10-29 13:24  Rush_SONG  阅读(3584)  评论(3编辑  收藏  举报