九逼庞、ajax技術(shù)

1.Ajax

Ajax 即“Asynchronous Javascript And XML”(異步 JavaScript 和 XML)梦鉴,是指一種創(chuàng)建交互式、快速動態(tài)網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā)技術(shù)规辱,無需重新加載整個(gè)網(wǎng)頁的情況下,能夠更新部分網(wǎng)頁的技術(shù)栽燕。

1.1.為什么會出現(xiàn)Ajax技術(shù)?

因?yàn)閭鹘y(tǒng)的網(wǎng)頁技術(shù)罕袋,存在諸多不足,每次頁面要進(jìn)行刷新時(shí)碍岔,需要重新加載整個(gè)頁面浴讯,這樣會導(dǎo)致瀏覽器需要重新解析所有的頁面數(shù)據(jù),頁面中原有的數(shù)據(jù)付秕,不需要重新解析渲染的也會丟失兰珍,服務(wù)器,也需要構(gòu)建整個(gè)頁面的數(shù)據(jù)询吴。這樣增加了服務(wù)器掠河,帶寬,瀏覽器的壓力猛计,且用戶體驗(yàn)比較差唠摹,因?yàn)閿?shù)據(jù)的更新是無差別的,需要更新的或者不需要更新的奉瘤,整個(gè)網(wǎng)頁數(shù)據(jù)都會更新勾拉。這樣可能導(dǎo)致用戶的某些不需要更新的行為數(shù)據(jù),沒重置了盗温,用戶需要重新輸入且用戶不知道被刷新的原因藕赞。基于這點(diǎn),需要根據(jù)需求卖局,可選的改變網(wǎng)頁上的數(shù)據(jù).這種改變網(wǎng)頁上的數(shù)據(jù)斧蜕,是只改變網(wǎng)頁上的部分?jǐn)?shù)據(jù),這樣做砚偶,服務(wù)器需要構(gòu)建的數(shù)據(jù)批销,相對少,傳輸?shù)臄?shù)據(jù)也少染坯,瀏覽重新解析渲染的壓力也小均芽。這種方法就被稱之為局部刷新

傳統(tǒng)網(wǎng)頁交互的不足.png

1.2.Ajax技術(shù)的原理

為了彌補(bǔ)傳統(tǒng)的不足单鹿,需要可選的改變網(wǎng)頁部分?jǐn)?shù)據(jù)掀宋,而改變網(wǎng)頁的數(shù)據(jù)的依據(jù)需要從服務(wù)器獲取,那么瀏覽器就需要與服務(wù)器交互仲锄。就是瀏覽器需要發(fā)送請求給服務(wù)器劲妙,但是瀏覽器沒辦法可選的修改網(wǎng)頁數(shù)據(jù),網(wǎng)頁數(shù)據(jù)屬于DOM元素昼窗,需要使用網(wǎng)頁腳本語言進(jìn)行修改是趴。所以基于這點(diǎn),開發(fā)者讓瀏覽器廠商提供了發(fā)送請求的API澄惊,通過Javascript唆途,利用瀏覽器向服務(wù)器發(fā)送請求,且接收服務(wù)器的響應(yīng)數(shù)據(jù)掸驱,然后根據(jù)響應(yīng)作為更新頁面的依據(jù)肛搬。從而實(shí)現(xiàn)了頁面局部刷新的效果,這種技術(shù)就是Ajax技術(shù)毕贼。由于温赔,此時(shí)瀏覽器與服務(wù)器的交互是在后臺的進(jìn)行交互的,所以這種交互方式也被稱之為異步交互鬼癣。Ajax技術(shù)就是一種異步交互陶贼。其原理啤贩,本質(zhì)上就是Javascript利用瀏覽器,在后臺與服務(wù)交互數(shù)據(jù)拜秧,然后根據(jù)痹屹,利用Javascript的DOM的API,進(jìn)行頁面更新枉氮。

1.3.如何使用Ajax技術(shù)?

