利用过滤器,使用HttpServletResponse装饰器,获取流,生成静态文件。

来源:互联网 发布:c 语言入门经典 编辑:程序博客网 时间:2024/06/05 20:17
ResponseWrapper.javapackage 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();}@Overridepublic PrintWriter getWriter() {    //当servlet或jsp请求输出流时,并不给它真正的response中的writer,而是给它我们自己定义的writer        return new PrintWriter(output);    }/** *  * 返回流中的内容,方法叫什么名都可以。 *  * @return */public String getResult() {    return output.toString();}}


 

ArticleStaticFilter.javapackage 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();    }}


原创粉丝点击