1. 程式人生 > >Servlet與緩存-學習筆記

Servlet與緩存-學習筆記

Servlet與緩存-學習筆記

  • 對於瀏覽器的刷新而言,當瀏覽器緩存中有資源,也會×××端要資源,只有在回車訪問情況下,才找緩存
  • 2)可以通過重寫getLastModified()方法來阻止每次刷新都訪問服務端,以減輕服務端的壓力
  • 3) 如果要實現一種高級功能,即客戶端請求動態web資源時,動態web資源發現發給客戶端的數據更新了,就給客戶端發送最新的數據,如果發現數據沒有更新,則動態web資源就要客戶端就去訪問它自己緩存的數據。此種情況可以通過覆寫動態web資源(即servlet)的getLastModify方法予以實現
    1. getLastModified方法由service方法調用,默認情況下,getLastModified方法返回一個負數,開發人員在編寫servlet時,如果不覆蓋getLastModified方法,則每次訪問servlet時,service方法發現getLastModified方法返回負數,它就會調用doXXX方法向客戶端返回最新的數據。此種情況下,服務器在向客戶端返回doXXX方法返回的數據時,不會在數據上加Last-Modified頭字段。

    2. 如果編寫servlet時,覆蓋了getLastModified方法,並返回某一個時間值,則客戶端訪問Servlet時,service方法首先會檢查客戶端是否通過If-Modified-Since頭字段帶一個時間值過來。如果沒有的話,則service方法會調用doXXX方法向客戶端返回最新的數據。在返回數據時,service方法還會調用getLastModified方法得到一個時間值,並以這個時間值在數據上加上一個Last-Modified頭字段。(即通知客戶端緩存數據)

    3. 客戶端在訪問servlet時,如果通過If-Modified-Since頭字段帶了一個時間值過來,則service方法在調用doXXX方法之前,它會先調用getLastModified方法,得到一個時間值,並與客戶端帶過來的時間值進行比較,如果比客戶端的時間值要新,則service方法調用doXXX方法向客戶端返回最新的數據。如果要舊,則service方法而不會調用doXXX方法向客戶端返回數據,而是返回一個304的狀態碼給客戶端,通知客戶端在拿它緩存中的數據。
    4. 第一種緩存

    編程:使用一個servlet讀取一個文件數據給客戶端,當文件數據未更新時,通知客戶端去訪問它緩存中的數據,如果文件數據更新了,則向客戶端返回最新數據。

    
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class StaictDome2 extends HttpServlet {
    
        protected long getLastModified(HttpServletRequest req) {
            System.out.println("getLastModified()");
            String path = this.getServletContext().getRealPath("/res/adb.txt");
            File file = new File(path);
            return file.lastModified();
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
               System.out.println("staitcDome2");
    
               //文件在webRoot下使用 只能用:
               ServletContext context = this.getServletContext(); 
               InputStream is = context.getResourceAsStream("/res/adb.txt"); //輸入
               //輸出
               OutputStream os = response.getOutputStream();
               byte[] buf = new byte[1024];
               int len = 0;
               while((len = is.read(buf)) > 0)
               {
                   os.write(buf,0,len);            
               }
                is.close();
                os.close();
    
        }
    
    }

    技術分享圖片


    結果:

    技術分享圖片


    還有一種緩存:

    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class StaictDome1 extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
             String uri = request.getRequestURI();
             System.out.println("uri = "+uri);
            //如果是一個html靜態資源
             if(uri != null && uri.endsWith("html"))
             {
                String html  = this.getServletConfig().getInitParameter("html");
                 if(html !=null)
                 {
                     //獲取緩存時間
                     long end = Long.parseLong(html)*1000 +System.currentTimeMillis();
                     response.setDateHeader("expires", end);
    
                 }
             }
    
        }
    
    }

    Servlet與緩存-學習筆記