一般Ajax技術(shù)分為原生的Ajax技術(shù)或者第三方封裝的Ajax技術(shù)志衍。

原生的Ajax是指使用Javascript最原始的API與服務(wù)器進(jìn)行交互。

原生Ajax:

XMLHttpRequest:是瀏覽器內(nèi)置用于發(fā)送請求的對象聊替,用于在后臺與服務(wù)器交換數(shù)據(jù)楼肪。

注意:

  1. 所有現(xiàn)代瀏覽器(IE7+、Firefox惹悄、Chrome春叫、Safari 以及 Opera)均內(nèi)建 XMLHttpRequest 對象。

    使用:new XMLHttpRequest();

  2. 老版本的 Internet Explorer (IE5 和 IE6)使用 ActiveX 對象:

    使用: new ActiveXObject("Microsoft.XMLHTTP");

以上說明XMLHttpRequest對象存在瀏覽器的兼容性問題.

核心方法:

方法 描述
open(method,url,async) 規(guī)定請求的類型俘侠、URL 以及是否異步處理請求象缀。
method:請求的類型;GET 或 POST
url:文件在服務(wù)器上的位置
async:true(異步)或 false(同步)
send(string) 將請求發(fā)送到服務(wù)器爷速。string:僅用于 POST 請求
setRequestHeader(header,value) 向請求添加 HTTP 頭央星。
header: 規(guī)定頭的名稱
value: 規(guī)定頭的值

事件:

onreadystatechange : 當(dāng)瀏覽器與服務(wù)器的通信狀態(tài)發(fā)生變化時(shí)就會觸發(fā)該事件。

屬性:

屬性 描述
onreadystatechange 存儲函數(shù)(或函數(shù)名)惫东,每當(dāng) readyState 屬性改變時(shí)莉给,就會調(diào)用該函數(shù)。
readyState 存有 XMLHttpRequest 的狀態(tài)廉沮。
從 0 到 4 發(fā)生變化颓遏。
0: 請求未初始化
1: 服務(wù)器連接已建立
2: 請求已接收
3: 請求處理中
4: 請求已完成,且響應(yīng)已就緒
status 200: "OK"
404: 未找到頁面

響應(yīng)屬性:

根據(jù)以下屬性滞时,可以從請求中獲取服務(wù)器響應(yīng)的數(shù)據(jù)

屬性 描述
responseText 獲得字符串形式的響應(yīng)數(shù)據(jù)叁幢。
responseXML 獲得 XML 形式的響應(yīng)數(shù)據(jù)。

注意:

ajax的響應(yīng)數(shù)據(jù)只能是responseText或者responseXML坪稽,即Ajax的響應(yīng)數(shù)據(jù)只能是字符串曼玩。

1.3.1.原生Ajax的使用

  1. 創(chuàng)建發(fā)送請求的對象
  2. 監(jiān)聽請求對象狀態(tài)
    1. 根據(jù)狀態(tài)解析響應(yīng)數(shù)據(jù)
  3. 準(zhǔn)備發(fā)送請求信息
  4. 發(fā)送請求
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>使用Ajax與服務(wù)器交互</title>
</head>
<body>

<div id="divId"></div>
<button id="btn"  onclick="sendAjax()">按鈕</button>
<script type="text/javascript">
//1. 創(chuàng)建請求對象
var reuqest = new XMLHttpRequest();

    //發(fā)送ajax請求
    function sendAjax() {
        //2. 為對象添加監(jiān)聽事件
        reuqest.onreadystatechange = function() {
            console.log("狀態(tài)發(fā)生了變化");
            //接收響應(yīng)數(shù)據(jù) 
            //當(dāng)請求正常  且 響應(yīng)完成時(shí)接收
            console.log(reuqest.readyState);
            //只有當(dāng)請求響應(yīng)完成 且請求正常時(shí)  才接收數(shù)據(jù)
            if (reuqest.readyState == 4 && reuqest.status == 200) {
                //獲取響應(yīng)中的字符串?dāng)?shù)據(jù)
                var msg = reuqest.responseText;
                console.log(msg);
                document.getElementById("divId").innerText = msg;
            }
        }
        var param = "name=張三&age=18"
        //3. 準(zhǔn)備發(fā)送請求 建立連接
        //reuqest.open("get","ajax.do?"+param,true);
        //reuqest.send(param);
        reuqest.open("post", "ajax.do?" + param, true);
        //4. 發(fā)送請求
        reuqest.send(param);
    }
