1. 程式人生 > 其它 >SpringMVC學習14:Ajax(非同步無重新整理請求)

SpringMVC學習14:Ajax(非同步無重新整理請求)

SpringMVC學習14:Ajax(非同步無重新整理請求)

  • 簡介:

    • AJAX= Asynchronous JavaScript and XML(非同步的 JavaScript 和 XML)

    • AJAX 是一種在無需重新載入整個網頁的情況下,能夠更新部分網頁的技術;

    • Ajax 不是一種新的程式語言,而是一種用於建立更好更快以及互動性更強的Web應用程式的技術;

 

 

  • 歷史:

    • 在 2005 年,Google 通過其 Google Suggest 使 AJAX 變得流行起來。Google Suggest能夠自動幫你完成搜尋單詞。

    • Google Suggest 使用 AJAX 創造出動態性極強的 web 介面:當您在谷歌的搜尋框輸入關鍵字時,JavaScript 會把這些字元傳送到伺服器,然後伺服器會返回一個搜尋建議的列表。

    • 就和國內百度的搜尋框一樣!

    • 傳統的網頁(即不用ajax技術的網頁),想要更新內容或者提交一個表單,都需要重新載入整個網頁。

    • 使用ajax技術的網頁,通過在後臺伺服器進行少量的資料交換,就可以實現非同步區域性更新。

    • 使用Ajax,使用者可以建立接近本地桌面應用的直接、高可用、更豐富、更動態的Web使用者介面。

 

 

  • 偽造Ajax:

    • 我們可以使用前端的一個標籤來偽造一個ajax的樣子。iframe標籤;

      1、新建一個module :sspringmvc-06-ajax , 匯入web支援!

      2、編寫一個 ajax-frame.html 使用 iframe 測試,感受下效果;

       

 

  • 利用Ajax可以做:

    • 註冊時,輸入使用者名稱自動檢測使用者是否已經存在;

    • 登陸時,提示使用者名稱密碼錯誤;

    • 刪除資料行時,將行ID傳送到後臺,後臺在資料庫中刪除,資料庫刪除成功後,在頁面DOM中將資料行也刪除;

 

 

  • JQuery.ajax:

    • 純JS原生實現Ajax我們不去講解這裡,直接使用jquery提供的,方便學習和使用,避免重複造輪子,有興趣的同學可以去了解下JS原生XMLHttpRequest !

    • Ajax的核心是XMLHttpRequest物件(XHR)。XHR為向伺服器傳送請求和解析伺服器響應提供了介面。能夠以非同步方式從伺服器獲取新資料。

    • jQuery 提供多個與 AJAX 有關的方法。通過 jQuery AJAX 方法,您能夠使用 HTTP Get 和 HTTP Post 從遠端伺服器上請求文字、HTML、XML 或 JSON – 同時您能夠把這些外部資料直接載入網頁的被選元素中。-

    • jQuery 不是生產者,而是大自然搬運工。

    • jQuery Ajax本質就是 XMLHttpRequest,對他進行了封裝,方便呼叫!

      jQuery.ajax(...)
          部分引數:
                url:請求地址
                type:請求方式,GET、POST(1.9.0之後用method)
            headers:請求頭
                data:要傳送的資料
        contentType:即將傳送資訊至伺服器的內容編碼型別(預設: "application/x-www-form-urlencoded; charset=UTF-8")
              async:是否非同步
            timeout:設定請求超時時間(毫秒)
          beforeSend:傳送請求前執行的函式(全域性)
            complete:完成之後執行的回撥函式(全域性)
            success:成功之後執行的回撥函式(全域性)
              error:失敗之後執行的回撥函式(全域性)
            accepts:通過請求頭髮送給伺服器,告訴伺服器當前客戶端可接受的資料型別
            dataType:將伺服器端返回的資料轉換成指定型別
              "xml": 將伺服器端返回的內容轉換成xml格式
              "text": 將伺服器端返回的內容轉換成普通文字格式
              "html": 將伺服器端返回的內容轉換成普通文字格式,在插入DOM中時,如果包含JavaScript標籤,則會嘗試去執行。
            "script": 嘗試將返回值當作JavaScript去執行,然後再將伺服器端返回的內容轉換成普通文字格式
              "json": 將伺服器端返回的內容轉換成相應的JavaScript物件
            "jsonp": JSONP 格式使用 JSONP 形式呼叫函式時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函式名,以執行回撥函式

 

 

  • 測試:Ajax非同步載入資料

    • 1,新建index.jsp頁面:

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
         <title>Title</title>

         <script src="${pageContext.request.contextPath}/static/js/jquery-3.6.0.js"></script>

         <script>
             $(function () {
                 $("#btn").click(function () {
                     /*
                        $.post(url,param,success)
                      */
                     $.post("${pageContext.request.contextPath}/a3",function (data) {

                         var html="";
                         for (let i = 0; i <data.length ; i++) {
                             html+="<tr>"+
                                 "<td>"+data[i].id+"</td>"+
                                 "<td>"+data[i].name+"</td>"+
                                 "<td>"+data[i].pwd+"</td>"+
                                 "</tr>";
                        }

                         $("#content").html(html);
                    })
                })
            })

             
         </script>


      </head>
      <body>

         <input type="button" value="載入資料" id="btn"  />
         <table>
             <tr>
                 <td>編號</td>
                 <td>姓名</td>
                 <td>密碼</td>
             </tr>
             <tbody id="content">
                <%--資料 --%>

             </tbody>

         </table>


      </body>
      </html>
    • 2,修改Controller:

      @RequestMapping("a3")
         public List<User> a3(){
             List<User> userList = new ArrayList<User>();
             userList.add(new User(1,"demo1","111111"));
             userList.add(new User(2,"demo2","111111"));
             userList.add(new User(3,"demo3","111111"));

             return userList;
        }

       

 

  • 測試:Ajax驗證使用者名稱體驗:

    • 1,新建login.jsp頁面:

      <%@ page contentType="text/html;charset=UTF-8" language="java" %>
      <html>
      <head>
         <title>Title</title>
         <script src="${pageContext.request.contextPath}/static/js/jquery-3.6.0.js"></script>

         <script>
             function go1() {
                 //發起一個請求
                 $.post({
                     url:"${pageContext.request.contextPath}/a4",
                     data:{"name":$("#name").val()},
                     success :function (data) {
                         if(data.toString() ==="OK"){
                             $("#userInfo").css("color","green");
                        }else{
                             $("#userInfo").css("color","red");
                        }

                         $("#userInfo").html(data);

                    }
                })
            }

             function go2() {
                 $.post({
                     url:"${pageContext.request.contextPath}/a4",
                     data:{"pwd":$("#pwd").val()},
                     success :function (data) {
                         if(data.toString() ==="OK"){
                             $("#pwdInfo").css("color","green");
                        }else{
                             $("#pwdInfo").css("color","red");
                        }

                         $("#pwdInfo").html(data);


                    }
                })
            }
         </script>

      </head>
      <body>

         <p>
            使用者名稱:<input type="text" id="name" onblur="go1()">
             <span id="userInfo"></span>
         </p>
         <p>
            密碼:<input type="text" id="pwd" onblur="go2()">
             <span id="pwdInfo"></span>
         </p>

      </body>
      </html>
    • 2,修改Controller:

      @RequestMapping("/a4")
      public String a4(String name,String pwd){
         String msg=null;
        if(name !=null){
            if("admin".equals(name)){
                msg="OK";
            }else {
                msg="使用者名稱已存在";
            }
        }

         if(pwd !=null){
             if("111111".equals(pwd)){
                 msg="OK";
            }else {
                 msg="密碼已存在";
            }
        }

        return msg;
      }