笔者对于前台和controller交互数据,即http请求数据格式有疑惑,先做如下总结笔记:
附带fiddle工具使用方法,来测试http请求接口
ajax传json数据格式
var json = { "ids": 123,"displayFlag": 1,"etnId": 456}; var request = $.ajax({ url: url,type: "POST",async: false,data: JSON.stringify(json),dataType: "json",contentType: "application/json; charset=utf-8",cache: false,success: function (r,textStatus) { query("dg",null);//刷新datagrid },error: function (XMLHttpRequest,textStatus,errorThrown) { alert(XMLHttpRequest.readyState); } });最关键的:
@1.JSON.stringify(json) 定义的json 是个字符串,需要首先调用js的stringify转为json string
@2.contentType: "application/json; charset=utf-8",值得是数据以json的格式进行传输,
默认是contentType: "application/x-www-form-urlencoded; charset=utf-8"
我的理解这种传输的是字符串
VcUpdateCommentVo.java
public class VcUpdateCommentVo { private String ids; private boolean displayFlag; private String etnId; public String getIds() { return ids; } public void setIds(String ids) { this.ids = ids; } public boolean isDisplayFlag() { return displayFlag; } public void setDisplayFlag(boolean displayFlag) { this.displayFlag = displayFlag; } public String getEtnId() { return etnId; } public void setEtnId(String etnId) { this.etnId = etnId; } }定义一个request bean供controller中使用,ids、displayFlag、etnId对应着请求ajax请求中的json
控制器中获取ajax请求参数
@RequestMapping("/batchUpdateCommentStatus") @ResponseBody public int batchUpdateCommentStatus(@RequestBody VcUpdateCommentVo vcUpdateCommentVo){ return 0; }@1.@RequestBody ,一句话就是此spring注解会识别context-type中application/json,解析前台json绑定到 VcUpdateCommentVo上
结果展现
通过fiddle观察http请求:
字符串传参方式
_json = { "ids": 123456,"etnId": 789}; var request = $.ajax({ url: url,data: _json,contentType: "application/x-www-form-urlencoded; charset=utf-8",errorThrown) { alert(XMLHttpRequest.readyState); } });@1.contentType: "application/x-www-form-urlencoded; charset=utf-8",指定contentType为 字符串传值类型,contentType不配置时候,也是此默认值,并且data:_json会配合contentType把所谓的JSON格式转成下面这种请求数据格式。
ids=123456&displayFlag=1&etnId=789
参考:http://tool.oschina.net/apidocs/apidoc?api=jquery
为验证,从fiddle中搂取http请求。
被ajax转成浏览器请求的格式了, 即 ?param1=xx¶m2=xx
@RequestMapping("/batchUpdateCommentStatus") @ResponseBody public int batchUpdateCommentStatus( @RequestParam(value = "ids",required = true)String ids,@RequestParam(value = "displayFlag",required = true)boolean displayFlag,@RequestParam(value = "etnId",required = true)String etnId){ String hideUserName = getCurrentUsername(); int updateRows = vcCarWashCommentService.batchUpdateCommentStatus(ids,displayFlag,hideUserName,etnId); logger.info("批量更新用户评论信息从session获取的用户名为:" + hideUserName + "成功更新条数为:" + updateRows); return updateRows; }@1.这里使用@RequestParam获取每一个入参对象
总结:
前台:ajax中指定contentType告诉http的接收方我送什么格式数据给你,我可以送字符串,送对象(包含json,xml格式对象)
后台:对于普通的字符串参数,使用@RequestParam获取参数即可,其他的均要使用@RequestBody对Object入参进行解析,绑定