Filter应用之页面静态化
2015-11-24 11:13
246 查看
1 说明
你到“当当”搜索最多的是什么分类,没错,就是Java分类!你猜猜,你去搜索Java分类时,“当当”会不会去查询数据库呢?当然会了,不查询数据库怎么获取Java分类下的图书呢!其实每天都有很多人去搜索“Java分类”的图书,每次都去访问数据库,这会有性能上的缺失!如果是在访问静态页面(html)那么就会快的多了!静态页面本身就比动态页面快很多倍,而且动态页面总是要去数据库查询,这会更加降低速度!
页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面。而且静态页面还有助与搜索引擎找到你!
我们说:页面静态化也是有条件的,就是需要访问的这个不需要常常变化(容易根据参数生成html)但还需要从数据库中得来数据,否则就不要静态化。
2 查看图书分类
我们先来写一个小例子,用来查看不同分类的图书。然后我们再去思考如何让动态页面静态化的问题。
index.jsp
BookServlet.java
show.jsp
3 分析
我们的目标是在用户第一次访问页面时生成静态页面,然后让请求重定向到静态页面上去。当用户再次访问时,直接重定向到静态页面上去。
我们需要为不同的请求生成静态页面,例如用户访问BookServlet?category=1时,我们要生成静态页面,当用户访问BookServlet?category=2时,也要生成静态页面。即不同的参数生成不同的静态页面!
我们可以使用category为key,静态页面的路径为value,保存到一个Map中,然后再把Map保存到ServletContext中。没有对应的静态页面时,我们生成静态页面,再重定向到静态页面,如果存在静态页面,那么直接重定向即可。
![](http://img.blog.csdn.net/20151124112351382?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
StaticResponse.java
StaticFilter.java
[崔1]创建BookService
[崔2]获取链接参数
[崔3]如果没有指定category,表示查询所有图书
[崔4]如果指定了category,表示查询指定分类的图书
[崔5]保存到request中,转发到show.jsp页面
[崔6]使用路径创建流!当使用该流写数据时,数据会写入到指定路径的文件中。
[崔7]jsp页面会调用本方法获取这个流!使用它来写入页面中的数据。这些数据都写入到指定路径的页面中去了,即写入到静态页面中。
[崔8]刷新流,使缓冲区中的数据也写入到目标!
[崔9]获取分类参数,分类参数可能是:1,2,3,null。使用分类参数做key
[崔10]在ServletContext中获取Map,首次访问这个Map不存在。
[崔11]如果Map不存在,那么创建一个Map,并存放到ServletContext中,这样下次访问Map就存在了。
[崔12]查看Map中是否存在这个key,如果存在,那么获取值,值就是这个参数对应的静态页面路径。然后直接重定向到静态页面!
[崔13]如果当前请求参数对应的静态页面不存在,那么就生成静态页面,首先静态页面的名称为key,容颜名为html
[崔14]生成真实路径,下面会使用这个路径创建静态页面。
[崔15]创建自定义的response对象,传递待生成的静态页面路径
[崔16]放行
[崔17]这个方法的作用是刷新缓冲区!
[崔18]这时静态页面已经生成,重定向到静态页面
[崔19]把静态页面保存到map中,下次访问时,直接从map中获取静态页面,不用再次生成。
你到“当当”搜索最多的是什么分类,没错,就是Java分类!你猜猜,你去搜索Java分类时,“当当”会不会去查询数据库呢?当然会了,不查询数据库怎么获取Java分类下的图书呢!其实每天都有很多人去搜索“Java分类”的图书,每次都去访问数据库,这会有性能上的缺失!如果是在访问静态页面(html)那么就会快的多了!静态页面本身就比动态页面快很多倍,而且动态页面总是要去数据库查询,这会更加降低速度!
页面静态化是把动态页面生成的html保存到服务器的文件上,然后再有相同请求时,不再去执行动态页面,而是直接给用户响应上次已经生成的静态页面。而且静态页面还有助与搜索引擎找到你!
我们说:页面静态化也是有条件的,就是需要访问的这个不需要常常变化(容易根据参数生成html)但还需要从数据库中得来数据,否则就不要静态化。
2 查看图书分类
我们先来写一个小例子,用来查看不同分类的图书。然后我们再去思考如何让动态页面静态化的问题。
index.jsp
<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> |
publicclass BookServlet extends HttpServlet { publicvoid doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BookService bookService = new BookService();[崔1] List<Book> bookList = null; String param = request.getParameter("category");[崔2] if(param == null || param.isEmpty()) { bookList = bookService.findAll();[崔3] } else { int category = Integer.parseInt(param); bookList = bookService.findByCategory(category); [崔4] } request.setAttribute("bookList", bookList); request.getRequestDispatcher("/show.jsp").forward(request, response); [崔5] } } |
<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> |
我们的目标是在用户第一次访问页面时生成静态页面,然后让请求重定向到静态页面上去。当用户再次访问时,直接重定向到静态页面上去。
我们需要为不同的请求生成静态页面,例如用户访问BookServlet?category=1时,我们要生成静态页面,当用户访问BookServlet?category=2时,也要生成静态页面。即不同的参数生成不同的静态页面!
我们可以使用category为key,静态页面的路径为value,保存到一个Map中,然后再把Map保存到ServletContext中。没有对应的静态页面时,我们生成静态页面,再重定向到静态页面,如果存在静态页面,那么直接重定向即可。
StaticResponse.java
publicclass StaticResponse extends HttpServletResponseWrapper { private PrintWriter pw; public StaticResponse(HttpServletResponse response, String filepath) throws FileNotFoundException, UnsupportedEncodingException { super(response); //如此,tomcat在调用response的out的时候就输出到文件中了 pw = new PrintWriter(filepath, "UTF-8");[崔6] } public PrintWriter getWriter[崔7] () throws IOException { returnpw; } publicvoid close() throws IOException { pw.close();[崔8] } } |
publicclass StaticFilter implements Filter { private ServletContext sc; publicvoid destroy() { } publicvoid doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String key = "key_" + request.getParameter("category");[崔9] Map<String,String> map = (Map<String, String>) sc.getAttribute("pages");[崔10] if(map == null) { map = new HashMap<String,String>(); sc.setAttribute("pages", map); }[崔11] if(map.containsKey(key)) { res.sendRedirect(req.getContextPath() + "/staticPages/" + map.get(key)); return; }[崔12] String html = key + ".html";[崔13] String realPath = sc.getRealPath("/staticPages/" + html);[崔14] StaticResponse sr = new StaticResponse(res, realPath);[崔15] chain.doFilter(request, sr);[崔16] sr.close();[崔17] res.sendRedirect(req.getContextPath() + "/staticPages/" + html);[崔18] map.put(key, html);[崔19] } publicvoid init(FilterConfig fConfig) throws ServletException { this.sc = fConfig.getServletContext(); } } |
[崔2]获取链接参数
[崔3]如果没有指定category,表示查询所有图书
[崔4]如果指定了category,表示查询指定分类的图书
[崔5]保存到request中,转发到show.jsp页面
[崔6]使用路径创建流!当使用该流写数据时,数据会写入到指定路径的文件中。
[崔7]jsp页面会调用本方法获取这个流!使用它来写入页面中的数据。这些数据都写入到指定路径的页面中去了,即写入到静态页面中。
[崔8]刷新流,使缓冲区中的数据也写入到目标!
[崔9]获取分类参数,分类参数可能是:1,2,3,null。使用分类参数做key
[崔10]在ServletContext中获取Map,首次访问这个Map不存在。
[崔11]如果Map不存在,那么创建一个Map,并存放到ServletContext中,这样下次访问Map就存在了。
[崔12]查看Map中是否存在这个key,如果存在,那么获取值,值就是这个参数对应的静态页面路径。然后直接重定向到静态页面!
[崔13]如果当前请求参数对应的静态页面不存在,那么就生成静态页面,首先静态页面的名称为key,容颜名为html
[崔14]生成真实路径,下面会使用这个路径创建静态页面。
[崔15]创建自定义的response对象,传递待生成的静态页面路径
[崔16]放行
[崔17]这个方法的作用是刷新缓冲区!
[崔18]这时静态页面已经生成,重定向到静态页面
[崔19]把静态页面保存到map中,下次访问时,直接从map中获取静态页面,不用再次生成。
相关文章推荐
- 查看系统用户登录信息命令
- CCIE自学-by闫辉NP视频:QoS小结
- CCNA-ACL中关于TCP&UDP端口的确认access-list&eq
- CCNP-OSPF中SPF(最短路径树)算法剖析,建树过程示例
- RHEL的Apache配置(基于ip&端口&域名的虚拟主机和认证)
- 实战:阿里云服务器CentOS6.5下Tomcat网马WAR入侵解决
- Win8系统 Tomcat4.1双击bin下startup.bat启动报错\"wins找不到文件-Dsun.io.use.canonCahches=false\"解决方案
- show interface Serial5/1/0.1/1/4/1:16的接口 解析含义
- win8.1 安装华为eNSP最新版本350图文教程 AR/AP/AC不能启动 路径含中文
- ORA-12154: TNS: 无法解析指定的连接标识符
- 如何创建linux命令”快捷方式”或”自定义命令”
- linux目录下多个文件行数比对函数 关键字遍历文件 linux命令写入C函数
- C#开发usb通知之bulk传输
- linux命令学习笔记(10):cat 命令
- linux命令学习笔记(11):nl命令
- linux命令学习笔记(12):more命令
- Selenium2(webdirver)入门之二TestNg安装(Java版)
- Beetl SpringBoot集成
- 【Java EE (Struts2 + Spring + Hibernate)开发】: Struts2(一)之 【Struts2标签库】
- Mac上svn连不上的原因