1. 程式人生 > >ajax的兩種寫法總結

ajax的兩種寫法總結

   ajax不是一種新的程式語言,而是使用JavaScript向伺服器提出請求並處理而不阻塞使用者,核心物件時XMLHTTPRequest,可以在不重新整理頁面的前提下進行區域性重新整理(使用非同步資料重新整理),使使用者的體驗更好,伺服器的壓力更小。

一.原生的ajax

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
      <head>
            <title></title>
            <script type="text/javascript">
             function myajax(){
              //第一步,建立XHR物件,根據瀏覽器的版本來建立不同的物件
              var XHR=null;
              if(window.XMLHTTPRequest){  
               XHR=new XMLHTTPRequest();
              }else{
               XHR=new ActiveXObject("Microsoft.XMLHTTP"); //IE5,IE6版本的物件
              }
               //第二步,傳送非同步請求
               if(XHR!=null){
               var name=document.getElementById("name").val();
               XHR.open("GET","t10OP.jsp?name"+name,true); //三個引數分別是提交方式, 
                                                             url,true為非同步
               XHR.onreadystatechange=myfun;  //狀態改變時執行回撥函式
               XHR.send(null);
               }
               //第三步,定義回撥函式
               function myfun(){
               if(XHR.readyState==4&&XHR.status==200){
                var s=XHR.responseText;
                document.getElementById("info").innerHTML=s;
                    }
           }
}
</script>
      </head>
      <body>
      姓名:<input type="text" id="name"/><p/>
      <button onclick="myajax();">非同步請求</button><p/>
      <div id="info"></div>
      </body>
</html>

模擬伺服器的程式碼:

t10OP.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String name=request.getParameter("name");
out.println("hello,"+name);
%>

原生ajax的建立以及使用步驟:

1.先建立XMLHTTPRequest的物件

2.使用open方法,設定請求引數(請求的方式,請求頁面的相對路徑,是否非同步)

3.選擇回撥函式,一個處理伺服器響應的函式,使用onreadystatechange

4.獲取非同步物件readyState,“4”表示成功;伺服器響應的狀態status,200表示成功

5.讀取響應的資料,可以通過XHR物件的responseText屬性來讀取伺服器返回的資料

  • 當用ajax傳遞中文時,需要對傳遞引數進行處理。

用到了encodeURI函式,主要是URI來進行轉碼的,它預設採用的是UTF-8的編碼。

name=encodeURI(encodeURI(name));  //需要呼叫兩次的encodeURI來解決亂碼問題;

在伺服器端就要相應的加上解碼程式碼:

name=URLDeceder.decode(name,"UTF-8");  //解碼程式碼

而且在解碼端還需要引進相應(解碼)的庫檔案

  • 用post傳遞中文時,需要設定Header

    XHR.setRequestHeader("Content-type","application/x-www-form-urlencoder");  //此程式碼一般加在open()之後,send()之前

  • post與get的區別

        1.get請求會將引數跟在URL後進行傳遞,post則是將引數作為HTTP訊息的實體內容傳送給WEB伺服器。

        2.get最多隻能一次提交1024位元組的內容,而post則沒有此限制。

        3.get請求資料會被瀏覽器快取起來,有可能造成嚴重的安全問題。

        4.在伺服器端的區別:get請求,使用Request.QueryString來獲取引數,而post請求,則是使用Request.Form來處理。

 

二.jquery中的$.ajax()

$(function() {
    $('#send').click(function () {
    $.ajax({
           type: "GET",     //ajax的請求方式
           url: "test.json",   //規定傳送的url地址
           async:true,     //預設為true,所有請求為非同步請求
           data: {         //規定要傳送到伺服器的資料,只要是Object,String型別的都可以
                 "username": $("#username").val(),   //也可以是{username:"使用者名稱"}, 
                                                              {'username':"使用者名稱"}
                 "content": $("#content").val()
             },
          dataType: "json",    //預期伺服器的返回資料,是伺服器回饋的資料格式
          success: function (data) {   //請求成功後的回撥函式
          $('#resText').empty();
                 var html = '';
                 $.each(data, function (commentIdndex, comment) {
                 html += '<div class="comment"><h6>' + comment['username']
                 + ':</h6><p class="para"' + comment['content'] + '</p></div>';
                 });
      $('#resText').html(html);
}
     });
   });
});

其他引數:1.cache:預設是true   從瀏覽器快取中載入請求資訊

                   2.contentType:當傳送資訊到伺服器時,內容的編碼格式,預設值為"application/x-www-form-urlencoded"。

                       可以改為 contentType:"application/json".

get與post傳參:get可以直接將引數加在url後面,也可以放在send()方法中,此時都是將引數通過url傳輸,而在post中,資料只能放在send()方法中。其中post方法中data需要用JSON.stringify()來格式化一下,使其變為json字串,而在get方法中則不需要用JSON.stringify()來格式化。

json物件,js物件,json字串的關係:

   json物件{"id":1,"name":"long"}   js物件{id:1,name:"long"}

json物件的鍵必須用“”(雙引號)括起來,js物件的鍵不用括起來,而且值可以為函式,而前者不行。

json物件加上’‘(單引號)就成為json字串。  

json字串--->json物件:Json.parse();

json物件-->json字串:Json.stringify().