2016-03-15 163 views
2

我想通过AJAX发出一个POST请求,并且我也希望将整个类对象绑定到请求,并且我想用@requestParam注释来接收该请求。我知道这可以用@requestBody注释完成,但我很想知道:我们可以用@requestParam注释来完成吗?如何将@RequestParam绑定到Spring MVC中的对象?

的Ajax代码:

var restDTO{ 
    id: 3, 
    name: "hello" 
} 

$.ajax({ 
      url: url, 
      type: 'POST', 
      dataType: 'json', 
      contentType: 'application/json', 
      mimeType: 'application/json', 
      data: JSON.stringify({RestDTO : restDTO}),   
      success: function(data) 
    { 
    } 

我有RestDTO

Class RestDTO 
{ 

    int id; 
    String name; 

    //getter and setter 

} 

在控制器

public String content(@RequestParam RestDTO restDTO){...} 

我应该做的让这段代码运行?

从ajax发送数据应该改变什么?

我需要在服务器上更改以接收包含@requestParam注释的RestDto对象吗?

回答

5

如果你发送你的数据作为经典的请求参数,你可以绑定通过简单地省略@RequestParam反对,所以

public String content(RestDTO restDTO){...} 

如果您要发送json,你必须使用@RequestBody

如果whysoever你在@RequestParam坚持,注意,您可以对地图绑定多个值,因此

public String content(@RequestParam Map<String, String> restDTO){...} 

@RequestParam DOC

如果方法的参数是地图或 未指定MultiValueMap和参数名称, 然后使用所有请求参数名称 和值填充映射参数。

+0

它总是会给RestDTO – user3029929

+0

中的属性(id,name)的NULL值,对不起,错过了一个点。如果你发送数据为json,你必须使用'@ RequestBody' –

+0

有什么方法可以在类对象中使用@requestParam接收数据? 但是在ajax方面,我可以选择 – user3029929

10

你不能,因为@RequestParam只是表明,该一个方法的参数应该绑定到一个一个 Web请求的参数。它无法映射到对象。对于使用@RequestParam你应该改变Ajax请求:

var restDTO{ 
    id: 3, 
    name: "hello" 
} 

$.ajax({ 
      url: url, 
      type: 'POST', 
      data: restDTO,   
      success: function(data){ 
      .... 
      } 
}); 

jQuery将发送请求作为application/x-www-form-urlencoded,并会自动处理数据参数。您控制器的方法应该看起来像以下:

@RequestMapping("/url") 
public String content(@RequestParam Long id, @RequestParam String name){...} 

自动参数映射到对象,你可以使用@ModelAttribute注释:

@RequestMapping("/url") 
public String content(@ModelAttribute RestDTO restDTO){...} 

在这种情况下,名称中的JavaScript地图应该匹配在RestDTO属性的名称。

一般而言,@ModelAttribute@RequestBody为相同目的而创建:用于将请求的数据绑定到方法(不管是基本类型的对象)。

我认为,当你使用html-forms和plain对象时,@ModelAttribute更方便。准备使用弹簧技能,如modelAttributepath

反过来,@RequestBody更灵活,当你需要手动控制数据。而且,当你处理复杂的对象时,它更方便。

我个人更喜欢@RequestBody和json。

+0

感谢您的描述,我试过了,我知道了: 1. RequestBody + json。 2. ModelAttribute +应用程序/ x-www-form-urlencoded 但最终,我找不到它的任何区别...我的意思是在哪里使用? javascript map应匹配两种情况下的属性名称 – user3029929

+0

@ user3029929您说得对,这种方法需要同样的东西。但是,以我的观点来看,'ModelAttribute'只有在处理Web表单时非常有用,在其他情况下'RequestBody'更方便。 –

+1

'@ ModelAttribute'从模型中获取对象或添加对象。它与任何约束无关。 – zeroflagL

1

和Spring Web你有这些注释:

RequestParam - 用于获取PARAMS

PathVariable - 用于路径参数(/路径/ {名})

(/路径名=?)

RequestBody - 用于后/ PUT /补丁等体

RequestHeader - 页眉

所以你不能使用RequestParam为post数据,不如果json没有问题

相关问题