servlet通过xhr向js传递二进制字节数组

来源:互联网 发布:电脑网络不通怎么检查 编辑:程序博客网 时间:2024/06/05 10:57

ajax的返回值类型:

  • "xml": 返回 XML 文档,可用 jQuery 处理。
  • "html": 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
  • "script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 "cache" 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
  • "json": 返回 JSON 数据 。
  • "jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
  • "text": 返回纯文本字符串
  

二进制类型的返回值没有,经过查询资料,ajax是基于xhr1的,xhr2中可以返回arraybuffer类型,所以需要使用原生的javascript代码;



代码如下:

    xhr=new XMLHttpRequest();   


    xhr.open('get',url,true);


    xhr.responseType='arraybuffer';  


    xhr.send(); 


    xhr.onreadystatechange = function () {

     if(xhr[index].readyState === 4 && xhr[index].status === 200){

     var uInt8Array = new Uint8Array(this.response);

    }

    }


此时可以从servlet中传递字节数组到js页面。


注意这里只能选择异步方式,当选择同步方式的时候会报错,经过查询资料,xhr2的同步方式是不可以的指定 xhr.responseType,所以当需要从后台循环读取字节的时候,选择匿名函数的方式;


    var xhr = [];
    
   
    for (var index = 0; index < rows*columns; index++){


    (function (index){


    xhr[index]=new XMLHttpRequest();   


    xhr[index].open('get',url,true);

    xhr[index].responseType='arraybuffer';  


    xhr[index].send(); 


    xhr[index].onreadystatechange = function () {


           if(xhr[index].readyState === 4 && xhr[index].status === 200){

                var uInt8Array = new Uint8Array(this.response);

                 ……

                pixelArray[index] = new Int16Array(data1.buffer);

         }

    }(index);

}

此时成功将字节数组传到前台。