`

ajax请求遇到的一些乱码问题及其解决

阅读更多

 

   1. 在一个系统中的表单数据项很多的编辑页面的保存菜单,经常出现点击后反映迟钝的问题,经过是由于表单中获取的参数很多,由于用 post 请求方式传参之前要对表单中获取到的参数进行条件判断,然后对每个参数用 encodeURIComponent(“…”) 进行 utf-8 编码,在后台用 URLDecoder(“…”,”utf-8”) 进行解码,然后进行相应逻辑处理。这种方式由于参数很多,会进行很多次的调用函数进行编码解码动作,造成有时点击按钮时反应慢。

     之前的处理方式:

 

function doSaveItem(){
	 var riskLevel=encodeURIComponent($("#riskLevelId").val());
	 var riskDespritionTemp=$("#riskDescriptionId").val();
	 if(riskDespritionTemp.length>1000){
	 alert("风险长度小于1000字,请重新填写!");
	 return;
	 }
	 
	 var clientAnswer=encodeURIComponent(clientAnswerTemp);
	 
	 var relationKeyWords=encodeURIComponent($("#relationKeyWordsId").val());
	 。。。。
	
	 var viewZoomConfigStr="";
	   $("input[type='checkbox']:checkbox:checked").each(function(){ 
	   viewZoomConfigStr+=$(this).val()+"#";
        }); 
	   $ .post('/executeSaveOperate.action?token='+Math.random()*10000000,
	   {'riskId':riskId,'arkUser':arkUser,'riskLevel':riskLevel,'riskDesprition':riskDesprition。。。},
	   function(data){	 
	   alert(data);
	   if(data=="保存成功!"){
	   window.location.href="/casedetails.action?riskId="+riskId;
	   }
    	});	

	}

 

 

改进后:在前端对获取到的表单参数放入到临时定义的一个 json 对象 jsonrpcRequestObject 中,然后通过:

var d={};

d["jsonrpcContent"]=encodeURIComponent(JSON.stringify(jsonrpcRequestObject)+"&rnd"+Math.random());

把所有的请求的表单参数数据放入一个 json 对象中,并进行统一的 utf-8 编码。

在后台用:

String json = request.getParameter("jsonrpcContent");

   json = URLDecoder.decode(json, "utf-8");

String json =request.getParameter( "jsonrpcContent" );

      json=URLDecoder.decode (json, "utf-8" );

然后利用: Map<String, Object> node = tools.Json.toObject(json, HashMap.class); 一次性转换出所有的请求参数到一个 map 结构中,这样获取到这些值就很容易了。

 

2. 在这其中遇到两个问题, 1. 在后台获取到 json 数据时,开始用 ObjectMapper 工具类中的 readValue(json, JsonNode.class); 转换成 JsonNode 格式,然后利用 JsonNode get (“ .. ”)方法得到具体的 field 值,但是他跟 map 的不同是他在键值对中都多了一个双引号:如下

String 变量 json 的值是: {"riskId":"743","arkUser":" 余墨 ","riskLevel":"1111" (。。。省略) }&rnd0.7098155175198152

通过 Map<String,Object> node=tools.Json.toObject(json, HashMap.class); 进行 map 对象的还原时没有问题: node 的值是:

{ riskLevel=1111 arkUser= 余墨 , riskId=743 }

 

但是通过: private static final ObjectMapper jsonMapper;

   static {

      jsonMapper = Json.getObjectMapper();

   }

JsonNode node=jsonMapper.readValue(json, JsonNode.class);

  转换后的 node 的值:

{"riskId":"743","arkUser":" 余墨 ","riskLevel":"1111"}

这样在通过 node.get(“…”) 方法获取到具体的参数值时会出现多余的引号,也就是本想通过 node.get("riskId").toString() 得到值 743 ,但是现在却得到了 ”743”, 如果每个得到的这种参数值都通过 ”743”.repalceAll(“\””,””) 方式进行转换时会出现性能和业务上的隐患,毕竟可能通过表单传递的参数可能就有文本 ”” 引号信息。后来当然是通过前面的 Json 的工具类转换成 map 的方式。

     2. ajax 请求中:

  $ .ajax({

          type : "post",

          url : "executeSaveOperate.action",

          dataType : "text",

          data : d,

          success : function(response){

          if(response=="success"){

          alert(" 保存成功! ");

          window.location.href="/casedetails.action?riskId="+riskId;

          }

          },

          error : function(response){

          alert(" 保存失败! ");

          }

      

       });

 

有个属性值 dataType 开始误解为是传递的 post 数据的格式,结果开始写成是 dataType=”json”, 这样在后台处理后能正常通过 response write ()正确的数据到前端,但是就不执行 success 函数,通过 error(jqXHR, textStatus, errorThrown) 函数打出日志, @ 夏雷定位是接受参数的格式问题,也就是 dataType 是用来表示 ajax 请求后的所期望的服务器返回数据的格式限定,如果没有明确指定, Jquery 会根据 response 流返回的 MIME 类型进行指定,常见的类型有: ”xml”,”html”,”srript”,”json”,”jsonp” 等。由于这里场景是根据返回的数据是否为“ success ”给出提示信息,因此只要用 dataType ”text” 就可以了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics