參考網上隊友的帖子:傳遞JSON數據有沒有必要用RequestBody?https://www.cnblogs.com/NJM-F/p/10407763.html
前端參數可以直接使用JSON對象:
//此時請求的ContentType默認是application/x-www-form-urlencoded: var user= { "username" : username, "password" : password, "rememberMe":rememberMe }; $.ajax({ url : "http://...../jsontest.do", type : "POST", async : true, data : user, dataType : 'json',//返回類型 success : function(data) { } });
后端參數的可以用java對象接收,也可以用數據類型單獨接收:
@RequestMapping("/jsontest.do") public void test(User user,String username,String password,Boolean rememberMe){ System.out.println(user); System.out.println("username: " + username); System.out.println("password: " + password); System.out.println("rememberMe: " + rememberMe); }
2.而使用RequestBody是這樣的:
參考:https://blog.csdn.net/walkerJong/article/details/7520896
作用:
i) 該注解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然后把相應的數據綁定到要返回的對象上;
ii) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。
使用時機:
A) GET、POST方式提時, 根據request header Content-Type的值來判斷:
application/x-www-form-urlencoded, 可選(即非必須,因為這種情況的數據@RequestParam, @ModelAttribute也可以處理,當然@RequestBody也能處理);
multipart/form-data, 不能處理(即使用@RequestBody不能處理這種格式的數據);
其他格式, 必須(其他格式包括application/json, application/xml等。這些格式的數據,必須使用@RequestBody來處理);
B) PUT方式提交時, 根據request header Content-Type的值來判斷:
application/x-www-form-urlencoded, 必須;
multipart/form-data, 不能處理;
其他格式, 必須;
說明:request的body部分的數據編碼格式由header部分的Content-Type指定;
前端使用application/json的時候,必須要將JSON對象
轉換為JSON字符串
//需要使用JSON.stringify()將JSON對象轉化為JSON字符串 var user= { "username" : username, "password" : password }; $.ajax({ url : "http://...../jsontest.do", type : "POST", async : true, contentType: "application/json; charset=utf-8",//將JSON對象轉換為JSON字符串 data : JSON.stringify(user), dataType : 'json', success : function(data) { } });
后端參數要用@RequestBody注解加java對象/map對象/字符串 接收,如果請求的地址后面有參數,則形參可以新增該參數的接收
:
//這種方式下所有的參數都只能封裝在User對象中,不能單獨設置參數 @RequestMapping("/jsontest") //用java對象接收 public void test(@RequestBody User user ){ String username = user.getUsername(); String password = user.getPassword(); } 或者 @RequestMapping("/jsontest") //用map對象接收,再從map對象中根據key值獲取value值 public void test(@RequestBody Map map ){ String username = map.get("username").toString(); String password = map.get("password").toString(); } 或者 public void test(@RequestBody String jsonData) { //用字符串接收,再將字符串轉為json對象,最后再解析為具體的對象 JSONObject jsonObject = JSON.parseObject(jsonData); String username= jsonObject.getString("username"); String username= jsonObject.getString("password"); }
第1種有以下優點:
1.前端傳遞數據不用轉換為json字符串:即不用JSON.stringify(user)
2.后端接受的參數很靈活,即可以封裝為User對象,亦可以使用單個參數username,rememberMe,甚至User對象和單個rememberMe參數混合使用都可以
第2種優點:
1.前端ajax請求傳入比較復雜的數據格式時,用@RequestBody注解比較好(個人理解)
2.使用@RequestBody時,在ajax請求的地址后邊也可以加上參數,然后在后台的controller參數中獲取
例如
{
var params = { id:id, taskPhones:taskPhones, groupId:groupId, planType:planType, scheduledTimeStr:scheduledTimeStr, taskName:taskName, templateContent:templateContent, templateId:templateId, taskTemplateValueList:taskTemplateValueList, smilResourceId:smilResourceId, } submit(params, '0'); } function submit(params,isTemp){ $.ajax({ url: WEB_ROOT + "/mall/task/saveTaskForEdit?isTemp="+isTemp, type : "POST", dataType : "JSON", contentType:"application/json", data: JSON.stringify(params), success: function (data) { if (data.success) { var taskId=data.data; msgInfoModal("成功",'保存成功',function () { window.location = WEB_ROOT + "/mall/task/taskIndex"; // window.location = WEB_ROOT + "/mall/task/editTask?id=" + taskId; },true); tab.alertReload('成功','保存成功',false,"toEdit("+demandId+")"); } else { msgInfoModal("失敗",data.msg); } } }); }
3.@ResponeBody的用法
@ResponseBody
作用:
該注解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換為指定格式后,寫入到Response對象的body數據區。
使用時機:
返回的數據不是html標簽的頁面,而是其他某種格式的數據時(如json、xml等)使用
@ResponseBody的作用其實是將java對象轉為json格式的數據。
@responseBody注解的作用是將controller的方法返回的對象通過適當的轉換器轉換為指定的格式之后,寫入到response對象的body區,通常用來返回JSON數據或者是XML數據。
注意:在使用此注解之后不會再走視圖處理器,而是直接將數據寫入到輸入流中,他的效果等同於通過response對象輸出指定格式的數據。
@ResponseBody是作用在方法上的,@ResponseBody 表示該方法的返回結果直接寫入 HTTP response body 中,一般在異步獲取數據時使用【也就是AJAX】。
注意:在使用 @RequestMapping后,返回值通常解析為跳轉路徑,但是加上 @ResponseBody 后返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中。 比如異步獲取 json 數據,加上 @ResponseBody 后,會直接返回 json 數據。@RequestBody 將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象。
例如
//選擇分組 function onChangePhoneGroup(groupId) { if (groupId == null || groupId == '') { return; } var params={ groupId:groupId } $.ajax({ url: WEB_ROOT + "/mall/task/selectGroupPhones", type : "POST", dataType : "JSON", data: params, success: function (data) { if (!data.success) { return; } var phonesStr=data.data.phonesStr; $('#taskPhones').val(phonesStr); } }); }
@RequestMapping(value = "/selectGroupPhones") @ResponseBody public R selectGroupPhones(Long groupId) throws Exception{ if (groupId == null) { return R.failure("error"); } Long staffId = StaffUtil.getStaffUserId(session).longValue(); List<String> phones = itPhonesGroupSV.selectPhoneNosByDataUserIdAndGroupId(staffId, groupId); String phonesStr=null; if (phones != null && phones.size() > 0) { phonesStr = phones.stream() .collect(Collectors.joining(";")); } Map<String, Object> data = new HashMap<>(); data.put("phones", phones); data.put("phonesStr", phonesStr); return R.success(data); }
4.返回的是頁面時,不用@ResposeBody注解
js
type值為html,返回的參數page為頁面,用html接收:
/** * 點擊預覽按鈕 */ function smsPreLook() { var id= $("#taskId").val(); var isdetail=true; var param = { id: id }; $.ajax({ url: WEB_ROOT + "/mall/task/preLook?isdetail="+isdetail, type: "html",//返回類型為html data: JSON.stringify(param), contentType:"application/json", method: "post", success: function (page) { $("#preLook").html(page);//返回的是頁面 $('#preLookModal').modal('show'); } }); }
java:
返回類型為String,返回值為頁面地址字符串
/** * 預覽顯示 */ @RequestMapping(value = "/preLook") public String examineInit(Model model, @RequestBody TaskVO taskVO, Boolean isdetail) throws Exception { AuthStaffVO staff = StaffUtil.getStaffVO(session); if (isdetail && taskVO.getId() != null) { taskVO = itTaskSV.selectTaskVOById(taskVO.getId()); } else { //校驗文本內容的權限(部分自定義的話,只能用模板;完全自定義可以不用模板) if (TaskConstant.TASK_RIGHT_1.equals(staff.getTaskRight())) { //必須使用模板 if (taskVO.getTemplateId() == null) { return null;// R.failure("請選擇模板~") } setTaskSmsMsgContentByTemplate(taskVO); } else if (TaskConstant.TASK_RIGHT_2.equals(staff.getTaskRight())) { //可以不用模板 if (taskVO.getTemplateId() != null) { setTaskSmsMsgContentByTemplate(taskVO); } else { taskVO.setSmsMsgContent(taskVO.getTemplateContent()); } } else { return null;//R.failure("您當前沒有權限進行此操作哦~"); } } List<TaskVO> taskVOList = new ArrayList<TaskVO>(); try { taskVOList = itTaskSV.selectTaskVOList(taskVO); } catch (Exception e) { log.error("短信任務管理(后台)--數字短信預覽異常", e); } model.addAttribute("taskVOList", taskVOList); return "homeMain/myCenter/task/mall-smsPreLook"; }