在第一次访问该网页后生成静态页 以后访问的都是静态网页
一个拦截器
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/";
}
}