ajax。xmlHttpRequest的原理


一、什么是ajax

ajax是一種異步通信技術。在ajax出現之前,客戶端與服務端之間直接通信。引入ajax之后,客戶端與服務端加了一個第三者--ajax。有了ajax之后,通過在后台與服務器進行少量數據交換,可以達到在不刷新整個頁面的情況下實現局部刷新。其原理如圖

總結:簡單來說就是通過XmlHttpRequest對象來向服務器發異步請求,從服務器獲得數據,然后用javascript來操作DOM而更新頁面(這里並不是直接顯示在頁面)。

二:XmlHttpRequest對象

XMLHttpRequest是ajax的核心機制,完全是用來向服務器發出一個請求的,僅僅如此.

XMLHttpRequest對象一共有三個屬性:onreadystatechange(全小寫)、readyState、status

  1.onreadystatechange 

  xmlhttp.onreadystatechange = function(){

  };

  每次readyState對象的改變都會觸發一次onreadystatechange屬性儲存的函數,一次有效的Ajax請求一共會觸發5次該事件

  2.readyState

    一共有5個值,0~4分別代表不同的狀態。

    0  ——    請求未初始化

    1  ——    服務器已建立了鏈接

    2  ——    請求已被服務器接收

    3  ——    請求正在被處理

    4  ——    請求完成處理,響應就緒

    if(xmlhttp.readyState==4…):用以判斷當前服務器是否已准備好響應

  3.Status

  代表着Http狀態碼 200:OK

  if(xmlhttp.readyState==4&& xmlhttp.status==200)

三:原生ajax的流程

原生ajax的請求總結為一下六個步驟

1.創建XHR對象

2.調用open()方法創建請求

3.調用send()方法發送請求

4.onreadychange捕獲請求的狀態碼

5.判斷狀態嗎是否成功

