zoukankan      html  css  js  c++  java
  • 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浏览器缓存存留的时间
      


  • 相关阅读:
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之六 多点触控
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之九 定位
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之五 保存数据的几种方式
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据
    ADOBE FLASH BUILDER 4.6 IOS 开发之部署与调试
    [译] 高性能JavaScript 1至5章总结
    页签及盒子的web标准实现
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3886512.html
Copyright © 2011-2022 走看看