1 说明
静态页面本身就比动态页面快很多倍,而且动态页面总是要去数据库查询,这会更加降低速度!
页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面。而且静态页面还有助与搜索引擎找到你!
2 查看图书分类我们先来写一个小例子,用来查看不同分类的图书。然后我们再去思考如何让动态页面静态化的问题。
index.jsp全部图书
JavaSE分类
JavaEE分类
Java框架分类
public class BookServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BookService bookService = new BookService(); ListbookList = null; String param = request.getParameter("category"); if(param == null || param.isEmpty()) { bookList = bookService.findAll(); } else { int category = Integer.parseInt(param); bookList = bookService.findByCategory(category); } request.setAttribute("bookList", bookList); request.getRequestDispatcher("/show.jsp").forward(request, response); }}
show.jsp
图书名称 | 图书单价 | 图书分类 |
---|---|---|
${book.bname } | ${book.price } | JavaSE分类 JavaEE分类 Java框架分类 |
3 分析
用户第一次访问页面时生成静态页面,然后让请求重定向到静态页面上去。当用户再次访问时,直接重定向到静态页面上去。
我们需要为不同的请求生成静态页面,例如用户访问BookServlet?category=1时,我们要生成静态页面,当用户访问BookServlet?category=2时,也要生成静态页面。即不同的参数生成不同的静态页面!
我们可以使用category为key,静态页面的路径为value,保存到一个Map中,然后再把Map保存到ServletContext中。没有对应的静态页面时,我们生成静态页面,再重定向到静态页面,如果存在静态页面,那么直接重定向即可。
public class StaticResponse extends HttpServletResponseWrapper { private PrintWriter pw; public StaticResponse(HttpServletResponse response, String filepath) throws FileNotFoundException, UnsupportedEncodingException { super(response); pw = new PrintWriter(filepath, "UTF-8"); } public PrintWriter getWriter() throws IOException { return pw; } public void close() throws IOException { pw.close(); }}
public class StaticFilter implements Filter { private ServletContext sc; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String key = "key_" + request.getParameter("category"); Mapmap = (Map ) sc.getAttribute("pages"); if(map == null) { map = new HashMap (); sc.setAttribute("pages", map); } if(map.containsKey(key)) { res.sendRedirect(req.getContextPath() + "/staticPages/" + map.get(key)); return; } String html = key + ".html"; String realPath = sc.getRealPath("/staticPages/" + html); StaticResponse sr = new StaticResponse(res, realPath); chain.doFilter(request, sr); sr.close(); res.sendRedirect(req.getContextPath() + "/staticPages/" + html); map.put(key, html); } public void init(FilterConfig fConfig) throws ServletException { this.sc = fConfig.getServletContext(); }}