6.調用ajax的responseText屬性返回數據:(獲取服務器響應內容:responseText / responseXML

四:Jquery對ajax的封裝

$.ajax,....(其他忽略)

這個是JQuery對ajax封裝的最基礎方法,通過使用這個函數可以完成異步通訊的所有功能。也就是說什么情況下我們都可以通過此方法進行異步刷新的操作。

jquery封裝了XMLHttpRequest的底層實現,直接調用提供的方法即可

  

function confirm(){
    $('#check-form').bootstrapValidator('validate');
    if($('#check-form').data('bootstrapValidator').isValid()){    
        if($.trim($('#password').val()) != ''){
            var memberNo = getValueAny('memberNo');
            var passwordEncrypt = $('#password').val();
                ajax({
                url: "@url("/common/checkPassword.action")",
                type: "POST",
                data:{
                    memberNo:getValueAny('memberNo'),
                    passwordEncrypt:passwordEncrypt
                },
                async:false,
                success: function(result) {
                        this.parent.save();
                        closeSelfDialog();
                }
            });
        }
    }
}

contentType: 告訴服務器,我要發什么類型的數據

 
         

dataType:告訴服務器,我要想什么類型的數據,如果沒有指定,那么會自動推斷是返回 XML,還是JSON,還是script,還是String。

五 .json字符串與json對象的區別

  a.JSON對象是直接可以使用JQuery操作的格式,如C#中可以用對象(類名)點出屬性(方法)一樣
  b.JSON字符串僅僅只是一個字符串,一個整體,不截取的話沒辦法取出其中存儲的數據,不能直接使用,除非你只想alert()他;

JSON對象:

var str2 = { "name": "deluyi", "sex": "man" };

JSON字符串:

var str1 = '{ "name": "deyuyi", "sex": "man" }';

  1.將"JSON對象"轉化為"JSON字符串"的方法?

    使用全局方法JSON.stringify()與toJSONString()   

    例如:

      obj.toJSONString(); //將JSON對象轉化為JSON字符

    或者

      JSON.stringify(obj); //將JSON對象轉化為JSON字符

  var params = $('#user-form').serializeObject();//這樣就可以獲得整個表單所有字段的數據,並以object格式序列化

 

關於ajax設置contentType,data的部分相關實驗:

前端:

if ($('#main-form').data('bootstrapValidator').isValid()) {
        var sql = document.getElementById('sql').value
         $.ajax({
            url:'@url("/loginSysInformConf/select.action")',
            type:"post",
            data:sql,
            contentType:"application/json",
            mask:true,
            success:function(result){
                if(result && result.data){
                    confirm(result.messages+",是否要保存?", function(){
                        save();
                    });
                }else{
                    error(result.messages+",請核對你的sql文");
                }
            },
            error: function(xmlHttpRequest, message, exception) {
                error("系統異常:\n" + message);
            }
        }); 
    }

sql的值為:SELECT USER_NAME as USER_NAME,LAST_LOGIN_TIME as LAST_LOGIN_TIME FROM TB_USER@TEST

后台:

public ResultBean select(@RequestBody String sql){
        List<SystemUserLoginInfoEntity> userList = loginSysInformConfService.select(sql);
        ResultBean bean=new ResultBean();
        bean.setData(userList);
        if(userList != null && userList.size() > 0){
            bean.setData(userList);
            bean.setMessages("測試通過");
            bean.setStatus(true);
        }else{
            bean.setMessages("測試未通過");
            bean.setStatus(false);
        }
        return bean;
    }

情況1:data:sql               contentType:"application/json",              @RequestBody String sql

  接收情況:SELECT USER_NAME as USER_NAME,LAST_LOGIN_TIME as LAST_LOGIN_TIME FROM TB_USER@TEST   -------正常

情況2:data:JSON.stringify(sql)               contentType:"application/json",              @RequestBody String sql

       接收情況:"SELECT USER_NAME as USER_NAME,LAST_LOGIN_TIME as LAST_LOGIN_TIME FROM TB_USER@TEST"

情況3:data:{sql:sql}             contentType:"application/json",              @RequestBody String sql

  接收情況:sql=SELECT+USER_NAME+as+USER_NAME%2CLAST_LOGIN_TIME+as+LAST_LOGIN_TIME+FROM+TB_USER%40TEST

情況4:data:sql                           @RequestBody String sql

  接收情況:SELECT+USER_NAME+as+USER_NAME%2CLAST_LOGIN_TIME+as+LAST_LOGIN_TIME+FROM+TB_USER%40TEST=

情況5:data:JSON.stringify(sql)                          @RequestBody String sql

  接收情況:%22SELECT+USER_NAME+as+USER_NAME%2CLAST_LOGIN_TIME+as+LAST_LOGIN_TIME+FROM+TB_USER%40TEST%22=

情況6:data:{sql:sql}                        @RequestBody String sql

  接收情況:sql=SELECT+USER_NAME+as+USER_NAME%2CLAST_LOGIN_TIME+as+LAST_LOGIN_TIME+FROM+TB_USER%40TEST

情況7:data:{sql:sql}               String sql

  接收情況:SELECT USER_NAME as USER_NAME,LAST_LOGIN_TIME as LAST_LOGIN_TIME FROM TB_USER@TEST   -------正常

情況8:data:JSON.stringify(sql)               String sql

  接收情況:null

情況9:data:sql                             String sql

  接收情況:null

情況10:data:sql            contentType:"application/json",                 String sql

  接收情況:null

情況11:data:JSON.stringify(sql)               contentType:"application/json",              String sql

  接收情況:null

情況12:data:{sql:sql}              contentType:"application/json",               String sql

  接收情況:null

 總結:1.@RequestBody接收的是一個Json對象的字符串,而不是一個Json對象

       2.   data:sql               contentType:"application/json",              @RequestBody String sql

    或     data:{sql:sql}               String sql才能正常接收數據

   3.不使用contentType: “application/json”則data可以是對象------------data: { id: nodeId },

    使用contentType: “application/json”則data只能是json字符串--------------------data: "{'id': " + nodeId +"}",

      

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM