Servlet高级应用---Servlet与缓存
生活随笔
收集整理的這篇文章主要介紹了
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();
?? ??? ?重點方法:
?? ??? ??? ?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();
總結
以上是生活随笔為你收集整理的Servlet高级应用---Servlet与缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jeecg_3.6新版本功能专题讲解 -
- 下一篇: 开发者狂喜!微信小程序文档和工具放出