Ajax和Json基礎(chǔ)

AJAX:

  1. 概念: ASynchronous JavaScript And XML 異步的JavaScript 和 XML

    1. 異步和同步:客戶端和服務(wù)器端相互通信的基礎(chǔ)上

      • 客戶端必須等待服務(wù)器端的響應(yīng)育谬。在等待的期間客戶端不能做其他操作蜕依。
      • 客戶端不需要等待服務(wù)器端的響應(yīng)笤喳。在服務(wù)器處理請(qǐng)求的過程中,客戶端可以進(jìn)行其他的操作诅病。

      Ajax 是一種在無(wú)需重新加載整個(gè)網(wǎng)頁(yè)的情況下,能夠更新部分網(wǎng)頁(yè)的技術(shù)。 [1]
      通過在后臺(tái)與服務(wù)器進(jìn)行少量數(shù)據(jù)交換房揭,Ajax 可以使網(wǎng)頁(yè)實(shí)現(xiàn)異步更新。這意味著可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下晌端,對(duì)網(wǎng)頁(yè)的某部分進(jìn)行更新捅暴。
      傳統(tǒng)的網(wǎng)頁(yè)(不使用 Ajax)如果需要更新內(nèi)容,必須重載整個(gè)網(wǎng)頁(yè)頁(yè)面咧纠。

      提升用戶的體驗(yàn)

  2. 實(shí)現(xiàn)方式:

    1. 原生的JS實(shí)現(xiàn)方式(了解)
             //1.創(chuàng)建核心對(duì)象
            var xmlhttp;
            if (window.XMLHttpRequest)
            {// code for IE7+, Firefox, Chrome, Opera, Safari
                xmlhttp=new XMLHttpRequest();
            }
            else
            {// code for IE6, IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
      
            //2. 建立連接
            /*
                參數(shù):
                    1. 請(qǐng)求方式:GET蓬痒、POST
                        * get方式,請(qǐng)求參數(shù)在URL后邊拼接漆羔。send方法為空參
                        * post方式梧奢,請(qǐng)求參數(shù)在send方法中定義
                    2. 請(qǐng)求的URL:
                    3. 同步或異步請(qǐng)求:true(異步)或 false(同步)
      
             */
            xmlhttp.open("GET","ajaxServlet?username=tom",true);
      
            //3.發(fā)送請(qǐng)求
            xmlhttp.send();
      
            //4.接受并處理來(lái)自服務(wù)器的響應(yīng)結(jié)果
            //獲取方式 :xmlhttp.responseText
            //什么時(shí)候獲取演痒?當(dāng)服務(wù)器響應(yīng)成功后再獲取
      
            //當(dāng)xmlhttp對(duì)象的就緒狀態(tài)改變時(shí)亲轨,觸發(fā)事件onreadystatechange。
            xmlhttp.onreadystatechange=function()
            {
                //判斷readyState就緒狀態(tài)是否為4鸟顺,判斷status響應(yīng)狀態(tài)碼是否為200
                if (xmlhttp.readyState==4 && xmlhttp.status==200)
                {
                   //獲取服務(wù)器的響應(yīng)結(jié)果
                    var responseText = xmlhttp.responseText;
                    alert(responseText);
                }
            }
      
    2. JQeury實(shí)現(xiàn)方式
      1. $.ajax()
        • 語(yǔ)法:$.ajax({鍵值對(duì)}
         //使用$.ajax()發(fā)送異步請(qǐng)求
            $.ajax({
                url:"ajaxServlet1111" , // 請(qǐng)求路徑
                type:"POST" , //請(qǐng)求方式
                //data: "username=jack&age=23",//請(qǐng)求參數(shù)
                data:{"username":"jack","age":23},
                success:function (data) {
                    alert(data);
                },//響應(yīng)成功后的回調(diào)函數(shù)
                error:function () {
                    alert("出錯(cuò)啦...")
                },//表示如果請(qǐng)求響應(yīng)出現(xiàn)錯(cuò)誤瓶埋,會(huì)執(zhí)行的回調(diào)函數(shù)
        
                dataType:"text"http://設(shè)置接受到的響應(yīng)數(shù)據(jù)的格式
            });
        
      2. $.get():發(fā)送get請(qǐng)求
        • 語(yǔ)法:$.get(url, [data], [callback], [type])
          • 參數(shù):
            • url:請(qǐng)求路徑
            • data:請(qǐng)求參數(shù)
            • callback:回調(diào)函數(shù)
            • type:響應(yīng)結(jié)果的類型
      
          $.get("ajaxServlet", {
              username: "rose"
          }, function (data) {
              alert(data);
          }, "text");
      
      
      1. $.post():發(fā)送post請(qǐng)求
        • 語(yǔ)法:$.post(url, [data], [callback], [type])
          • 參數(shù):
            • url:請(qǐng)求路徑
            • data:請(qǐng)求參數(shù)
            • callback:回調(diào)函數(shù)
            • type:響應(yīng)結(jié)果的類型
         $.post("ajaxServlet", {
            username: "rose"
        }, function (data) {
            alert(data);
        }, "text");
        

JSON:

  1. 概念: JavaScript Object Notation JavaScript對(duì)象表示法

    Person p = new Person();
    p.setName("張三");
    p.setAge(23);
    p.setGender("男");
    
    var p = {"name":"張三","age":23,"gender":"男"};
    
    • json現(xiàn)在多用于存儲(chǔ)和交換文本信息的語(yǔ)法
    • 進(jìn)行數(shù)據(jù)的傳輸
    • JSON 比 XML 更小、更快,更易解析养筒。
  2. 語(yǔ)法:

    1. 基本規(guī)則
      • 數(shù)據(jù)在名稱/值對(duì)中:json數(shù)據(jù)是由鍵值對(duì)構(gòu)成的
        • 鍵用引號(hào)(單雙都行)引起來(lái)曾撤,也可以不使用引號(hào)
        • 值得取值類型:
          1. 數(shù)字(整數(shù)或浮點(diǎn)數(shù))
          2. 字符串(在雙引號(hào)中)
          3. 邏輯值(true 或 false)
          4. 數(shù)組(在方括號(hào)中) {"persons":[{},{}]}
          5. 對(duì)象(在花括號(hào)中) {"address":{"province":"陜西"....}}
          6. null
      • 數(shù)據(jù)由逗號(hào)分隔:多個(gè)鍵值對(duì)由逗號(hào)分隔
      • 花括號(hào)保存對(duì)象:使用{}定義json 格式
      • 方括號(hào)保存數(shù)組:[]
    2. 獲取數(shù)據(jù):
      1. json對(duì)象.鍵名

      2. json對(duì)象["鍵名"]

      3. 數(shù)組對(duì)象[索引]

      4. 遍歷
        //1.定義基本格式
        var person = {"name": "張三", age: 23, 'gender': true};

         var ps = [{"name": "張三", "age": 23, "gender": true},
             {"name": "李四", "age": 24, "gender": true},
             {"name": "王五", "age": 25, "gender": false}];
        
        
        
        
         //獲取person對(duì)象中所有的鍵和值
         //for in 循環(huán)
        /* for(var key in person){
             //這樣的方式獲取不行。因?yàn)橄喈?dāng)于  person."name"
             //alert(key + ":" + person.key);
             alert(key+":"+person[key]);
         }*/
        
        //獲取ps中的所有值
         for (var i = 0; i < ps.length; i++) {
             var p = ps[i];
             for(var key in p){
                 alert(key+":"+p[key]);
             }
         }
        
  3. JSON數(shù)據(jù)和Java對(duì)象的相互轉(zhuǎn)換

    • JSON解析器:
      • 常見的解析器:Jsonlib晕粪,Gson挤悉,fastjson,jackson
    1. JSON轉(zhuǎn)為Java對(duì)象
      1. 導(dǎo)入jackson的相關(guān)jar包
      2. 創(chuàng)建Jackson核心對(duì)象 ObjectMapper
      3. 調(diào)用ObjectMapper的相關(guān)方法進(jìn)行轉(zhuǎn)換
        1. readValue(json字符串?dāng)?shù)據(jù),Class)
    2. Java對(duì)象轉(zhuǎn)換JSON
      1. 使用步驟:
        1. 導(dǎo)入jackson的相關(guān)jar包
        2. 創(chuàng)建Jackson核心對(duì)象 ObjectMapper
        3. 調(diào)用ObjectMapper的相關(guān)方法進(jìn)行轉(zhuǎn)換
          1. 轉(zhuǎn)換方法:
            • writeValue(參數(shù)1巫湘,obj):
              參數(shù)1:
              File:將obj對(duì)象轉(zhuǎn)換為JSON字符串装悲,并保存到指定的文件中
              Writer:將obj對(duì)象轉(zhuǎn)換為JSON字符串,并將json數(shù)據(jù)填充到字符輸出流中
              OutputStream:將obj對(duì)象轉(zhuǎn)換為JSON字符串尚氛,并將json數(shù)據(jù)填充到字節(jié)輸出流中
            • writeValueAsString(obj):將對(duì)象轉(zhuǎn)為json字符串
    @Test
    public void test1() throws JsonProcessingException {
        //1.創(chuàng)建Person對(duì)象
        Person p = new Person();
        p.setName("zhangsan");
        p.setAge(23);
        p.setGender("男");
    
        //創(chuàng)建Jackson的核心對(duì)象 ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //3.轉(zhuǎn)換
        /*
    
            轉(zhuǎn)換方法:
                writeValue(參數(shù)1诀诊,obj):
                    參數(shù)1:
                        File:將obj對(duì)象轉(zhuǎn)換為JSON字符串,并保存到指定的文件中
                        Writer:將obj對(duì)象轉(zhuǎn)換為JSON字符串阅嘶,并將json數(shù)據(jù)填充到字符輸出流中
                        OutputStream:將obj對(duì)象轉(zhuǎn)換為JSON字符串属瓣,并將json數(shù)據(jù)填充到字節(jié)輸出流中
                writeValueAsString(obj):將對(duì)象轉(zhuǎn)為json字符串
    
         */
        String s = mapper.writeValueAsString(p);
        System.out.println(s);//{"name":"zhangsan","age":23,"gender":"男","birthday":null}
        //writeValue,將數(shù)據(jù)寫到d://a.txt文件中
        //mapper.writeValue(new File("d://a.txt"),p);
    
        //writeValue.將數(shù)據(jù)關(guān)聯(lián)到Writer中
        mapper.writeValue(new FileWriter("d://b.txt"),p);
    }
    
    1. 注解:

      1. @JsonIgnore:排除屬性讯柔。
      2. @JsonFormat:屬性值得格式化
        * @JsonFormat(pattern = "yyyy-MM-dd")
    2. 復(fù)雜java對(duì)象轉(zhuǎn)換
      1. List:數(shù)組
      2. Map:對(duì)象格式一致
      案例:

  • 校驗(yàn)用戶名是否存在
    1. 服務(wù)器響應(yīng)的數(shù)據(jù)抡蛙,在客戶端使用時(shí),要想當(dāng)做json數(shù)據(jù)格式使用魂迄。有兩種解決方案:
      1. $.get(type):將最后一個(gè)參數(shù)type指定為"json"
      2. 在服務(wù)器端設(shè)置MIME類型
        response.setContentType("application/json;charset=utf-8");

