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

xiaoxiao2021-02-28  97

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


需要创建一个过滤器 代码如下: 解决的问题:当有客户端第一次访问服务器时,服务器会首先去判断指定文件夹内是否有指定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; } }
转载请注明原文地址: https://www.6miu.com/read-65103.html

最新回复(0)