Servlet高級應用---Servlet與緩存


    一】設置緩存文件的有效日期
        重點方法:
            HttpServletRequest類:
                    1》String getRequestURI();//獲取客戶端地址欄的路徑值
            HttpServletResponse類:
                    2》void SetDateHeader(String name, long endTime);
                            name:對應的瀏覽器類型。  IE瀏覽器為:expires
                            endTime:緩存文件失效的時間,單位為毫秒
                            
                            
        code:
            String uri = request.getRequestURI();
            //如果是一個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);
                }
            }
    二】可以通過復寫getLastModified方法來阻止每次刷新都訪問服務端,來減輕服務端的壓力
    
    原理:
        1》Servlet對象來應答客戶端的請求的時候,首先會調用service()方法
        2》查看service()方法的源碼,可以知道:
                    service()方法會調用getLastModified()方法,
                        如果此方法的返回值 > 客戶端的時間:  調用doGet()或doPost()方法,並發送狀態碼200給客戶端
                        如果此方法的返回值 == 客戶端的時間:  發送狀態碼304給服務端
                        如果此方法的返回值 為-1:    調用doGet()或doPost()方法,並發送狀態碼200給客戶端。
    

    
    方法原型:
            protected long getLastModified(HttpServletRequest req);
            返回值:
                返回時間HttpServletRequest對象的最后修訂時間,
                如果時間是未知的,則此方法返回一個負數(默認值)        
        

        1》返回值為 -1:代表文件最后一次修改的時間不確定
                處理方式:由於不知道最后一次修改時間,所以一定會調用doGet()或doPost()方法    ,來重新獲取資源
        2》返回值 不等於 -1:代表文件最后一次修改的時間
                處理方式:拿文件最后一次修改的時間和緩存中的時間來進行對比,(此過程通過tomcat服務器來實現)
                                    如果文件已經更新,需要調用doGet()或doPost()方法,重新獲取資源(並發送:202)
                                    如果文件版本一樣,會發送304狀態碼,讓客戶端自己在緩存文件中找。
                                    
 思路:
             所以我們可以通過資源對象的lastModified()方法,獲取服務器最后一次修改資源的時間。    
                
    補充:
    
                
                servlet源碼:
                Servlet{SUN源碼
                
                        service()
                        {
                           if(req.getHead(“if-lastxxx”)==null)
                           {
                             res.setHead(“lastxx”,”時間值”);
                             doXXX();
                           }
                           if(getLastModified()>IE時間值)
                           {
                              res.setHead(“lastxx”,”時間值”);
                              doXXX();
                           }else{
                                  res.setStatus(304);
                              }
                        }
                        getLastModified(){
                            return 時間值
                        }
                    }
    code:
    /*設置為*/

            /*此代碼有問題*/
            
            public class Demo7 extends HttpServlet {
            
                @Override
                protected long getLastModified(HttpServletRequest req) {
                    System.out.println("modifi");
                    /*將資源的路徑從工程的路徑轉換到真實的路徑*/
                    String path = this.getServletContext().getRealPath("/doc/resource.txt");
                    File file = new File(path);
                    return file.lastModified();
                }
            
                public void doGet(HttpServletRequest request, HttpServletResponse response)
                        throws ServletException, IOException {
                    ServletContext context = this.getServletContext();
                    InputStream is = context.getResourceAsStream("/doc/resource.txt");
                    
                    ServletOutputStream sos = response.getOutputStream();
                    byte[] buf = new byte[1024];
                    int len = -1;
                    while((len=is.read(buf)) > 0){
                        sos.write(buf, 0, len);
                    }
                    
                    System.out.println("serv");
                    is.close();
                    sos.close();
                }
            
            }

        注意:
            1》關於緩存的刷新
                對於瀏覽器的刷新而言,當瀏覽器緩存中有此資源,也會找服務端重新要資源;
                而在回車訪問的情況下,才直接找緩存,不會找服務端要。            
            2》
                其實瀏覽器訪問的html靜態資源本質上是由一個缺省的Servlet來幫你處理,轉發給客戶端的。
                    
補充:servlet對象常見方法
    1》獲得一個ServletConfig對象
        ServletConfig getServletConfig();
    2》獲取一個ServletContext對象
        ServletContext getServletContext();
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM