servlet 與緩衝(4),servlet緩衝

來源:互聯網
上載者:User

servlet 與緩衝(4),servlet緩衝
1.設定緩衝的兩種情況:
第一種:對於不經常變化的資料,在servlet中可以為其設定合理的緩衝時間值,以避免瀏覽器頻繁向伺服器發送請求,提升伺服器的效能。

第二種:如果要實現一種進階功能,即用戶端請求動態web資源時,動態web資摘要搜索發給用戶端的資料更新了,就給用戶端發送最新的資料,如果探索資料沒有更新,則動態web資源就要用戶端就去訪問它自己緩衝的資料。此種情況可以通過覆寫動態web資源(即servlet)的getLastModify方法予以實現。

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頭欄位。(即通知用戶端快取資料)

    用戶端在訪問servlet時,如果通過If-Modified-Since頭欄位帶了一個時間值過來,則service方法在調用doXXX方法之前,它會先調用getLastModified方法,得到一個時間值,並與用戶端帶過來的時間值進行比較,如果比用戶端的時間值要新,則service方法調用doXXX方法向用戶端返回最新的資料。如果要舊,則service方法而不會調用doXXX方法向用戶端返回資料,而是返回一個304的狀態代碼給用戶端,通知用戶端在拿它緩衝中的資料。

3.緩衝的應用

    一個網站有很多靜態資源,例如css檔案、html頁面、gif圖片等等,這些檔案一旦建立,有可能永遠不會更新。當用戶端第一次訪問這些檔案時,伺服器在把檔案資料交給用戶端的同時,就應該通知用戶端緩衝這些檔案,以後用戶端每次訪問,伺服器如果發現檔案沒更新,則應要用戶端去拿它緩衝中的檔案,以減輕伺服器的壓力。

Tomcat伺服器中的所有靜態web資源,都是由一個預設servlet負責讀取回送給用戶端的,它就是以上方式來提升伺服器的效能。

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);//發送給用戶端瀏覽器緩衝存留的時間
  



servlet中設定相應無緩衝是什?

response.setContentType("text/xml");// 為html文本顯示
response.setCharacterEncoding("utf-8"); // 設定響應字元集
response.setHeader("Cache-Control", "no-cache,must-revalidate"); // 設定相應無緩衝
 
怎解決Servlet緩衝問題?

緩衝怎麼了?
輸出緩衝可以用:
${cachedFragment1} ${counter} ${cachedFragment2}
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.