關於Ajax的cache參數的測試

  其實這次做這個測試是因爲和同學談論@requestbody時引發的一個笑話,我之前一直以爲ajax中的dataType: 'json'是傳輸去後臺的數據格式,後來分分鐘被打臉,查了一下百度,才知道原來dataType: 'json'是期望返回的數據類型,由此才發現原來ajax並沒有平常用的那麼簡單。
首先我們來看一下什麼是Ajax:
AJAX = 異步 JavaScript 和 XML。
AJAX 是一種用於創建快速動態網頁的技術。
通過在後臺與服務器進行少量數據交換,AJAX 可以使網頁實現異步更新。這意味着可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新。
傳統的網頁(不使用 AJAX)如果需要更新內容,必需重載整個網頁面。
有很多使用 AJAX 的應用程序案例:新浪微博、Google 地圖、開心網等等。

在看這些資料的過程中,我注意到了一個參數:cache 這個cache有true和false兩個方向,顯式的要求如果當前請求有緩存的話,直接使用緩存。如果該屬性設置爲 false,則每次都會向服務器請求。由此我做了下面的測試:

首先創建一個servlet,用來接收客戶端發來的請求

AjaxServlet.java

public class AjaxServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("進入了servlet!");
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        int a = 1;
        out.print(a);
        out.flush();
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

這裏做出了標記,如果請求進來了,控制檯會輸出”進入了servlet”

然後創建一個Jsp用來發出請求:
ajaxTest.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% String path = request.getContextPath(); %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<button id="ajaxBtn" value="點我試試~">點我試試~</button>
</body>
<script src="jquery.js"></script>
<script>
    $("#ajaxBtn").click(function () {
        $.ajax({
            url: "<%=path%>/AjaxServlet",
            type: 'get',
            cache: true,
            success: function (data) {
                alert(data);
            }
        });
    })
</script>
</html>

這裏點擊這個按鈕可以出發一個get請求,我們把cache設置爲了true,這樣會在瀏覽器緩存中加載請求信息。

這裏寫圖片描述

可以看出第一次成功進入了servlet,前臺也alert出了這個返回的值。

接着我們點擊第二次,發現居然還是進入了servlet!!!!!
這裏寫圖片描述

這是怎麼回事呢? 沒辦法只能繼續踏上百度谷歌之路,經過查找發現,在IE瀏覽器下,可以實現這個功能,點擊兩次,第二次就不再進入servlet了。

不過,並不鼓勵使用cache:true,因爲ajax是實時獲取數據的,所以不太適合從緩存中加載信息,我想也正是因爲這個原因,谷歌 safari瀏覽器實現不了這個功能吧。

附:ajax其他參數
參數:
url: 要求爲String類型的參數,(默認爲當前頁地址)發送請求的地址。
type: 要求爲String類型的參數,請求方式(post或get)默認爲get。注意其他http請求方法,例如put和delete也可以使用,但僅部分瀏覽器支持。
timeout: 要求爲Number類型的參數,設置請求超時時間(毫秒)。此設置將覆蓋$.ajaxSetup()方法的全局設置。
async:要求爲Boolean類型的參數,默認設置爲true,所有請求均爲異步請求。如果需要發送同步請求,請將此選項設置爲false。注意,同步請求將鎖住瀏覽器,用戶其他操作必須等待請求完成纔可以執行。
cache:要求爲Boolean類型的參數,默認爲true(當dataType爲script時,默認爲false)。設置爲false將不會從瀏覽器緩存中加載請求信息。
data: 要求爲Object或String類型的參數,發送到服務器的數據。如果已經不是字符串,將自動轉換爲字符串格式。get請求中將附加在url後。防止這種自動轉換,可以查看processData選項。對象必須爲key/value格
式,例如{foo1:”bar1”,foo2:”bar2”}轉換爲&foo1=bar1&foo2=bar2。如果是數組,JQuery將自動爲不同值對應同一個名稱。例如{foo:[“bar1”,”bar2”]}轉換爲&foo=bar1&foo=bar2。
dataType: 要求爲String類型的參數,預期服務器返回的數據類型。如果不指定,JQuery將自動根據http包mime信息返回responseXML或responseText,並作爲回調函數參數傳遞。
可用的類型如下:
xml:返回XML文檔,可用JQuery處理。
html:返回純文本HTML信息;包含的script標籤會在插入DOM時執行。
script:返回純文本JavaScript代碼。不會自動緩存結果。除非設置了cache參數。注意在遠程請求時(不在同一個域下),所有post請求都將轉爲get請求。
json:返回JSON數據。
jsonp:JSONP格式。使用SONP形式調用函數時,例如myurl?callback=?,JQuery將自動替換後一個“?”爲正確的函數名,以執行回調函數。
text:返回純文本字符串。
beforeSend:要求爲Function類型的參數,發送請求前可以修改XMLHttpRequest對象的函數,例如添加自定義
HTTP頭。在beforeSend中如果返回false可以取消本次ajax請求。XMLHttpRequest對象是惟一的參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章