Ajax - Ajax通過 JavaScript / jQuery + servlet 的實現

Ajax :Asynchronous Javascript And XML(異步js 和 xml)

一、目錄

1.servlet類
2.jsp文件:js、jQuery 方式(包含JSON格式的傳輸)
3.圖解
在這裏插入圖片描述

二、servlet類

package org.lanqiao.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "demoServlet")
public class demoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //設置編碼格式
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("utf-8");//防止亂碼

        //獲取頁面請求的參數
        String mobile =  request.getParameter("mobile") ;

        //servlet以輸出流的方式  將信息 返回給客戶端
        PrintWriter out = response.getWriter();
        if("315".equals(mobile)) {
			out.write("true");
        }else {
			out.write("false");
        }
        out.close();
    }
}

三、js方式實現

1.實現原理

通過 XMLHttpRequest對象 來實現

(1)XMLHttpRequest對象的方法

open(方法名(提交方式get|post),服務器地址url,true)  //與服務端建立連接

end(): //向服務器發送數據,分爲get和post請求
    get: send(null)
     post:send(參數值)
      
setRequestHeader(header,value):
        get:不需要設置此方法
        post:需要設置:      
     a.如果請求元素中包含了 文件上傳:
     setRequestHeader("Content-Type","multipart/form-data");
     b.不包含了 文件上傳
     setRequestHeader("Content-Type","application/x-www-form-urlencoded")

(2)XMLHttpRequest對象的屬性

readyState:請求狀態 只有狀態爲4 代表請求完畢
status:  響應狀態 只有200 代表響應正常

onreadystatechange:回調函數

接收返回值:
responseText:響應格式爲String
responseXML:相應格式爲XML

2.body部分代碼:

<body>
手機:<input id="mobile">
<input type="button" value="註冊" onclick="register()">

<span id="tip"></span>
</body>

3.head部分代碼

<head>
    <title>$Title$</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    //引入jquery包
    <script src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
		 
		 //html內嵌js
		 <script type="text/javascript">
		 
		 //post和get方式二選一就可
		 
        //post請求方式
        function register() {
            //獲取頁面元素
            var mobile = document.getElementById("mobile").value;
            
            //通過ajax異步方式 請求服務端,創建XMLHttpRequest對象
            xmlHttpRequest = new XMLHttpRequest();

            //設置xmlHttpRequest對象的回調函數
            xmlHttpRequest.onreadystatechange = callBack;

            xmlHttpRequest.open("post", "demoServlet", true);
            //設置post方式的 頭信息
            xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
            xmlHttpRequest.send("mobile=" + mobile);//k=v
        }

		//get請求方式
		//沒有setRequestHeader,send爲null
        function registerGet() {

            var mobile = document.getElementById("mobile").value;
            //通過ajax異步方式 請求服務端
            xmlHttpRequest = new XMLHttpRequest();

            //設置xmlHttpRequest對象的回調函數
            xmlHttpRequest.onreadystatechange = callBack;

            xmlHttpRequest.open("get", "demoServlet?mobile=" + mobile, true);
            //設置post方式的 頭信息  ,get不需要
            //xmlHttpRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xmlHttpRequest.send(null);//k=v
        }

        //定義回調函數 (接收服務端的返回值)
        function callBack() {
            if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
                //接收服務端返回的數據
                var data = xmlHttpRequest.responseText;//服務端返回值爲string格式
                alert(data.length + "===" + data)
                if (data == "true") {
                    alert("請號碼已存在,請更換!");
                } else {
                    alert("註冊成功!");
                }
            }
        }

    </script>

四、jQuery 方式實現(四種)

1. //key-value形式
$.ajax({
url,
請求方式,
data,
回調函數
})

        //jquery方式一
        function register() {
            var $mobile = $("#mobile").val;
            $.ajax({
                url: demoServlet,
                請求方式: "post",
                data: "mobile=" + $mobile,//請求數據,此次爲k=v形式的

                // 成功函數,回調函數
                //out返回值存在result,服務器返回狀態
                success: function x(result, testStatus) {
                    if (result == "true") {
                        alert("已存在,註冊失敗!");
                    } else {
                        alert("註冊成功");
                    }
                },
                //
                error: function x(xhr, errorMessage, e) {
                    alert("系統異常");
                }
            })
        }

2.只有value,嚴格順序

 //jquery方式二,沒有key,只有value,所以嚴格要求順序
        $.get(
            服務器地址,
            請求數據,
            function (result) {
                預期返回值類型(string\xml\json\text
            )
            }
        );
        $.post(
            demoServlet,
            "mobile=" + $mobile,
            function (result) {
                if (result == "true") {
                    alert("已存在,註冊失敗!");
                } else {
                    alert("註冊成功");
                }
            }
        "text"  // 預期返回值類型,可以不寫
        );

3.簡化方式,添加選擇器,以span爲例
省略function,修改servlet類中的out輸出值,直接輸出註冊是否成功,不在通過true傳遞
預期返回值不寫了

        $("#tip").load(
            demoServlet,
            "mobile=" + $mobile
        );

servlet類進行修改:

        PrintWriter out = response.getWriter();
        if("315".equals(mobile)) {
			out.write("已存在!請重新輸入");
        }else {
			out.write("註冊成功");
        }
  1. json方式
        //json數組
        //javascrtpt數組爲[]
        var student = [{"name":"zs","age":20},
                        {"name":"ls","age":20}
                        ];
        $.getJSON(
            demoServlet,//服務器地址
            {"mobile=" : $mobile,"a":$a},//JSON格式請求數據
            function (result) {
                if (result.msg == "true") {
                    alert("已存在,註冊失敗!");
                } else {
                    alert("註冊成功");
                }
        );

servlet類進行修改:

         
//以JSON格式接收(result),所以就算返回值爲true,也爲JSON格式,永遠顯示註冊成功
//則需要修改servlet類,服務端以JSON格式返回數據,即

            PrintWriter out = response.getWriter();
            if("135".equals(mobile)) {
             //write返回一個值,所以最外層爲雙引號,以鍵值對的形式返回,給引號加上轉移符號\
             JSON形式的大括號別忘記
                out.write( "{\"msg\":\"true\"}"   );//   {"\"msg\":\"true\""}
            }else {
                out.write( "{\"msg\":\"false\"}"   );// "\"msg\":\"false\""
            }
            out.close();

            //但是上面的方法,字符串拼接很麻煩,

4.2 json方式–進階版(服務器返回JSON對象,而不是JSON形式數據)
(1)先導包
在這裏插入圖片描述
(2)

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