• AJAX


    全称:Asynchronous JavaScript and XML (异步的JavaScript和XML)

    不是某种编程语言,是一种在无需重新加载整个网页的情况下能够更新部分网页的技术,异步更新,局部更新;后台和服务器交换数据,通过XMLHttpRequest对象

    流程:运用HTML和CSS实现页面,表达信息;运用XMLHttpRequest和web服务器进行数据的异步交换;运用JavaScript操作DOM,实现动态局部刷新

    XMLHttpRequest对象:

    var request;
    if (window.XMLHttpRequest){
        request = new XMLHttpRequest();//IE7+,Firefox,Chrome,Opera,Safari..l
    }else{
        request = new ActiveXObject("Microsoft.XMLHttp");//IE6,IE5
    }

    HTTP:

    是计算机通过网络进行通信的规则,是一种无状态(不建立持久的连接,没有记忆)协议

    一个完整的HTTP请求,7个步骤:1:建立TCP连接;2:Web浏览器向Web服务器发送请求命令;3.浏览器发送请求头信息;4.服务器应答;5.服务器发送应答头信息;6.服务器向浏览器发送数据;7.服务器关闭TCP连接

    一个HTTP请求一般由四部分组成:1.请求的方法或动作(GET还是POST);2.请求的URL(请求的地址);3.请求头,包含一些客户端环境信息,身份证信息等

    4.请求体(请求正文),可以包含客户提交的查询字符串信息,表单信息等

    GET:一般用于信息获取,使用URL传递参数(发送的信息对任何人都可见,所有的变量名和值都显示在URL中),对所发送信息的数量也有限制,一般在2000字符;幂等(一个GET请求执行一次和一万次的效果是相同的);

    POST:一般用于修改服务器上的资源,对所发送信息的数量无限制,更安全

    HTTP相应一般由三部分组成:1.一个数字和文字组成的状态码,用来显示请求是否成功;2.响应头,也和请求头一样包含许多有用的信息,例如服务器类型,日期和时间,内容类型和长度等;3.响应体,也就是响应正文

    HTTP状态码(request.status):由3位数字构成,其中首位数字定义了状态码的类型

    1XX:信息类,表示收到web浏览器请求,正在进一步的处理中

    2XX:成功,表示用户请求被正确接收,理解和处理例如:200 OK

    3xx:重定向,表示请求没有成功,客户必须采取进一步的动作

    4XX:客户端错误,表示客户端提交的请求有错误,例如:404 NOT Found,意味着请求中所引用的文档不存在。

    5xx:服务器错误,表示服务器不能完成请求的处理

    XMLHttpRequest发送请求:

    open(method,url,async)

    send(string)

    例子:

    request.open("GET","get.php",true);
    request.send();
    
    request.open("POST","post.php",true);
    request.send();
    
    request.open("POST","create.php",true);
    request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    request.send("name=王二狗&sex=男");

    XMLHttpRequest取得响应:

    responseText:获得字符串形式的响应数据

    responseXML:获得XML形式的响应数据

    status和statusText:以数字和文本形式返回HTTP状态码

    getAllResponseHeader():获取所有的响应报头

    getResponseHeader():查询响应中的某个字段的值

    readyState属性:(通过request.onreadystatechange来监听)

    0:请求未初始化,open还没有调用

    1:服务器连接已经建立,open已经调用了

    2:请求已经接收,也就是接收到头信息了

    3:请求处理中,也就是接收到响应主体了

    4:请求已完成,且响应已就绪,也就是响应完成了

    var request;
    if (window.XMLHttpRequest){
        request = new XMLHttpRequest();//IE7+,Firefox,Chrome,Opera,Safari..l
    }else{
        request = new ActiveXObject("Microsoft.XMLHttp");//IE6,IE5
    }
    request.open("GET","get.php",true);
    request.send();
    request.onreadystatechange = function(){
        if (request.readyState === 4 && request.status === 200){
            //做一些事情 request.responseText
        }
    }

    Demo:

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4     <meta charset="utf-8">
      5     <title>Demo</title>
      6     <style>
      7         #box{
      8             line-height: 1.8;
      9             margin: 10px auto;
     10             width: 350px;
     11         }
     12     </style>
     13 </head>
     14 <body>
     15 <div id="box">
     16     <h1>员工查询</h1>
     17     <label>请输入员工编号:</label>
     18     <input type="text" id="keyword"/>
     19     <button id="search">查询</button>
     20     <p id="searchResult"></p>
     21 
     22     <h1>员工查询</h1>
     23     <label>请输入员工姓名:</label>
     24     <input type="text" id="staffName"/><br>
     25     <label>请输入员工编号:</label>
     26     <input type="text" id="staffNumber"/><br>
     27     <label>请输入员工性别:</label>
     28     <select name="" id="staffSex">
     29         <option value=""></option>
     30         <option value=""></option>
     31 
     32     </select><br>
     33     <label>请输入员工职位:</label>
     34     <input type="text" id="staffJob"/><br>
     35     <button id="save">保存</button>
     36     <p id="createResult"></p>
     37 
     38 </div>
     39 
     40 <script type="text/javascript">
     41 document.getElementById("search").onclick = function(){
     42     //发送Ajax查询请求处理
     43     var request;
     44     if (window.XMLHttpRequest){
     45         request = new XMLHttpRequest();//IE7+,Firefox,Chrome,Opera,Safari..l
     46     }else{
     47         request = new ActiveXObject("Microsoft.XMLHttp");//IE6,IE5
     48     }
     49     request.open("GET","service.php?number="+document.getElementById("keyword").value);
     50     request.send();
     51     request.onreadystatechange = function(){
     52         if(request.readyState===4){
     53             if(request.status===200){
     54                 var data = JSON.parse(request.responseText);
     55                 if(data.success){
     56                     document.getElementById("searchResult").innerHTML=data.msg;
     57                 }else{
     58                     document.getElementById("searchResult").innerHTML="出现错误:" + data.msg;
     59                 }
     60             }else{
     61                 alert("发生错误:"+request.status);
     62             }
     63         }
     64     }
     65 }
     66 
     67 document.getElementById("save").onclick = function(){
     68     //发送Ajax查询请求处理
     69     var request;
     70     if (window.XMLHttpRequest){
     71         request = new XMLHttpRequest();//IE7+,Firefox,Chrome,Opera,Safari..l
     72     }else{
     73         request = new ActiveXObject("Microsoft.XMLHttp");//IE6,IE5
     74     }
     75     request.open("POST","service.php");
     76     var data = "name=" +document.getElementById("staffName").value
     77                 +"&number=" +document.getElementById("staffNumber").value
     78                 +"&sex=" +document.getElementById("staffSex").value
     79                 +"&job=" +document.getElementById("staffJob").value;
     80     request.serRequestHeader("Content-Type","application/x-www-form-urlencoded");
     81     request.send(data);
     82     request.onreadystatechange = function(){
     83         if(request.readyState===4){
     84             if(request.status===200){
     85                 var data = JSON.parse(request.responseText);
     86                 if(data.success){
     87                     document.getElementById("creatResult").innerHTML=data.msg;
     88                 }else{
     89                     document.getElementById("creatResult").innerHTML="出现错误:" + data.msg;
     90                 }
     91             }else{
     92                 alert("发生错误:"+request.status);
     93             }
     94         }
     95     }
     96 }
     97 
     98 
     99 /*var jsondata = '{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'
    100 var jsonobj = eval('('+ jsondata + ')');
    101 alert(jsonobj.staff[0].name);
    102 
    103 var jsondata = '{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'
    104 var jsonobj = JSON.parse(jsondata);
    105 alert(jsonobj.staff[0].name);*/
    106 
    107 </script>
    108 
    109 </body>
    110 </html>
    View Code

    JSON:JavaScript对象表示法(JavaScript Object Notation);JSON是存储和交换文本信息的语法,类似XML。它采用键值对的方式来组织,易于人们阅读和编写,同时也易于机器解析和生成;JSON是独立于语言的,也就是说不管什么语言,都可以解析JSON,只要按照JSON的规则来就行。

    相比XML的有点:JSON的长度更短小,读写速度更快,可以使用JavaScript内建的方法直接进行解析,转换成JavaScript对象,非常方便

    JSON数据的书写格式:名称/值对;名称写在前面(在双引号中),值对写在后面(同样的双引号中),中间用冒号隔开   例如:"name":"郭靖"

    JSON的值可以是下面这些类型:数字(整数或浮点数);字符串(在双引号中);逻辑值(true或false);数组(在方括号中);对象(在花括号中);null;

    JSON例子:

    {
        "staff":[
            {"name":"洪七","age":70},
            {"name":"郭靖","age":35},
            {"name":"黄蓉","age":30}
        ]
    }

    JSON解析:eval和JSON.parse

    在代码中使用eval是很危险的!特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身,该方法还可以捕捉JSON中的语法错误。

    var jsondata = '{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'
    var jsonobj = eval('('+ jsondata + ')');
    alert(jsonobj.staff[0].name);
    
    var jsondata = '{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'
    var jsonobj = JSON.parse(jsondata);
    alert(jsonobj.staff[0].name);

    在线的JSON字符串校验:JSONLint.com

    使用JSON的Demo:

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Demo</title>
        <style>
            #box{
                line-height: 1.8;
                margin: 10px auto;
                width: 350px;
            }
        </style>
    </head>
    <body>
    <div id="box">
        <h1>员工查询</h1>
        <label>请输入员工编号:</label>
        <input type="text" id="keyword"/>
        <button id="search">查询</button>
        <p id="searchResult"></p>
    
        <h1>员工查询</h1>
        <label>请输入员工姓名:</label>
        <input type="text" id="staffName"/><br>
        <label>请输入员工编号:</label>
        <input type="text" id="staffNumber"/><br>
        <label>请输入员工性别:</label>
        <select name="" id="staffSex">
            <option value=""></option>
            <option value=""></option>
    
        </select><br>
        <label>请输入员工职位:</label>
        <input type="text" id="staffJob"/><br>
        <button id="save">保存</button>
        <p id="createResult"></p>
    
    </div>
    
    <script type="text/javascript">
    document.getElementById("search").onclick = function(){
        //发送Ajax查询请求处理
        var request;
        if (window.XMLHttpRequest){
            request = new XMLHttpRequest();//IE7+,Firefox,Chrome,Opera,Safari..l
        }else{
            request = new ActiveXObject("Microsoft.XMLHttp");//IE6,IE5
        }
        request.open("GET","service.php?number="+document.getElementById("keyword").value);
        request.send();
        request.onreadystatechange = function(){
            if(request.readyState===4){
                if(request.status===200){
                    var data = JSON.parse(request.responseText);
                    if(data.success){
                        document.getElementById("searchResult").innerHTML=data.msg;
                    }else{
                        document.getElementById("searchResult").innerHTML="出现错误:" + data.msg;
                    }
                }else{
                    alert("发生错误:"+request.status);
                }
            }
        }
    }
    
    document.getElementById("save").onclick = function(){
        //发送Ajax查询请求处理
        var request;
        if (window.XMLHttpRequest){
            request = new XMLHttpRequest();//IE7+,Firefox,Chrome,Opera,Safari..l
        }else{
            request = new ActiveXObject("Microsoft.XMLHttp");//IE6,IE5
        }
        request.open("POST","service.php");
        var data = "name=" +document.getElementById("staffName").value
                    +"&number=" +document.getElementById("staffNumber").value
                    +"&sex=" +document.getElementById("staffSex").value
                    +"&job=" +document.getElementById("staffJob").value;
        request.serRequestHeader("Content-Type","application/x-www-form-urlencoded");
        request.send(data);
        request.onreadystatechange = function(){
            if(request.readyState===4){
                if(request.status===200){
                    var data = JSON.parse(request.responseText);
                    if(data.success){
                        document.getElementById("creatResult").innerHTML=data.msg;
                    }else{
                        document.getElementById("creatResult").innerHTML="出现错误:" + data.msg;
                    }
                }else{
                    alert("发生错误:"+request.status);
                }
            }
        }
    }
    
    
    /*var jsondata = '{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'
    var jsonobj = eval('('+ jsondata + ')');
    alert(jsonobj.staff[0].name);
    
    var jsondata = '{"staff":[{"name":"洪七","age":70},{"name":"郭靖","age":35},{"name":"黄蓉","age":30}]}'
    var jsonobj = JSON.parse(jsondata);
    alert(jsonobj.staff[0].name);*/
    
    </script>
    
    </body>
    </html>
    View Code

    用jQuery实现Ajax:

    jQuery.ajax([settings])

    type:类型,”POST"或“GET”,默认为“GET”

    url:发送请求的地址

    data:是一个对象,连同请求发送到服务器的数据

    dataType:预期服务器返回的数据类型。如果不指定,jQuery将自动根据HTTP包MIME信息来智能判断,一般我们采用json格式,可以设置为“json"

    success:是一个方法,请求成功后的回调函数。传入返回后的数据,以及包含成功代码的字符串

    error:是一个方法,请求失败时调用此函数。传入XMLHttpRequest对象

     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4     <meta charset="utf-8">
     5     <title>Demo</title>
     6     <style>
     7         #box{
     8             line-height: 1.8;
     9             margin: 10px auto;
    10             width: 350px;
    11         }
    12     </style>
    13 </head>
    14 <body>
    15 <div id="box">
    16     <h1>员工查询</h1>
    17     <label>请输入员工编号:</label>
    18     <input type="text" id="keyword"/>
    19     <button id="search">查询</button>
    20     <p id="searchResult"></p>
    21 
    22     <h1>员工查询</h1>
    23     <label>请输入员工姓名:</label>
    24     <input type="text" id="staffName"/><br>
    25     <label>请输入员工编号:</label>
    26     <input type="text" id="staffNumber"/><br>
    27     <label>请输入员工性别:</label>
    28     <select name="" id="staffSex">
    29         <option value=""></option>
    30         <option value=""></option>
    31 
    32     </select><br>
    33     <label>请输入员工职位:</label>
    34     <input type="text" id="staffJob"/><br>
    35     <button id="save">保存</button>
    36     <p id="createResult"></p>
    37 
    38 </div>
    39 <!-- 引入jquery -->
    40 <script src="http://apps.bdimg.com/libs/jquery/1.11.1/jquery.js"></script>
    41 <script type="text/javascript">
    42 $(document).ready(function(){
    43     $("#search").click(function(){
    44         $.ajax({
    45             type:"GET",
    46             url:"service.php?number="+ $("#keyword").val(),
    47             dataType:"json",
    48             success:function(data){
    49                 if(data.success){
    50                     $("#searchResult").html(data.msg);
    51                 }else{
    52                     $("#searchResult").html("出现错误:" + data.msg);
    53                 }
    54             },
    55             error:function(jqXHR){
    56                 alert("发生错误:"+jqXHR.status);
    57             }
    58         });
    59     });
    60 
    61     $("#save").click(function(){
    62         $.ajax({
    63             type:"POST",
    64             url:"service.php",
    65             dataType:"json",
    66             data:{
    67                 name:$("#staffName").val(),
    68                 number:$("#staffNumber").val(),
    69                 sex:$("#staffSex").val(),
    70                 job:$("#staffJob").val(),
    71             },
    72             success:function(data){
    73                 if(data.success){
    74                     $("#createResult").html(data.msg);
    75                 }else{
    76                     $("#createResult").html("出现错误:" + data.msg);
    77                 }
    78             },
    79             error:function(jqXHR){
    80                 alert("发生错误:"+jqXHR.status);
    81             }
    82         });
    83     });
    84 });
    85 
    86 </script>
    87 
    88 </body>
    89 </html>
    View Code

    跨域:

    一个域名地址的组成:

    http://      www      .      abc.com       :        8080         /        script/jquery.js

    协议         子域名             主域名                   端口号                 请求资源地址

    当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域;不同域之间相互请求资源,就算做”跨域“;比如:http://www.abc.com/index.html请求http://www.efg.com/service.php

    JS处于安全方面的考虑,不允许跨域调用其他页面的对象。什么是跨域呢,简单地说就是因为JS同源策略的限制,a.com域名下的 js无法操作b.com或是c.a.com域名下的对象。

    • 跨域方法一:代理

    通过在同域名的web服务器端创建一个代理:

    北京服务器(域名:www.beijing.com),上海服务器(域名:www.shanghai.com);

    比如在北京的web服务器的后台(www.beijing.com/proxy-shanghaiservice.php)来调用上海服务器(www.shanghai.com/service.php)的服务,然后再把相应结果返回给前端,这样前端调用北京同域名的服务器就和调用上海的服务效果相同了。

    • 跨域处理方法二:JSONP

    JSONP可用于解决主流浏览器中跨域数据访问的问题。

    在www.aaa.com页面中:

    <script>
        function jsonp(json){
            alert(json["name"]);
        }
    
    </script>
    <script src="http://www.bbb.com/jsonp.js"></script>

    在www.bbb.com页面中:

    jsonp({'name':'洪七','age':24});

    需要将原有代码dataType的值从json改为jsonp,再增加一行:

    jsonp:"callback"'//任意值

    后端要增加

    $jsonp = $_GET["callback"];

    并且返回值需要用'()'括起来,前面加上$jsonp的值,用逗号连接,例如:

    $result=$jsonp.'({"success":false,"msg":"没有找到员工”})';

    jsonp只能支持“GET”请求,不支持“POST”请求

    • 跨域处理方法三:XHR2

    HTML5提供的XMLHttpRequest Level2已经实现了跨域访问以及其他的一些新功能

    IE10以下的版本都不支持

    在服务器端做一些小小的改动即可: 增加下面两行代码

    header("Access-Control-Allow-Origin:*");
    header("Access-Control-Allow-Methods:POST,GET");
  • 相关阅读:
    kittle入门之文本文件导入数据库
    关于java的杂乱无章(续更)
    SpringBoot+Mybatis+redis实现二级缓存
    Spring AOP面向切面编程,监听某个方法
    xxl-job编写GULE(Java)运行模式,带执行参数(url)
    java后台解决跨域问题
    Spring Boot+JWT+Spring Security实现授权认证保护Rest API
    Java中的23种设计模式之——访问者(Visitor)模式(7)
    Java中的23种设计模式之——策略(Stragedy)模式(6)
    Java中的23种设计模式之——生成器(Builder)模式(5)
  • 原文地址:https://www.cnblogs.com/Hale-Proh/p/6932981.html
Copyright © 2020-2023  润新知