</script>
</body>
</html>
package com.sxt.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ajax.do")
public class AjaxController extends HttpServlet {

    private static final long serialVersionUID = -116354998836682953L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //設(shè)置編碼避免漢字亂碼
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("charset=UTF-8");
        //接收ajax 參數(shù)
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(name+"   "+age);
        System.out.println("有人請求了!!");
        //向ajax返回?cái)?shù)據(jù)
        PrintWriter writer = resp.getWriter();
        //注意  使用print  不要使用println
        writer.print("請求成功");
        writer.flush();
    }
    
}

1.3.2.jquery中的ajax

由于原生ajax的API使用相對繁瑣,且對瀏覽器的兼容性相對較差窒百∈蚺校基于這個(gè)原因,jquery插件篙梢,對原生ajax的API進(jìn)行了二次封裝顷帖,降低了ajax使用的難度,簡化了ajax開發(fā)的步驟。

在jquery中贬墩,ajax提供如下核心方法:

方法名 說明
ajax(option) 就是進(jìn)行ajax請求榴嗅,最接近原生ajax的方法
post(option) 只支持post請求的ajax方法
get(option) 只支持get請求的ajax方法
load(option) 將ajax請求的數(shù)據(jù)加載到dom中

jquery中Ajax相關(guān)函數(shù)

函數(shù) 描述
jQuery.ajax() 執(zhí)行異步 HTTP (Ajax) 請求。
.ajaxComplete() 當(dāng) Ajax 請求完成時(shí)注冊要調(diào)用的處理程序震糖。這是一個(gè) Ajax 事件录肯。與具體的ajax中complete一致
.ajaxError() 當(dāng) Ajax 請求完成且出現(xiàn)錯(cuò)誤時(shí)注冊要調(diào)用的處理程序趴腋。這是一個(gè) Ajax 事件吊说。與具體的error一致
.ajaxSend() 在 Ajax 請求發(fā)送之前顯示一條消息。與具體的ajax請求中beforeSend一致
jQuery.ajaxSetup() 設(shè)置將來的 Ajax 請求的默認(rèn)值优炬。進(jìn)行全局設(shè)置颁井,所有ajax的操作,都會遵循該設(shè)置
.ajaxStart() 當(dāng)首個(gè) Ajax 請求完成開始時(shí)注冊要調(diào)用的處理程序蠢护。這是一個(gè) Ajax 事件雅宾。
.ajaxStop() 當(dāng)所有 Ajax 請求完成時(shí)注冊要調(diào)用的處理程序。這是一個(gè) Ajax 事件葵硕。
.ajaxSuccess() 當(dāng) Ajax 請求成功完成時(shí)顯示一條消息眉抬。
jQuery.get() 使用 HTTP GET 請求從服務(wù)器加載數(shù)據(jù)。
jQuery.getJSON() 使用 HTTP GET 請求從服務(wù)器加載 JSON 編碼數(shù)據(jù)懈凹。
jQuery.getScript() 使用 HTTP GET 請求從服務(wù)器加載 JavaScript 文件蜀变,然后執(zhí)行該文件。
.load() 從服務(wù)器加載數(shù)據(jù)介评,然后把返回到 HTML 放入匹配元素库北。
jQuery.param() 創(chuàng)建數(shù)組或?qū)ο蟮男蛄谢硎荆m合在 URL 查詢字符串或 Ajax 請求中使用们陆。
jQuery.post() 使用 HTTP POST 請求從服務(wù)器加載數(shù)據(jù)寒瓦。
.serialize() 將表單內(nèi)容序列化為字符串。
.serializeArray() 序列化表單元素坪仇,返回 JSON 數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)杂腰。

