背景:有个增删改页面,用jquery祭出ajax异步调用接口,spring mvc响应对象是个json字符串,jquery根据响应结果判断,如果删除成功给出提示。那么问题来了,接口里响应的字符串怎么匹配页面的字符串来判断是否删除成功?
具体场景如下:
jquery文件
getCacheDate: function(cacheName, key, operationType) { var _this = this; $.ajax({ url: _this.host + "getCacheData", dataType: "json", method: "post", data: { cacheName: cacheName, key: key, operationType: operationType }, success: function(result) { $(".loading").addClass("loading-hide"); if(result == "delete success"){ _this.jsonData = {}; $(".json-renderer").trigger("DeleteDataSuccess"); }else{ _this.jsonData = result; $(".json-renderer").trigger("GetDataSuccess"); } }, error: function(err) { console.log(err); $(".loading").addClass("loading-hide"); $(".json-renderer").trigger("GetDataFailed"); } }); },
spring controller类
@RequestMapping(value = "/getCacheDate", method = RequestMethod.POST, produces = "application/json;charset=utf-8") public @ResponseBody String getCacheDate(MemcacheBeanRequest memcacheBeanRequest) { // 获取缓存操作信息 String operationType = memcacheBeanRequest.getOperationType(); String cacheName = memcacheBeanRequest.getCacheName(); String key = memcacheBeanRequest.getKey(); if (StringUtils.isEmpty(operationType) || StringUtils.isEmpty(cacheName) || StringUtils.isEmpty(key)) { return null; } // 执行缓存操作,得到结果 return memcacheViewService.doMemcached(operationType, cacheName, key); }
看到这里很明显了,我的getCacheData接口必须返回delete success这个字符串,去匹配jquery里的result字符串对象,才能提示删除成功。问题转化为Controller接口getCacheData返回什么。如果想当然的以为就返回字符串"delete success",那么很抱歉,这是不对的,因为Controller注解@ResponseBody要求我们返回的是一个json字符串,而不单单是一个纯字符串。假如getCacheData真的返回"delete success",那么页面会进入error分支,而不是success分支,因为页面无法解析该result文本:
[object Object]
memcacheview.js (208,11)
{
[functions]: ,
__proto__: { },
readyState: 4,
responseText: "delete success",
status: 200,
statusText: "parsererror"
}
到这里问题又转化为响应出去的json是什么。我们知道json是键值对格式的,所以不能单纯这样响应"{"delete success"}",这种格式一样是页面无法解析的。我们知道value肯定就是"delete success",那么key我这里选用msg,getCacheData接口返回"{"msg":"delete sucess"}",jquery判断条件改为if(result.msg == "delete sucess"),问题解决。