Ajax

1.1 ajax 概述

傳統(tǒng)的網(wǎng)頁如果需要更新內(nèi)容勇婴,必須重載整個網(wǎng)頁頁面械哟。每當用戶向服務器發(fā)送請求从撼,哪怕只是需要更新一點點的局部內(nèi)容,服務器都會將整個頁面進行刷新仍律。這種方式的缺點是:

  • 性能會有所降低 (一點內(nèi)容嘿悬,刷新整個頁面!)

  • 用戶的操作頁面會中斷(整個頁面被刷新了)

1) 什么是Ajax

Ajax 即"Asynchronous Javascript And XML"染苛,是指一種創(chuàng)建交互式網(wǎng)頁應用的網(wǎng)頁開發(fā)技術(shù)鹊漠。
Ajax = 異步 JavaScript 和 XML

Ajax是客戶端與服務器進行交互時主到,可以【不必刷新整個瀏覽器】的情況下茶行,與服務器進行異步通訊的技術(shù)

image.png

2) Ajax 的作用
Ajax 可以使網(wǎng)頁實現(xiàn)異步更新。這意味著可以在不重新加載整個網(wǎng)頁的情況下登钥,對網(wǎng)頁的某部分進行更新(局部更新)畔师。

image.png

3) Ajax的好處

  • 減輕服務器負擔,按需要獲得數(shù)據(jù)牧牢。
  • 無刷新更新頁面看锉,減少用戶的實際和心理的等待時間。
  • 只更新部分頁面塔鳍,有效利用帶寬
  • 主流瀏覽器都支持Ajax

4) 異步與同步

  • 瀏覽器訪問服務器的方式
    • 同步訪問: 客戶端必須等待服務器端的響應,在等待過程中不能進行其他操作
    • 異步訪問: 客戶端不需要等待服務的響應,在等待期間,瀏覽器可以進行其他操作
image.png

1.2 JS方式ajax的實現(xiàn)(了解)

JS的ajax:出現(xiàn)最早伯铣。使用一個對象XmlHttpRequest對象。專門用于進行ajax請求發(fā)送轮纫,和響應的接收

使用ajax發(fā)請求腔寡,使用ajax接收響應,使用JS進行頁面刷新掌唾。

  • 缺點:

    • 若使用JS的AJAX技術(shù)放前,為了實現(xiàn)簡單功能忿磅,就需要書寫大量復雜代碼。
    • JS的AJAX代碼凭语,瀏覽器兼容性比較差葱她。

前端JS代碼,復制即可

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>new jsp</title>

    <script>
        function run() {
            //1.創(chuàng)建 核心對象
            var xmlhttp;

            //2.判斷瀏覽器類型
            if (window.XMLHttpRequest) {
                xmlhttp=new XMLHttpRequest();
            } else {
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }



            //3.建立連接
            /**
             * 三個參數(shù):
             *      1.請求方式 get post
             *      2.請求資源的路徑
             *      3.是否為異步 是 or 否
             */
            xmlhttp.open("GET","/login?username=tom",true);

            //4.發(fā)送請求
            xmlhttp.send();

            //5.獲取響應結(jié)果
            /**
             * 什么時候獲取響應數(shù)據(jù)?
             *      在服務器響應成功后獲取
             */
            //監(jiān)聽readyState狀態(tài)改變
            xmlhttp.onreadystatechange=function() {
                //readyState==4 響應已經(jīng)就緒, 200 訪問成功
                if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                    //獲取響應數(shù)據(jù)
                    var text = xmlhttp.responseText;
                    alert(text);
                }
            }
        }
    </script>
</head>
<body>
    <input type="button" value="發(fā)送異步請求" onclick="run()"><br>
    局部刷新 <input type="text">