option:ajax請求的相關(guān)參數(shù)

參數(shù)名 值類型 說明
async Boolean 默認(rèn)值: true。默認(rèn)設(shè)置下椅文,所有請求均為異步請求喂很。如果需要發(fā)送同步請求,請將此選項(xiàng)設(shè)置為 false雾袱。
beforeSend Function 發(fā)送請求前可修改 XMLHttpRequest 對象的函數(shù)恤筛,如添加自定義 HTTP 頭。
cache Boolean 默認(rèn)值: true芹橡,dataType 為 script 和 jsonp 時(shí)默認(rèn)為 false毒坛。設(shè)置為 false 將不緩存此頁面。
complete Function 請求完成后回調(diào)函數(shù) (請求成功或失敗之后均調(diào)用)。
contentType String 默認(rèn)值: "application/x-www-form-urlencoded"煎殷。發(fā)送信息至服務(wù)器時(shí)內(nèi)容編碼類型屯伞。
context Object 這個(gè)對象用于設(shè)置 Ajax 相關(guān)回調(diào)函數(shù)的上下文。
data String 發(fā)送到服務(wù)器的數(shù)據(jù)豪直。
dataFilter Function 給 Ajax 返回的原始數(shù)據(jù)的進(jìn)行預(yù)處理的函數(shù)劣摇。提供 data 和 type 兩個(gè)參數(shù):data 是 Ajax 返回的原始數(shù)據(jù),type 是調(diào)用 jQuery.ajax 時(shí)提供的 dataType 參數(shù)弓乙。函數(shù)返回的值將由 jQuery 進(jìn)一步處理末融。
dataType String 預(yù)期服務(wù)器返回的數(shù)據(jù)類型.
"xml": 返回 XML 文檔
"html": 返回純文本 HTML 信息
"script": 返回純文本 JavaScript 代碼。
"json": 返回 JSON 數(shù)據(jù) 暇韧。
"jsonp": JSONP 格式勾习。
"text": 返回純文本字符串
error Function 有以下三個(gè)參數(shù):XMLHttpRequest 對象、錯(cuò)誤信息懈玻、(可選)捕獲的異常對象巧婶。當(dāng)ajax發(fā)生錯(cuò)誤時(shí)調(diào)用
global Boolean 是否觸發(fā)全局 AJAX 事件。默認(rèn)值: true涂乌。
success Function 請求成功后的回調(diào)函數(shù)艺栈。參數(shù):由服務(wù)器返回,并根據(jù) dataType 參數(shù)進(jìn)行處理后的數(shù)據(jù)湾盒;
timeout Number 設(shè)置請求超時(shí)時(shí)間(毫秒)湿右。
type String 提交方式 GET POST DELETE PUT 等等
url String 默認(rèn)值: 當(dāng)前頁地址。發(fā)送請求的地址历涝。

API示例1:ajax基本請求參數(shù)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery-ajax配置項(xiàng)API</title>
</head>
<body>

<button id="btn1">jquery最基本的ajax請求</button>

<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
    //為按鈕綁定事件
    $("#btn1").click(function(){
        //請求的配置項(xiàng)   請求的參數(shù)
        var option = {
            url:"ajax.do",//請求的URL地址
            type:"get",//請求方法
            data:{'name':'韓梅梅','age':18}, //請求參數(shù)
            timeout:5000, //請求超時(shí)時(shí)間  單位毫秒 如果超出這個(gè)時(shí)間 則終止請求 觸發(fā)error函數(shù)
            error:function(req,msg,exception){//請求出現(xiàn)異常時(shí)調(diào)用的方法
                console.log(req);
                console.log(msg);
                console.log(exception);
            },
            success:function(rs){//請求成功時(shí)調(diào)用的方法   響應(yīng)碼是  200
                console.log("返回的數(shù)據(jù)是:"+rs);
            },
            complete:function(req,msg){//每次請求完成都會調(diào)用  不論成功還是失敗
                console.log("complete:"+req);
                console.log("complete:"+msg);
            }
        };
        //進(jìn)行ajax請求
        $.ajax(option);
    });
