• servlet 与缓存(4)


    1.设置缓存的两种情况:
    第一种:对于不常常变化的数据,在servlet中能够为其设置合理的缓存时间值,以避免浏览器频繁向server发送请求,提升server的性能。

    另外一种:假设要实现一种高级功能,即client请求动态web资源时,动态web资源发现发给client的数据更新了,就给client发送最新的数据,假设发现数据没有更新,则动态web资源就要client就去訪问它自己缓存的数据。此种情况能够通过覆写动态web资源(即servlet)的getLastModify方法予以实现。

    getLastModified方法由service方法调用,默认情况下,getLastModified方法返回一个负数,开发者在编写servlet时,假设不覆盖getLastModified方法,则每次訪问servlet时,service方法发现getLastModified方法返回负数,它就会调用doXXX方法向client返回最新的数据。此种情况下,server在向client返回doXXX方法返回的数据时,不会在数据上加Last-Modified头字段。

    2.思路和方法:
        假设编写servlet时,覆盖了getLastModified方法,并返回某一个时间值,则client訪问Servlet时,service方法首先会检查client是否通过If-Modified-Since头字段带一个时间值过来。假设没有的话,则service方法会调用doXXX方法向client返回最新的数据。在返回数据时,service方法还会调用getLastModified方法得到一个时间值,并以这个时间值在数据上加上一个Last-Modified头字段。(即通知client缓存数据)

        client在訪问servlet时,假设通过If-Modified-Since头字段带了一个时间值过来,则service方法在调用doXXX方法之前,它会先调用getLastModified方法,得到一个时间值,并与client带过来的时间值进行比較,假设比client的时间值要新,则service方法调用doXXX方法向client返回最新的数据。假设要旧,则service方法而不会调用doXXX方法向client返回数据,而是返回一个304的状态码给client,通知client在拿它缓存中的数据。

    3.缓存的应用

        一个站点有非常多静态资源,比如css文件、html页面、gif图片等等,这些文件一旦创建,有可能永远不会更新。当client第一次訪问这些文件时,server在把文件数据交给client的同一时候,就应该通知client缓存这些文件,以后client每次訪问,server假设发现文件没更新,则应要client去拿它缓存中的文件,以减轻server的压力。

    Tomcatserver中的全部静态web资源,都是由一个缺省servlet负责读取回送给client的,它就是以上方式来提升server的性能。

    4.缓存的小小代码练习

    package cn.wwh.www.web.servlet;

    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;


    /**
     *类的作用:简单的练习了缓存的应用,主要是覆写了
     * 
     *@author 一叶扁舟
     *@version 1.0
     *@创建时间: 2014-7-28 下午02:28:50
     */
    public class CacheDate extends HttpServlet {
    // 覆写getLastModified方法
    @Override
    protected long getLastModified(HttpServletRequest req) {
    // 返回包括给定的虚拟路径的真实路径的字符串。
    String filePath = this.getServletContext().getRealPath("/login.html");
    System.out.println("文件的真实路径:" + filePath);
    File file = new File(filePath);
    // 返回此抽象路径名表示的文件最后一次被改动的时间。
    return file.lastModified();
    }

    public void doGet(HttpServletRequest request, 

    HttpServletResponse response)
    throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    InputStream is = context.getResourceAsStream("/login.html");
    ServletOutputStream sos = response.getOutputStream();
    int len = 0;
    byte[] buf = new byte[1024];
    while((len = is.read(buf))>0){
    sos.write(buf,0,len);
    }
    sos.flush();
    sos.close();
    }
    }

    5.总结:

      (1)对于浏览器的刷新而言,当浏览器缓存中有资源,也会找服务端要资源,仅仅有在回车訪问情况下,才找缓存,这个能够通过httpwatch观察。
      (2)能够通过重写getLastModified()方法来阻止每次刷新都訪问服务端,以减轻服务端的压力

      (3)设置缓存的时间,用发送报文头的方式

      long end = Long.parseLong(date)*1000 + System.currentTimeMillis();
      response.setDateHeader("expires",end);//发送给client浏览器缓存存留的时间
      


  • 相关阅读:
    SSD5_Optional Exercise 5分析
    SSD5_Optional Exercise 3分析
    SSD5_Optional Exercise 1 分析
    SSD5_Optional Exercise 4不会
    SSD5_ Exercise 2分析
    SSD5_Optional Exercise 2分析
    SSD5_Exercise 3分析
    SSD5_Recommended Exercise 4 分析
    2013蓝桥杯C语言本科组B
    hdu 1316 How Many Fibs?【JAVA大数】
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3886512.html
Copyright © 2020-2023  润新知