有段時間沒做過javaweb了,有點生疏了,js也忘記得差不多,所以今天下午做前后端交互的時候,傳到后台的參數總是為空,前端控制台了報一個String parameter “xxx” is not present的錯誤。
貼一下代碼
前端代碼
$.ajax({
type: 'GET',
url: '/weibo/list',
cache: 'false',
data: {
"startdt": formData['startdt'],
"enddt": formData['enddt'],
"provinceName": formData['provinceName']
},
dataType: 'json',
//contentType : 'application/x-www-form-urlencoded;charset=UTF-8',
headers : {
'Content-Type' : 'application/json;charset=utf-8'
},
success: function (result) {...}
后端代碼
@RequestMapping("/list")
@ResponseBody
public List<Object> getWeiboAndCellList(@RequestParam("startdt") String date1, @RequestParam("enddt") String date2, @RequestParam("provinceName") String province) {...}
之前出錯是因為我沒有加@RequestParam注解,它的作用等同於HttpServletRequest request,request.getParameter("")。但是這里有個細節,如果Content-Type設置為“application/x-www-form-urlencoded;charset=UTF-8”無論是POST請求還是GET請求都是可以通過這種方式成功獲取參數,但是如果設置為“application/json;charset=utf-8”,會報上述錯誤。ajax傳JSON時設置的contenttype 如果是application/json或者text/json時,JAVA中request.getParameter("")怎么也接收不到數據。這是因為,Tomcat的HttpServletRequest類的實現類為org.apache.catalina.connector.Request(實際上是org.apache.coyote.Request)。
當$.ajax content-Type是json時,可以用@RequestBody這個注解來解決。
前端代碼 var obj ={};
obj["user"] = JSON.stringify(this.update); obj["classRoomId"] = this.classRoomid; $.ajax({ type: 'POST', url: url, dataType: 'json', cache: false, headers : { 'Content-Type' : 'application/json;charset=utf-8' }, data: JSON.stringify(obj), success: function (result) {...}
}); 后端代碼 @RequestMapping("/updateUser") @ResponseBody public User updateUser(@RequestBody Map<String, Object> map){...}
原因:@RequestParam 底層是通過request.getParameter方式獲得參數的,也就是說,@RequestParam 和request.getParameter是同一回事。因為使用request.getParameter()方式獲取參數,可以處理get 方式中queryString的值,也可以處理post方式中 body data的值,所以,@RequestParam可以處理get 方式中queryString的值,也可以處理post方式中 body data的值。@RequestParam用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST。
@RequestBody接受的是一個json對象的字符串,而不是Json對象,在ajax請求時往往都是Json對象,用JSON.stringify(data)的方式就能將對象變成json字符串。@RequestBody接收的是一個字符串,返回的參數可以是一個Map對象。