</script>
</body>
</html>

AJax請求相關(guān)參數(shù): 非常用參數(shù)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery-ajax配置項(xiàng)API</title>
</head>
<body >

<button id="btn1">jquery最基本的ajax請求</button><br>
<button id="btn2">jquery最非常用屬性介</button>


<img src="img/loading.gif" id="loading" style="width: 100px;height: 100px;display: none" />

<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
    //jquery ajax 非常用屬性介紹
    $("#btn2").click(function(){
        var option = {
            url:"ajax.do",
            type:"get",
            async:true,// 是否進(jìn)行異步請求  默認(rèn)是 true 如果需要同步請求 則為false
            //如果ajax是異步請求,那么不管ajax相關(guān)代碼是否執(zhí)行完,ajax之后的代碼都會執(zhí)行
            //如果ajax是同步請求,那么只有當(dāng)ajax相關(guān)代碼執(zhí)行完,ajax之后的代碼才會執(zhí)行
            //如果ajax相關(guān)數(shù)據(jù) 參與ajax之后的代碼運(yùn)算,建議使用同步請求
            beforeSend:function(XHR){//進(jìn)行ajax請求前調(diào)用的函數(shù) 此時(shí) 只屬于當(dāng)前ajax請求
                //設(shè)置請求頭
                $("#loading").show();
            },
            context:document.body,// 指定ajax中的this 對象
            dataType:"json",// ajax 期望的返回?cái)?shù)據(jù)的格式類型  如果返回的數(shù)據(jù)  無法轉(zhuǎn)化為期望格式類型,程序會報(bào)錯(cuò) ,chrome看不到
            dataFilter:function(data,type){//為ajax 返回的原始數(shù)據(jù)進(jìn)行預(yù)處理的函數(shù)  
                //根據(jù) type 的值  將data 原始數(shù)據(jù)進(jìn)行預(yù)處理
                //原始數(shù)據(jù)都默認(rèn)普通字符串 將字符串轉(zhuǎn)化為json對象
                //data  內(nèi)容 : 請求成功    普通字符串
                console.log(data);
                console.log(type);
                var obj = new Object();
                if(type == "json"){
                    obj.msg = data;
                }
                //此時(shí)打印的是js 對象
                console.log(obj); //現(xiàn)在js 對象  根json 規(guī)范一樣
                //轉(zhuǎn)化為json 對象
                //將 js 對象轉(zhuǎn)化為 json 對象
                var jsonObj = $.parseJSON('{"msg":"請求成功"}');
                //此時(shí)打印的json 對象
                //console.log(jsonObj);
                
                return  JSON.stringify(jsonObj); 
                // 拼接成了  json 字符串  jquery 對這個(gè)字符串進(jìn)行轉(zhuǎn)化
                //然后 轉(zhuǎn)化后的結(jié)果 返回 success 方法 當(dāng)做參數(shù)
                
            },
            success:function(rs){//請求成功時(shí)調(diào)用的方法   響應(yīng)碼是  200
                //rs.msg   ---- rs 是一個(gè)對象 
                
                
                console.log("返回的數(shù)據(jù)是:"+rs.msg);
                
            
            //例如: success 里面做了多個(gè)dom的操作   根據(jù)數(shù)據(jù)生成dom
                //而ajax 之后代碼有相關(guān)關(guān)聯(lián)的dom操作,則容易程序異常問題
                $(this).attr("bgcolor","red");
            },
            complete:function(req,msg){//每次請求完成都會調(diào)用  不論成功還是失敗
                $("#loading").hide();
            }
        };
        //進(jìn)行ajax請求
        $.ajax(option);
        //進(jìn)行dom 相關(guān)操作    獲取 success 生成的dom
    })
