ajax請求從js傳json數據到后場及接受方式—用或者不用RequestBody的情況及后場返回


參考網上隊友的帖子:傳遞JSON數據有沒有必要用RequestBody?https://www.cnblogs.com/NJM-F/p/10407763.html

 
1.不使用RequestBody時是這樣的:

前端參數可以直接使用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";
    }

 

 


免責聲明!

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



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