javaWeb使用过滤器解决页面静态化问题

页面静态化的目的:客户端访问服务器时,得到的数据不是服务器从数据库取出,而是一个静态文件(适用于内容不经常变化的数据)。


需要创建一个过滤器
代码如下:
解决的问题:当有客户端第一次访问服务器时,服务器会首先去判断指定文件夹内是否有指定html文件,若存在,则直接重定向到该html文件。若不存在,则生成该文件。

package cn.yellowimg.web.Filter;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class StaticFilter
 */
@WebFilter(servletNames = { "BookServlet" })
public class StaticFilter implements Filter {
    public void destroy() {
        // TODO Auto-generated method stub
    }

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

    //强转
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse res = (HttpServletResponse) response;


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

    String htmlPage = category+".html";
    // req.getServletContext().getRealPath("");可以得到项目的完整路径
    String htmlPath = req.getServletContext().getRealPath("/htmls");

     //知道文件名 知道文件路径,用此方法的到file文件对象
    File destFile = new File(htmlPath,htmlPage );

    //文件存在
    if(destFile.exists())
    {
        //重定向需要写项目名
        res.sendRedirect(req.getContextPath() + "/htmls/" + htmlPage);

        return;
    }
    /*
     * 若不存在 则放行;
     * show.jsp会做很多输出,我们让他不要在输出给客户端,
     * 而是输出到我们指定的html文件中
     * 
     * 完成 :
     * 调包response,让他的getWriter()与一个html文件绑定,
     * 那么show.jsp的输出就到了html文件中
     */
    else{
        StaticResponse staticResponse = new StaticResponse(res, destFile.getAbsolutePath());

        chain.doFilter(req, staticResponse);
        //重定向到指定html文件中
        res.sendRedirect(req.getContextPath() + "/htmls/" + htmlPage);
    }
}


public void init(FilterConfig fConfig) throws ServletException {
    }
}

难点:如何生成该文件呢?

解决思路:filter会将request和respone传到servlet,servlet又将数据转发到指定jsp页面中,拜托指定jsp页面进行显示,在jsp页面显示时会首先获取PrintWriter,再将页面写到writer中,这时候只需要重新改写response的getPrintWriter()方法,将内容写至指定html文件即可。

代码如下:

package cn.yellowimg.web.Filter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;


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

public class StaticResponse extends HttpServletResponseWrapper {

private HttpServletResponse response;

private PrintWriter pw;

//需要传入文件路径才可以改写PrintWriter方法。
public StaticResponse(HttpServletResponse response,String path) throws FileNotFoundException, UnsupportedEncodingException {
    super(response);
    this.response = response;
    File file = new File(path);
    pw = new PrintWriter(file);
}

@Override
public PrintWriter getWriter() throws IOException {
    //返回一个与html绑定在一起的PrintWriter对象
    //jsp会使用他进行初始化
    return pw;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值