</script>
</body>
</html>

Ajax中的方法示例

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jquery ajax 中的方法介紹</title>
</head>
<body>
<form id="form1">
    名稱:<input name="name"/><br>
    年齡:<input name="age" />
    <input type="button" id="subBtn1" value="提交" />
</form>
<img src="img/loading.gif" id="loading" style="width: 100px;height: 100px;display: none" />
<button id="btn1" >獲取表單數(shù)據(jù)</button>
<button id="btn2" >get發(fā)送ajax請求</button>
<button id="btn3" >post發(fā)送ajax請求</button>
<button id="btn4" >getJSON</button>
<button id="btn5" >load</button><br>
<h1>ajax2.html中</h1>
<div id="content"></div>

<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
    //ajax 的全局設(shè)置
    //只要進(jìn)行了全局設(shè)置  所有的 ajax 請求都會觸發(fā)相關(guān)設(shè)置的方法
    /* $.ajaxSetup({
        beforeSend:function(req){
            // 在 前端后分離的項(xiàng)目中  此時(shí)可以在beforeSend中統(tǒng)一設(shè)置請求頭
            console.log("請求前");
        },
        dataFilter:function(data,type){
            //統(tǒng)一進(jìn)行數(shù)據(jù)攔截 
            //例如 : 如果數(shù)據(jù)不符合規(guī)范  則 進(jìn)行某些業(yè)務(wù)處理
        },
        complete:function(req,rs){
            console.log("請求完成");
        }
    }); */
    //獲取表單數(shù)據(jù)  便于 ajax 進(jìn)行提交
    $("#btn1").click(function(){
        $(document).ajaxStart(function(){
            console.log("ajax 開始請求");
        });
        $(document).ajaxStop(function(){
            console.log("ajax 結(jié)束請求");
        });
        //獲取表單中數(shù)據(jù)  序列化為表單格式的字符串
        var data = $("#form1").serialize();
        console.log(data);
        data = $("#form1").serializeArray();
        console.log(data);
        
        $.ajax({
            url:"ajax.do",
            success:function(rs){
                console.log(rs);
            }
        });
    });
    // ajax 中  get  和 post 
    //為了簡化 ajax 開發(fā)  jquery 提供了  get 和 post 兩個(gè)方法
    //這兩個(gè)方法
    /*  
        url : 請求地址
        param : 請求參數(shù)
        function(rs){}: 請求成功后的回調(diào)函數(shù)
        $.get(url,param,function(rs){});
        
        $.post(url,param,function(rs){});
        get 和 post 方法中的ajax 配置都使用的是默認(rèn)配置
        
        注意: 使用  get 和  post 獲取的ajax 數(shù)據(jù) 是原始數(shù)據(jù)  數(shù)據(jù)類型由服務(wù)器決定  jquery 不會對數(shù)據(jù)做處理
    */
    //使用 get 方法 發(fā)送ajax 請求   
    $("#btn2").click(function(){
        $.get("ajax.do",{'name':'韓梅梅','age':18},function(rs){
            console.log(rs);
        });
    });
    //使用post 方法 發(fā)送ajax請求
    $("#btn3").click(function(){
        $.post("ajax.do",{'name':'李磊','age':18},function(rs){
            console.log(rs);
        });
    }); 
    //獲取json 格式數(shù)據(jù)  getJSON 指定返回的數(shù)據(jù)類型是json類型
    $("#btn4").click(function(){
        $.getJSON("json.do",function(rs){
            console.log(rs);
        });
    }); 
    //.load() 從服務(wù)器加載數(shù)據(jù)诅需,然后把返回到 HTML 放入匹配元素。
    $("#btn5").click(function(){
        $("#content").load("load.do");
    }); 

</script>
</body>
</html>

注意:

  1. 在jQuery 1.9后荧库,全局Ajax事件(ajaxStart, ajaxStop, ajaxSend, ajaxComplete, ajaxError, ajaxSuccess)只在document節(jié)點(diǎn)上觸發(fā).

    只能:$(document).ajaxStart(...)

  2. 在javascript中:

    1. 將json字符串轉(zhuǎn)化為json對象:JSON.parse(str) 或者 $.parseJSON(str) evel
    2. 將對象轉(zhuǎn)化為JSON字符串 :JSON.stringify(obj)

1.4.案例

1.4.1.ajax登錄案例

  1. 使用js獲取表單數(shù)據(jù)
  2. 服務(wù)器獲取ajax提交的數(shù)據(jù)根據(jù)數(shù)據(jù)做出相應(yīng)的響應(yīng)數(shù)據(jù)
  3. js獲取響應(yīng)數(shù)據(jù)堰塌,做出相應(yīng)的反映
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<!-- 此時(shí)使用ajax  form中 無需指定action  method 等等 -->
<form >
    <p>用戶名:<input type="text" id="userName" name="userName" /> </p>
    <p>密碼:<input type="text" id="password" name="password" /></p>
    <p><span id="errorInfo" style="color:red"></span></p>
    <!-- 此時(shí) 提交表單數(shù)據(jù)  使用 js提交  所以 一定不要使用submit -->
    <input type="button" value="提交" id="subBtn"/>
</form>
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript">
    $("#subBtn").click(function(){
        var userName = $("#userName").val();
        if(userName == null || userName == ''){
            $("#errorInfo").text("用戶名不能為空");
            //阻止后面的js 執(zhí)行
            return false;
        }
        var password = $("#password").val();
        if(password == null || password == ''){
            $("#errorInfo").text("密碼不能為空");
            //阻止后面的js 執(zhí)行
            return false;
        }
        var param = {
            'service':'login',
            'userName':userName,
            'password':password
        };
        //提交數(shù)據(jù)給服務(wù)器
        $.post("user.do",param,function(rs){
            //對rs 響應(yīng)數(shù)據(jù)進(jìn)行解析
            //如果rs 表示是成功  則 可以跳轉(zhuǎn)到 登錄成功的頁面
            //如果rs 表示是失敗  則 將失敗原因 顯示在頁面
            // 服務(wù)器中返回的數(shù)據(jù)  code值為 200 時(shí) 才表示正常 
            // 如果不是200  表示都是異常的   msg  就是異常的原因
            //協(xié)議  服務(wù)器返回的數(shù)據(jù)的協(xié)議
            console.log(rs);
            if(rs.code != 200){
                $("#errorInfo").text(rs.msg);
                return false;
            }
            //如果 code 值為 200  說明 用戶名和密碼是正確 進(jìn)行頁面跳轉(zhuǎn)
            //需要使用 js 實(shí)現(xiàn)  頁面跳轉(zhuǎn)
            location.href = "success.html";
            
        });
    });

</script>
</body>
</html>
package com.sxt.controller;

import java.io.IOException;
import java.io.PrintWriter;

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 com.alibaba.fastjson.JSONObject;
@WebServlet("/user.do")
public class UserController extends HttpServlet {

