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