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}