使用SpringBoot做Javaweb時,數據交互遇到的問題


有段時間沒做過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對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM