天天看點

SpringMVC用map接收請求參數的問題

一:遇到個跨域調用,因為傳個我的參數不定,是以需要通過map來接收參數并進行簽名驗證等操作

寫出了下面的代碼,但是發現map裡并沒有擷取到傳來的key-value值

@RequestMapping(value = "/callback", produces = "text/html;charset=UTF-8")  
@ResponseBody  
public String callback(@RequestBody Map<String, String> params) {  
    return null;  
}  
           

之後我發現HttpServletRequest有一個getParameterMap方法

@RequestMapping(value = "/callback", produces = "text/html;charset=UTF-8")  
@ResponseBody  
public String callback(HttpServletRequest httpServletRequest) {  
    Map<String, String> params = httpServletRequest.getParameterMap();  
    return null;  
}  
           

然而這麼寫還是不行,因為這個方法其實是傳回的一個Map<String, String[]>對象,而不是我想象中的Map<String, String>類型,這裡是可以獲得正确的參數的,但是需要手動進行轉換,一定有更好的解決辦法,然後我用@RequestParam綁定

@RequestMapping(value = "/callback", produces = "text/html;charset=UTF-8")  
@ResponseBody  
public String callback(@RequestParam Map<String, String> params) {  
    return null;  
}  
           

二:以前一直以為在SpringMVC中,@RequestBody接收的是一個Json對象,後來發現,其實 @RequestBody接收的是一個Json對象的字元串,而不是一個Json對象。然而在ajax請求往往傳的都是Json對象,後來發現用 JSON.stringify(data)的方式就能将對象變成字元串。同時ajax請求的時候也要指定dataType: "json",contentType:"application/json" 這樣就可以輕易的将一個對象或者List傳到Java端,使用@RequestBody即可綁定對象或者List.

JavaScript 代碼:

<script type="text/javascript">  
    $(document).ready(function(){  
        var saveDataAry=[];  
        var data1={"userName":"test","address":"gz"};  
        var data2={"userName":"ququ","address":"gr"};  
        saveDataAry.push(data1);  
        saveDataAry.push(data2);         
        $.ajax({ 
            type:"POST", 
            url:"user/saveUser", 
            dataType:"json",      
            contentType:"application/json",               
            data:JSON.stringify(saveData), 
            success:function(data){ 
                                       
            } 
         }); 
    });  
</script>
           

Java代碼

@RequestMapping(value = "saveUser", method = {RequestMethod.POST }}) 
    @ResponseBody  
    public void saveUser(@RequestBody List<User> users) { 
         userService.batchSave(users); 
    } 
           

繼續閱讀