Servlet層

 //1.獲取用戶名
        String username = request.getParameter("username");

        //2.調(diào)用service層判斷用戶名是否存在

        //期望服務(wù)器響應(yīng)回的數(shù)據(jù)格式:{"userExsit":true,"msg":"此用戶名太受歡迎,請(qǐng)更換一個(gè)"}
        //                         {"userExsit":false,"msg":"用戶名可用"}

        //設(shè)置響應(yīng)的數(shù)據(jù)格式為json
        response.setContentType("application/json;charset=utf-8");
        Map<String,Object> map = new HashMap<String,Object>();

        if("tom".equals(username)){
            //存在
            map.put("userExsit",true);
            map.put("msg","此用戶名太受歡迎,請(qǐng)更換一個(gè)");
        }else{
            //不存在
            map.put("userExsit",false);
            map.put("msg","用戶名可用");
        }

        //將map轉(zhuǎn)為json粗截,并且傳遞給客戶端
        //將map轉(zhuǎn)為json
        ObjectMapper mapper = new ObjectMapper();
        //并且傳遞給客戶端
        mapper.writeValue(response.getWriter(),map);

js層

 //在頁(yè)面加載完成后
        $(function () {
           //給username綁定blur事件
           $("#username").blur(function () {
               //獲取username文本輸入框的值
               var username = $(this).val();
               //發(fā)送ajax請(qǐng)求
               //期望服務(wù)器響應(yīng)回的數(shù)據(jù)格式:{"userExsit":true,"msg":"此用戶名太受歡迎,請(qǐng)更換一個(gè)"}
               //                         {"userExsit":false,"msg":"用戶名可用"}
               $.get("findUserServlet",{username:username},function (data) {
                   //判斷userExsit鍵的值是否是true

                   // alert(data);
                   var span = $("#s_username");
                   if(data.userExsit){
                       //用戶名存在
                       span.css("color","red");
                       span.html(data.msg);
                   }else{
                       //用戶名不存在
                       span.css("color","green");
                       span.html(data.msg);
                   }
               });

           }); 
        });
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市捣炬,隨后出現(xiàn)的幾起案子熊昌,更是在濱河造成了極大的恐慌,老刑警劉巖湿酸,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浴捆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稿械,警方通過查閱死者的電腦和手機(jī)选泻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)美莫,“玉大人页眯,你說(shuō)我怎么就攤上這事∠岷牵” “怎么了窝撵?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)襟铭。 經(jīng)常有香客問我碌奉,道長(zhǎng)短曾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任赐劣,我火速辦了婚禮嫉拐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魁兼。我一直安慰自己婉徘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布咐汞。 她就那樣靜靜地躺著盖呼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪化撕。 梳的紋絲不亂的頭發(fā)上几晤,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音植阴,去河邊找鬼蟹瘾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛墙贱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贱傀,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惨撇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了府寒?” 一聲冷哼從身側(cè)響起魁衙,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎株搔,沒想到半個(gè)月后剖淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纤房,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年纵隔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炮姨。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捌刮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舒岸,到底是詐尸還是另有隱情绅作,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布蛾派,位于F島的核電站俄认,受9級(jí)特大地震影響个少,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眯杏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一夜焦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧役拴,春花似錦糊探、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至姜性,卻和暖如春瞪慧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背部念。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工弃酌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人儡炼。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓妓湘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乌询。 傳聞我的和親對(duì)象是個(gè)殘疾皇子榜贴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355