1

我正在尝试将一些数据发送到 servlet,然后从中取回.xls文件。为了做到这一点,我正在使用 jquery,但我遇到了一些奇怪的问题。让我解释。

以下是我如何将数据发送到 servlet 以及我应该如何取回生成的文件:

jQuery.download = function(url, data, method){
                        //url and data options required
                        if( url && data ){ 
                            //data can be string of parameters or array/object
                            data = typeof data == 'string' ? data : jQuery.param(data);
                            //split params into form inputs
                            var inputs = '';
                            jQuery.each(data.split('&'), function(){ 
                                var pair = this.split('=');
                                inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ pair[1] +'" />'; 
                            });
                            //send request
                            jQuery('<form action="'+ url +'" method="'+ (method||'post') +'">'+inputs+'</form>')
                            .appendTo('body').submit().remove();
                        };
                    };

 download = function () {     
                        var a = this.mainData();        
                        var b = JSON.stringify(a);
                        console.log(b);
                        what = "test",
                            obj = $.extend({WrJOB: "xlsExport", mainData:  b}, tJS.getCommonPostData());                        
                        var data = $.param(obj); //.replace(/\+/g, '%20'); its just a test
                        $.download('/myapp/AppProxy', data);
                     },

我的 html 中的一个按钮正在调用download向 servlet 发送一些 JSON 数据的函数。就我而言,它是var b

我很确定存在编码问题,但我不知道如何解决它。

请帮我解决这个奇怪的问题,我已经为此工作了很多小时,但找不到解决方案。

4

4 回答 4

1

看起来 servlet 正在接收为 URL 编码的它。如果您可以控制 servlet 上的代码,您也许可以在 servlet 端对其进行解码。

例如,在 PHP 中,使用 urldecode()

希望这可以帮助。

于 2013-07-03T07:09:17.317 回答
1

像这样

$.extend({URLEncode:function(c){var o='';var x=0;c=c.toString();var r=/(^[a-zA-Z0-9_.]*)/;while(x<c.length){var m=r.exec(c.substr(x));  if(m!=null && m.length>1 && m[1]!=''){o+=m[1];x+=m[1].length;  }else{if(c[x]==' ')o+='+';else{var d=c.charCodeAt(x);var h=d.toString(16);  o+='%'+(h.length<2?'0':'')+h.toUpperCase();}x++;}}return o;},URLDecode:function(s){var o=s;var binVal,t;var r=/(%[^%]{2})/;while((m=r.exec(o))!=null && m.length>1 && m[1]!=''){b=parseInt(m[1].substr(1),16);t=String.fromCharCode(b);o=o.replace(m[1],t);}return o;}});

jQuery.each(data.split('&'), function(){
   var pair = this.split('=');
   inputs+='<input type="hidden" name="'+ pair[0] +'" value="'+ jQuery.URLDecode(pair[1]) +'" />';         
});
于 2013-07-03T07:15:37.577 回答
1

您应该在某个时候取消转义输出。我建议在 servlet 方面进行。

于 2013-07-03T07:06:22.043 回答
1

问题是您对数据进行了两次 urlencode。首先在您的javascript中显式,然后在创建表单时隐式。浏览器会对您“友好”,并在执行请求之前对输入参数进行 urlencode。

在将参数添加为输入值之前对参数进行解码,或者更改构建数据的方式以避免显式编码。

于 2013-07-03T07:26:56.117 回答