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();
        html

相關文章
相關標籤/搜索