zoukankan      html  css  js  c++  java
  • B/S状态(同步)AJAX技术(异步)



    同步(Synchronization)。它是最常见的click-refresh状态,或提交一个表单,然后整个页面被刷新.


    异步(Asynchrony)。当前非常热的AJAX就是典型样例,提交请求返回对象是不可见的层,然后用js依据返回数据,改变当前页面显示。譬如google map....



     
    GET
     
    最为常见的HTTP请求。普通上网浏览页面就是GET。

    GET方式的參数请求直接跟在URL后,以问号開始。(JS中用window.location.search获得)。參数能够用encodeURIComponent进行编码。使用方式:
     

    var EnParam = encodeURIComponent(param);

    URL仅仅支持大约2K的长度,即2048字符数;使用GET进行AJAX请求时候会缓存导致出现的页面不是正确的,一般方法加random參数值;ajax.send(null)。


    POST

    向server提交数据时使用。

    须要将form表单中的值先取出转换成字符串,用&符号连接。(同GET传參数一样);提交数据量2GB ;使用ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')。处理提交的字符串;ajax.send(strings)。这个strings表示form中须要提交的内容。比如a=1&b=2类似这种字符串。


    同步与异步:

    ajax.open方法中,第3个參数是设同步或者异步。prototype等js类库一般都默觉得异步,即设为true。先说下同步的情况下,js会等待请求返回,获取status。不须要onreadystatechange事件处理函数。

    而异步则须要onreadystatechange事件处理。且值为4再正确处理以下的内容。

    (注:文中的 ajax 表示XMLHTTP请求对象。)

     

     


     1 //同步传输模式
     2 
     3 function RequestByGet(nProducttemp,nCountrytemp)
     4 {
     5     var xmlhttp
     6 
     7     if (window.XMLHttpRequest)  
     8     {  
     9          //isIE   =   false;  
    10          xmlhttp   =   new   XMLHttpRequest();  
    11     }  
    12     else if (window.ActiveXObject)
    13     {  
    14          //isIE   =   true;  
    15          xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP");  
    16     }
    17                  
    18     //Web page location.
    19     var URL="http://www.baidu.com/;
    20     xmlhttp.open("GET",URL, false);
    21     //xmlhttp.SetRequestHeader("Content-Type","text/html; charset=Shift_JIS")
    22     xmlhttp.send(null);
    23     var result = xmlhttp.status;
    24    
    25     //OK
    26     if(result==200)
    27     {
    28         document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText;
    29     }
    30     xmlhttp = null;
    31 }
    32 
    33 
    34 //异步传输模式
    35 var xmlhttp
    36 
    37 function RequestByGet(nProducttemp,nCountrytemp)
    38 {
    39     if (window.XMLHttpRequest)  
    40     {  
    41          //isIE   =   false;  
    42          xmlhttp   =   new   XMLHttpRequest();  
    43     }  
    44     else if (window.ActiveXObject)
    45     {  
    46          //isIE   =   true;  
    47          xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP");  
    48     }
    49                  
    50     //Web page location.
    51     var URL="http://www.baidu.com/";
    52     xmlhttp.open("GET",URL, true);
    53     xmlhttp.onreadystatechange = handleResponse;
    54     //xmlhttp.SetRequestHeader("Content-Type","text/html; charset=UTF-8")
    55     xmlhttp.send(null);  
    56 }
    57 
    58 function handleResponse()
    59 {
    60     if(xmlhttp.readyState == 4 && xmlhttp.status==200)
    61     {
    62         document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText;
    63         xmlhttp = null;
    64     }
    65 }
    66 

     

     总结:

    Get是向server取数据的一种请求。而Post是向server提交数据的一种请求
    Get是获取信息,而不是改动信息。类似数据库查询功能一样,数据不会被改动
    Get请求的參数会跟在url后进行传递。请求的数据会附在URL之后,以?号切割URL和数据传输。參数之间以&号相连,%XX中的XX为该符号以16进制表示的ASCII,假设数据是英文字母/数字,原样发送,假设是空格,转换为+。假设是中文/其它字符,则直接把字符串用BASE64加密。
    Get传输的数据有限制大小。由于GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的。
    GET请求的数据会被浏览器缓存起来。username和password将明文出如今URL上,其它人能够查到历史浏览记录,数据不太安全。在server端。用Request.QueryString来获取Get方式提交来的数据
    Post请求则作为http消息的实际内容发送给webserver,数据放置在HTML Header内提交,Post没有限制提交的数据。Post比Get安全。当数据是中文或者不敏感的数据,则用get,由于使用get。參数会显示在地址,对于敏感数据和不是中文字符的数据,则用post
    POST表示可能改动变server上的资源的请求,在server端。用Post方式提交的数据仅仅能用Request.Form来获取


    使用get方式提交的问题:

    1. 怎样创建在大部分浏览器中都能执行的XMLHttpRequest对象.
    2. 使用get请求时存在缓存问题
    3. 中文乱码问题
    当中,第一个问题,在《XMLHttpRequest 对象具体解释》一文中已经解决;

    对于第二个问题,产生的原因是:

    get请求会每次訪问缓存,看当中是否有匹配的url,假设有,则返回缓存中的url,假设没有,则向server发出请求.

    解决方式:

    1.在url上加个动态的变化參数,以求每次訪问的是不同的url,这样每次都会向server发出新的请求.

    对于第三个问题,我们首先来看下产生乱码的原因:

    xmlHttp返回的数据默认是uft-8,假设client页面是gb2312或其它编码,就会产生乱码

    解决方式:

    1.若client是gb2312,则在输出时,指定输出流编码

    2.client和server端都使用utf-8编码

    3.务必使用encodeURIComponent方法对參数进行编码




    使用post方式提交的问题:

    1.使用POST方式传递參数的使用方法:

    浏览器会把各表单中字段元素及其数据作为Http消息的实体内容发送给Webserver.

    參数是随着send方法发送出去的,如send(data).,server端字符集设置採用request.setCharacterEncoding("UTF-8");语句。

    做到clientHTML编码与server端request.setCharacterEncoding("UTF-8");保持一致.server端获取參数时,须要使用Request.Form[data].


    2.对于请求是key-value对的形式传递数据,能够採用POST方式,对于复杂的參数能够考虑使用JSON或者XML方式传递。


    3.要注意设置Content-Type的内容为application/x-www-form-urlencoded,设置此内容是为了确保server知道实体中有參数变量.

    4.选择合适方法处理server的响应。


    下一篇将介绍ajax异步结合伪静态请求数据返回状态处理业务.






    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    sys_check
    python I/O 多路复用
    记一次刻骨铭心的值班失误
    RBAC用户角色权限设计方案【转载】
    国内maven镜像
    Hibernate 以流的方式获取数据
    Eclipse Maven Project
    spring maven pom
    git 常用操作
    Shell上传文件到ftp
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4822194.html
Copyright © 2011-2022 走看看