    private static final long serialVersionUID = 7723086583204133716L;

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String  service = req.getParameter("service");
        if("login".equals(service)) {
            login(req,resp);
        }
    }
    /**
     * @Title: login
     * @author: Mr.T   
     * @date: 2020年2月19日 下午5:42:20 
     * @Description: 處理登錄業(yè)務(wù)的方法
     * @param req
     * @param resp
     * @return: void
     * @throws IOException 
     */
    private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String userName = req.getParameter("userName");
        String password = req.getParameter("password");
        JSONObject rs = new JSONObject();
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("json/text;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        //校驗(yàn)用戶名   告訴瀏覽器  用戶名錯(cuò)誤
        if(!"admin".equals(userName)) {
            //業(yè)務(wù)錯(cuò)誤碼
            rs.put("code", 4001);
            //業(yè)務(wù)錯(cuò)消息
            rs.put("msg","用戶名錯(cuò)誤");
            //將結(jié)果數(shù)據(jù)返回給瀏覽器
            writer.write(rs.toJSONString());
            writer.flush();
            writer.close();
            return;
        }
        // 校驗(yàn)密碼
        if (!"admin".equals(password)) {
            // 業(yè)務(wù)錯(cuò)誤碼
            rs.put("code", 4002);
            // 業(yè)務(wù)錯(cuò)消息
            rs.put("msg", "用戶密碼錯(cuò)誤");
            // 將結(jié)果數(shù)據(jù)返回給瀏覽器
            writer.write(rs.toJSONString());
            writer.flush();
            writer.close();
            return;
        }
        // 業(yè)務(wù)錯(cuò)誤碼
        rs.put("code", 200);
        // 業(yè)務(wù)錯(cuò)消息
        rs.put("msg", "登錄成功");
        // 將結(jié)果數(shù)據(jù)返回給瀏覽器
        writer.write(rs.toJSONString());
        writer.flush();
        writer.close();
        return;
    }

    
    
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市分衫,隨后出現(xiàn)的幾起案子场刑,更是在濱河造成了極大的恐慌,老刑警劉巖蚪战,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牵现,死亡現(xiàn)場離奇詭異,居然都是意外死亡邀桑,警方通過查閱死者的電腦和手機(jī)瞎疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壁畸,“玉大人贼急,你說我怎么就攤上這事茅茂。” “怎么了太抓?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵空闲,是天一觀的道長。 經(jīng)常有香客問我走敌,道長碴倾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任掉丽,我火速辦了婚禮跌榔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘机打。我一直安慰自己矫户,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布残邀。 她就那樣靜靜地躺著,像睡著了一般柑蛇。 火紅的嫁衣襯著肌膚如雪芥挣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天耻台,我揣著相機(jī)與錄音空免,去河邊找鬼。 笑死盆耽,一個(gè)胖子當(dāng)著我的面吹牛蹋砚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摄杂,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼坝咐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了析恢?” 一聲冷哼從身側(cè)響起墨坚,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曼尊,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娃豹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了离咐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖亏拉,靈堂內(nèi)的尸體忽然破棺而出历恐,到底是詐尸還是另有隱情,我是刑警寧澤专筷,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布弱贼,位于F島的核電站,受9級特大地震影響磷蛹,放射性物質(zhì)發(fā)生泄漏吮旅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一味咳、第九天 我趴在偏房一處隱蔽的房頂上張望庇勃。 院中可真熱鬧,春花似錦槽驶、人聲如沸责嚷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罕拂。三九已至,卻和暖如春全陨,著一層夾襖步出監(jiān)牢的瞬間爆班,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工辱姨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柿菩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓雨涛,卻偏偏與公主長得像枢舶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子替久,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容

  • AJAX 原生js操作ajax 1.創(chuàng)建XMLHttpRequest對象 var xhr = new XMLHtt...
    碧玉含香閱讀 3,179評論 0 7
  • ??2005 年侣肄,Jesse James Garrett 發(fā)表了一篇在線文章旧困,題為“Ajax: A new App...
    霜天曉閱讀 885評論 0 1
  • (重要知識點(diǎn)) 通過 HTTP 請求加載遠(yuǎn)程數(shù)據(jù)。(優(yōu)點(diǎn):比較方便使用) jQuery 底層 AJAX 實(shí)現(xiàn)稼锅。簡單...
    吃西瓜的的小青年閱讀 527評論 0 0
  • Php代碼 收藏代碼 ajax通過 HTTP 請求加載遠(yuǎn)程數(shù)據(jù)吼具。jQuery 底層 AJAX 實(shí)現(xiàn)。簡單易用的高...
    Yumazhiyao閱讀 927評論 0 4
  • 第一章 入門 基本功能:訪問和操作 dom 元素矩距,控制頁面樣式拗盒,對頁面的事件處理,與ajax完美結(jié)合锥债,有豐富的插件...
    X_Arts閱讀 1,030評論 0 2