Fork me on GitHub

JavaWeb 过滤器应用之页面静态化

  • 页面静态化是把servlet请求的资源所做输出保存到html中, 然后重定向到 html 页面,
    二次访问时,这个html已经存在,那么直接重定向,不用再去访问servlet!
// StaticFilter
    public class StaticFilter implements Filter{
        private FilterConfig config;

        public void destory(){}
        public void init(FilterConfig fConfig) throws ServletException{
            this.config = fConfig;
        }

        public void doFilter(ServletRequest request, ServletResponse response,
                    FilterChain chain) throws ServletException, IOException{

            /*
             * 思路:
             *    1. 第一次访问时,查找请求对应的html页面是否存在,如果存在,则重定向到html;
             *    2. 如果不存在,放行! 把 servlet 访问数据库后,输出给客户端的数据保存到一个
             *       html文件中, 在重定向到html
             *
             *   获取 Category 参数!
             *   Category有四种可能:
             *    null  对应 null.html
             *    1     对应 1.html
             *    2     对应 2.html
             *    3     对应 3.html
             *
             *    html 页面的保存路径: htmls 目录下
             */

             // 判断对应的 html 文件是否存在, 如果存在,直接重定向!

             HttpServletRequest req = (HttpServletRequest)request;
             HttpServletResponse resp = (HttpServletResponse)response;

             String category = request.getParameter("category");

             // 获取对应的文件名
             String htmlPage = category + ".html";

             //得到文件的存放目录
             String htmlPath = config.getServletContext().getRealPath("/htmls");

             // 创建文件
             File destFile = new File(htmlPath,htmlPage);

             // 如果该文件存在
            if(destFile.exists()){
                response.sendRedirect(request.getContextPath()+"/htmls/"+htmlPage);
                return;
            }

            /*
             * 如果该文件不存在, 生成html
             * 首先放行, show.jsp 会做出很多的输出, 我们要让它不再输出给客户端, 而是输出给我们指定
             * 的一个 html 文件中
             *
             * 调包 response, 让它的 getWriter() 与一个html 文件绑定, 那么 show.jsp 的输出就到了
             * html 文件中
             */

             StaticResponse sr = new StaticResponse(resp,destFile.getAbsolutePath());

            // 放行, 即生成了html 文件
            chain.doFilter(request,sr);

            // 这时,页面已经存在, 重定向到html文件
            res.sendRedirect(req.getContextPath()+"/htmls/"+htmlPage);
        }
    }


    // response 的装饰类, StaticResponse.java
    public class StaticResponse extends HttpServletResponseWrapper {
        private HttpServletResponse response;
        private PrintWriter pw;

        // 参数 path, 表示 html 文件的路径
        public StaticResponse(HttpServletResponse response, String path)
                                throws FileNotFoundException {
            super(response);
            this.response = response;

            // 创建一个与html文件路径绑定在一起的流对象
            pw = new PrintWriter(path, "utf-8");
        }

        // 增强的方法
        public PrintWriter getWriter(){
            // 返回一个与html绑定在一起的 printWriter 对象
            // jsp 会使用它进行输出, 这样数据都输出到 html 文件中
            return pw;
        }
    }

参考资料:

posted @ 2017-10-07 20:52  小a的软件思考  阅读(1157)  评论(0编辑  收藏  举报