1 说明
  你到“当当”搜索Java分类图书时,“当当”会去查询数据库!每天都有很多人去搜索“Java分类”的图书,每次都去访问数据库,这会有性能上的缺失!如果是在访问静态页面(html)那么就会快的多了!静态页面本身就比动态页面快很多倍,而且动态页面总是要去数据库查询,这会更加降低速度!
页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面。而且静态页面还有助与搜索引擎找到你!

2 查看图书分类
  我们先来写一个小例子,用来查看不同分类的图书。然后我们再去思考如何让动态页面静态化的问题。

 <body>
<a href="<c:url value='/BookServlet'/>">全部图书</a><br/>
<a href="<c:url value='/BookServlet?category=1'/>">JavaSE分类</a><br/>
<a href="<c:url value='/BookServlet?category=2'/>">JavaEE分类</a><br/>
<a href="<c:url value='/BookServlet?category=3'/>">Java框架分类</a><br/>
</body>

index.jsp

 public class BookServlet extends BaseServlet {
private BookDao bookDao = new BookDao(); public String findAll(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("bookList", bookDao.findAll());
return "/show.jsp";
} public String findByCategory(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String value = request.getParameter("category");
int category = Integer.parseInt(value);
request.setAttribute("bookList", bookDao.findByCategory(category));
return "/show.jsp";
}
}

BookServlet

 <table border="1" align="center" width="50%">
<tr>
<th>图书名称</th>
<th>图书单价</th>
<th>图书分类</th>
</tr> <c:forEach items="${bookList }" var="book">
<tr>
<td>${book.bname }</td>
<td>${book.price }</td>
<td>
<c:choose>
<c:when test="${book.category eq 1}"><p style="color:red;">JavaSE分类</p></c:when>
<c:when test="${book.category eq 2}"><p style="color:blue;">JavaEE分类</p></c:when>
<c:when test="${book.category eq 3}"><p style="color:green;">Java框架分类</p></c:when>
</c:choose>
</td>
</tr>
</c:forEach>
</table>

show.jsp

3 分析
  我们的目标是在用户第一次访问页面时生成静态页面,然后让请求重定向到静态页面上去。当用户再次访问时,直接重定向到静态页面上去。
  我们需要为不同的请求生成静态页面,例如用户访问BookServlet?category=1时,我们要生成静态页面,当用户访问BookServlet?category=2时,也要生成静态页面。即不同的参数生成不同的静态页面!

 public class StaticResponse extends HttpServletResponseWrapper {
private PrintWriter pw; /**
* String path:html文件路径!
*/
public StaticResponse(HttpServletResponse response, String path)
throws FileNotFoundException, UnsupportedEncodingException {
super(response); // 创建一个与html文件路径在一起的流对象
pw = new PrintWriter(path, "utf-8");
} public PrintWriter getWriter() {
// 返回一个与html绑定在一起的printWriter对象
// jsp会使用它进行输出,这样数据都输出到html文件了。
return pw;
}
}

StaticResponse

 public class StaticFilter implements Filter {
private FilterConfig config;
public void destroy() {}
public void init(FilterConfig fConfig) throws ServletException {
this.config = fConfig;
} public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
/*
* 1. 第一次访问时,查找请求对应的html页面是否存在,如果存在重定向到html
* 2. 如果不存在,放行!把servlet访问数据库后,输出给客户端的数据保存到一个html文件中
* 再重定向到html
*/
/*
* 一、获取category参数!
* category有四种可能:
* * null --> null.html
* * 1 --> 1.html
* * 2 --> 2.html
* * 3 --> 3.html
*
* html页面的保存路径, htmls目录下
*
* 判断对应的html文件是否存在,如果存在,直接重定向!
*/
String category = request.getParameter("category");
String htmlPage = category + ".html";//得到对应的文件名称
String htmlPath = config.getServletContext().getRealPath("/htmls");//得到文件的存放目录
File destFile = new File(htmlPath, htmlPage); if(destFile.exists()) {//如果文件存在
// 重定向到这个文件
res.sendRedirect(req.getContextPath() + "/htmls/" + htmlPage);
return;
} /*
* 二、如果html文件不存在,我们要生成html
* 1. 放行,show.jsp会做出很多的输出,我们要让它别再输出给客户端,而是输出到我们指定的一个html文件中
* 完成:
* * 调包response,让它的getWriter()与一个html文件绑定,那么show.jsp的输出就到了html文件中
*/
StaticResponse sr = new StaticResponse(res, destFile.getAbsolutePath());
chain.doFilter(request, sr);//放行,即生成了html文件 // 这时页面已经存在,重定向到html文件
res.sendRedirect(req.getContextPath() + "/htmls/" + htmlPage);
}
}

StaticFilter

最新文章

  1. STM32是否可以跑linux
  2. Adblock Plus for firefox
  3. select()
  4. git 教程(8)--删除文件
  5. jquery-cookie插件怎么读写json数据
  6. poj 2299 Ultra-QuickSort :归并排序求逆序数
  7. 如何开启Centos6.4系统的SSH服务
  8. Csharp 简单操作Word模板文件
  9. 如何使用C API来操作UCI
  10. PHP 5 Math 函数
  11. Python 爬虫 JD商品-scrapy+requests
  12. springboot(十三):springboot结合mybatis generator逆向工程自动生成代码
  13. Git Add,Git别名等
  14. &lt; Python Index &gt;
  15. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day6)
  16. python学习笔记(一)---python下载以及环境的安装
  17. 在单片机上实现UDP
  18. [agc007f] Shik and Copying String 模拟神题
  19. 初学Python--列表(List)
  20. 笨办法学Python(七)

热门文章

  1. C# 读写十六进制bin 文件
  2. Bootstrap modal垂直居中
  3. WPF ListView 排序
  4. vmstat uptime 系统状态脚本
  5. Android 中沉浸式状态栏实现
  6. 【leetcode】Largest Number ★
  7. 【编程题目】有 4 张红色的牌和 4 张蓝色的牌,主持人先拿任意两张,再分别在 A、B、C 三人额头上贴
  8. September 21st 2016 Week 39th Wednesday
  9. Git命令之从GitHub上下载开源项目
  10. Android利用Gson解析嵌套多层的Json