ResponseWrapper.java
package com.wind.frame.base.wrapper;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
/**
*
* 使用装饰器模式,包装HttpServletResponse
*
*/
public class ResponseWrapper extends HttpServletResponseWrapper {
/**
* 我们自己定义的writer,用于接收处理后的输出流
*/
private StringWriter output;
/**
* 典型的装饰器模式
* @param response
*/
public ResponseWrapper(HttpServletResponse response) {
super(response);
output = new StringWriter();
}
@Override
public PrintWriter getWriter() {
//当servlet或jsp请求输出流时,并不给它真正的response中的writer,而是给它我们自己定义的writer
return new PrintWriter(output);
}
/**
*
* 返回流中的内容,方法叫什么名都可以。
*
* @return
*/
public String getResult() {
return output.toString();
}
}
ArticleStaticFilter.java
package com.wind.frame.base.filter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wind.frame.base.wrapper.ResponseWrapper;
/**
* 利用过滤器,使用HttpServletResponse装饰器,获取流,生成静态文件。
*
*/
public class ArticleStaticFilter implements Filter {
private ServletContext servletContext = null;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,
ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
boolean isStatic = false;
String servletPath = httpRequest.getServletPath();
if (servletPath.endsWith("showArticle.do")) {
isStatic = true;
}
//需要静态化
if (isStatic) {
//使用装饰后的response传给过滤器链,处理后的结果在装饰后的response中
ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) response);
filterChain.doFilter(request, responseWrapper);
String articleId = request.getParameter("id");
String path = servletContext.getRealPath("/") + "static/" + articleId + ".html";
//生成静态文件
String responseText = responseWrapper.getResult();
FileWriter fw = new FileWriter(new File(path));
fw.write(responseText);
fw.close();
//使用原始的response,向客户端输出结果
response.getWriter().write(responseText);
response.getWriter().flush();
} else {
filterChain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
servletContext = filterConfig.getServletContext();
}
}