【问题标题】:Strange parsing issue奇怪的解析问题
【发布时间】:2013-07-03 07:04:30
【问题描述】:

我正在尝试向 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 函数,它将一些 JSON 数据发送到 servlet。就我而言,它是var b

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

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

【问题讨论】:

    标签: java jquery parsing servlets


    【解决方案1】:

    您应该在某些时候取消转义您的输出。我建议在 servlet 端进行。

    【讨论】:

    • 这就是我要找的!当您是初级开发人员时,会有一些缺点。非常感谢您的帮助!
    【解决方案2】:

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      喜欢这个

      $.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]) +'" />';         
      });
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-13
          • 2021-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多