网页静态化

在第一次访问该网页后生成静态页 以后访问的都是静态网页

一个拦截器

import java.io.CharArrayWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;

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

/**
 * @author mengnan.zhang
 * @version V1.0
 */
public class FileCaptureResponseWrapper extends HttpServletResponseWrapper {
	private CharArrayWriter output;
	 private HttpServletResponse response;
	 public String toString()
	 {
	  return output.toString();
	 }
	 
	 public FileCaptureResponseWrapper(HttpServletResponse response)
	 {
	  super(response);
	  this.response=response;
	  output =new CharArrayWriter();
	 }
	 //覆写getWriter()
	 public PrintWriter getWriter()
	 {
	  return new PrintWriter(output);
	 }
	/** 
	 * @param response 
	*/
	 public void writeFile(String fileName)throws IOException
	 {
	//  FileWriter fw = new FileWriter(fileName,"utf-8");
	//  fw.write( output.toCharArray(),"utf-8" );
	//  PrintWriter writer = new PrintWriter(new OutputStreamWriter(new FileOutputStream(fileName),"utf-8"));
	  FileOutputStream fos=new FileOutputStream(fileName);
	  OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
	  osw.write(output.toCharArray());
	  osw.close();
	 }
	 public void writeResponse() throws IOException
	 {
	  PrintWriter out = response.getWriter();
	  // 重置响应输出的内容长度
	  response.setContentLength(-1);
	  out.print( output.toCharArray() );
	  out.flush();
	  out.close();
	 }

}

文件生成类 就是先生成一个html然后把从响应信息用流写到文件里
import java.io.File;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author amssy
 * @version V1.0
 */
public class FileCaptureFilter implements Filter{

	 private String protDirPath;
	 private FilterConfig filterConfig;
	/**
	 * @Method: destroy  
	 * @see javax.servlet.Filter#destroy() 
	*/
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	/**
	 * @Method: doFilter 
	 * @param arg0
	 * @param arg1
	 * @param arg2
	 * @throws IOException
	 * @throws ServletException 
	 * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) 
	*/
	@Override
	public void doFilter(ServletRequest reques, ServletResponse respons,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletRequest request =  (HttpServletRequest) reques;  
		HttpServletResponse response = (HttpServletResponse) respons;
		String fileName = request.getRequestURI();
		if(!fileName.endsWith(".html")){
			chain.doFilter(request, response);
			}else{
		fileName = fileName.substring(fileName.lastIndexOf("/")+1);
		String path = filterConfig.getServletContext().getRealPath("/")+"html/"+fileName;
		   File file = new File(path);		
		   if (!file.exists()) {// 如果缓存文件不存在
			   fileName=protDirPath+fileName;
			   FileCaptureResponseWrapper responseWrapper = new
			   FileCaptureResponseWrapper((HttpServletResponse)response);
			   chain.doFilter(request, responseWrapper);
			   //得到的html 页面结果字符串
			   //String html = responseWrapper.toString();
			   // 写成html 文件
			   responseWrapper.writeFile(fileName);
			   // back to browser
			   responseWrapper.writeResponse();
			  }else{
			   // 转发至缓存文件
				  //生产去掉okdi
				  response.sendRedirect(request.getContextPath()+"/html/"+fileName);

			  }
			}
	}

	/**
	 * @Method: init 
	 * @param arg0
	 * @throws ServletException 
	 * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) 
	*/
	@Override
	public void init(FilterConfig arg0) throws ServletException {
		filterConfig = arg0;
		protDirPath = arg0.getServletContext().getRealPath("/")+"html/";
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值