</body>
</html>
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //1.獲取請求數(shù)據(jù)
        String username = req.getParameter("username");

        //打印 username
        System.out.println(username);
        resp.getWriter().write(username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

1.3 jQuery框架的ajax

5.3.1 JQuery框架的ajax簡介

jquery是一個優(yōu)秀的js框架,自然對js原生的ajax進行了封裝似扔,封裝后的ajax的操 作方法更簡潔吨些,功能更強大.

與ajax操作相關(guān)的jquery方法有如下幾種,但開發(fā)中 經(jīng)常使用的有三種:POST GET AJAX

1.3.2 GET請求方式

通過遠程 HTTP GET 請求載入信息虫几。這是一個簡單的 GET 請求功能锤灿,如需復雜的ajax參數(shù)設置請使用$.ajax

Get請求方式語法

$.get(url,data,callback,type)

  • 參數(shù)1: url 請求路徑
  • 參數(shù)2: data 請求時攜帶的數(shù)據(jù)
    格式: key=value 或者 {username=’baby’,pwd:666}
  • 參數(shù)3: callback 響應成功后的回調(diào)函數(shù)
  • 參數(shù)4: type 響應的數(shù)據(jù)類型 text html xml json

代碼示例

//JQuery get方式發(fā)送異步請求
function run2() {
    //1.參數(shù)1 url
    var url = "/login";

    //2.參數(shù)2 數(shù)據(jù)
    var data = {username:"jack"};

    //3.發(fā)送get請求
    $.get(url,data,function (param) {
        //data響應回來的內(nèi)容體
        alert("響應成功! 響應數(shù)據(jù): " + param);
    },"text");
}

1.3.3 POST請求方式

通過遠程 HTTP POST 請求載入信息。這是一個簡單的 POST 請求功能辆脸,如需復雜的ajax參數(shù)設置請使用$.ajax

Post請求方式語法

**$.post(url,data,callback,type)** 
里面的四個參數(shù)和get方式是一樣, 不一樣的是請求方式的不同

代碼示例

//JQuery post方式發(fā)送異步請求
function run3() {
    //1.參數(shù)1 url
    var url = "/login";

    //2.參數(shù)2 數(shù)據(jù)
    var data = {username:"lucy"};

    //3.發(fā)送get請求
    $.post(url,data,function (param) {
        //data響應回來的內(nèi)容體
        alert("響應成功! 響應數(shù)據(jù): " + param);
    },"text");
}

1.3.4 Ajax請求方式

$.ajax()方法可以更加詳細的設置底層的參數(shù)但校。該方法通常用于其他方法不能完成的請求。

ajax請求方式語法:

  • 方式1: jQuery.ajax({[settings]})

  • 方式2: $.ajax({})

settings是一個js字面量形式的對象啡氢,格式是鍵值對{name:value,name:value }状囱,常用的name屬性名如下:

代碼示例

Ajax方式 發(fā)送請求
function run4() {
 $.ajax({
 url:"/login",
 async:true, //是否異步
 data:{username:"tom"},
 type:"POST", //請求方式
 dataType:"text", //返回數(shù)據(jù)的數(shù)據(jù)類型
 success:function (param) {
 alert("響應成功!! " + param)
 },
 error:function () {
 alert("響應失敗!!")
 }
 });
}

1.4 案例: 檢測用戶名是否已經(jīng)被注冊

需求:用戶輸入用戶名,鼠標移除后, 對用戶名進行判斷,提示用戶名是否可用

image.png

步驟:

  1. 準備Servlet ,對用戶名進行校驗,并返回結(jié)果(是否可用)

  2. 為頁面輸入框,綁定鼠標移除事件

  3. 進行異步請求,獲取響應結(jié)果

  4. 根據(jù)結(jié)果,動態(tài)添加 HTML代碼

后臺 Servlet

@WebServlet("/checkName")
public class CheckNameServelt extends HttpServlet {

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

 req.setCharacterEncoding("utf-8");
 resp.setContentType("text/html;charset=utf-8");

 //獲取姓名
 String username = req.getParameter("username");

 //封裝數(shù)據(jù)
 HashMap<String,Object> map = new HashMap<>();

 //判斷用戶是否存在
 if("tom".equals(username)){
 map.put("flag",true);
 map.put("msg","用戶名已經(jīng)被占用!");
 String data = JSON.toJSONString(map);
 resp.getWriter().print(data);
 }else{
 //用戶名未被使用
 map.put("flag",false);
 map.put("msg","用戶名可以使用!");
 String data = JSON.toJSONString(map);
 resp.getWriter().print(data);
 }
 }

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 doGet(req, resp);
 }
}

前臺JSP

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" %>
<!DOCTYPE html>
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <title>new jsp</title>
 <script typet="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>

 <script>
 $(function() {
 $("#username").blur(function () {

 //獲取用戶名
 var name = $(this).val();

 //判斷用戶名不為空
 if(name != null && name != ""){
 $.ajax({
 url:"/checkName",
 type:"GET",
 data:{username:name},
 dataType:"json",
 success:function (data) {
 if(data.flag){
 //設置span內(nèi)容體
 $("#spanMsg").html("<font color='red'>" + data.msg+ "</font>");

 }else if(!data.flag){
 $("#spanMsg").html("<font color='green'>"+ data.msg + "</font>");
 }
 },
 error:function () {
 alert("請求處理失敗!")
 }
 });

 }
 })
 });

 </script>
</head>
<body>
<form action="#" method="post">

 用戶名: <input type="text" id="username" name="username" placeholder="請輸入用戶名">
 <span id="spanMsg" style="color:red"></span><br>

 密碼: <input type="text" name="password" placeholder="請輸入密碼"><br>
</form>

</body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市倘是,隨后出現(xiàn)的幾起案子亭枷,更是在濱河造成了極大的恐慌,老刑警劉巖搀崭,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叨粘,死亡現(xiàn)場離奇詭異,居然都是意外死亡瘤睹,警方通過查閱死者的電腦和手機升敲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轰传,“玉大人驴党,你說我怎么就攤上這事』癫纾” “怎么了港庄?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恕曲。 經(jīng)常有香客問我鹏氧,道長,這世上最難降的妖魔是什么佩谣? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任把还,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘笨篷。我一直安慰自己瞳秽,他們只是感情好,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布率翅。 她就那樣靜靜地躺著练俐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冕臭。 梳的紋絲不亂的頭發(fā)上腺晾,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音辜贵,去河邊找鬼悯蝉。 笑死,一個胖子當著我的面吹牛托慨,可吹牛的內(nèi)容都是我干的鼻由。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼厚棵,長吁一口氣:“原來是場噩夢啊……” “哼蕉世!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起婆硬,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狠轻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后彬犯,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體向楼,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年谐区,在試婚紗的時候發(fā)現(xiàn)自己被綠了湖蜕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡卢佣,死狀恐怖重荠,靈堂內(nèi)的尸體忽然破棺而出箭阶,到底是詐尸還是另有隱情虚茶,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布仇参,位于F島的核電站嘹叫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诈乒。R本人自食惡果不足惜罩扇,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧喂饥,春花似錦消约、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捞高,卻和暖如春氯材,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硝岗。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工氢哮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人型檀。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓冗尤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胀溺。 傳聞我的和親對象是個殘疾皇子生闲,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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