如果我说错了请纠正我。都可以用于数据绑定。
问题是什么时候使用@ModelAttribute?
@RequestMapping(value="/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST)
public String processSubmit(@ModelAttribute Pet pet) { }
另外,什么时候使用@RequestBody?
@RequestMapping(value = "/user/savecontact", method = RequestMethod.POST
public String saveContact(@RequestBody Contact contact){ }
根据我的理解,两者都有类似的目的。
谢谢!
9条答案
按热度按时间xfyts7mz1#
根据我的理解,最简单的方法是,
@ModelAttribute
将接受一个查询字符串。所以所有的数据都是通过url传递到服务器的。对于
@RequestBody
,所有数据都将通过完整的JSON主体传递到服务器。fae0ux8s2#
@ModelAttribute
用于绑定来自请求参数的数据(在键值对中),但是
@RequestBody
用于绑定来自整个请求体的数据,如POST,PUT..请求类型包含其他格式,如json,xml。wpx232ag3#
如果你想上传文件,你必须使用
@ModelAttribute
。对于@RequestBody
,这是不可能的。示例代码ProductInput类
klr1opcd4#
我发现@RequestBody(也将一个类注解为@RestController)更适合 AJAX 请求,在这种情况下,您可以完全控制正在发出的请求的内容,并且内容以XML或JSON的形式发送(因为Jackson)。这允许内容轻松创建模型对象。相反,@ModelAttribute似乎更适合于有一个“命令”对象支持表单(可能不一定是模型对象)的表单。
rta7y2nd5#
如果使用 ModelAttribute 标注,则可以直接在view layer中访问您的宠物对象。另外,您可以在控制器上的方法中示例化此对象以放置模型。see this。
trnvg8h36#
我认为@ModelAttribute和@RequestBody都有相同的用途,唯一的区别是@ModelAttribute用于普通的spring MVC,@RequestBody用于REST Web服务。它是@PathVariable和@PathParam。但在这两种情况下,我们可以混合使用。我们可以在REST中使用@PathVariable,反之亦然。
brqmpdu17#
使用@ModelAttribute,您可以在URL参数中传递数据,使用@RequestBody,您可以将其作为JSON主体传递。如果你正在创建一个REST API,那么最好使用@RequestBody。在大多数youtube教程中,您可能会发现使用@ModelAttribute -这只是因为它们可能会演示有关Spring MVC的概念,并使用URL来传递数据。
qyuhtwio8#
我们需要使用以下jsp标记将实体数据绑定到jsp表单字段:
表单来自spring标签库:
以下是不完整的HTML,但我希望你能联系你自己:
表单必须被处理两次,一次是在呈现表单之前,在此期间,我们需要为属性值
modelAttribute="patient"
给予适当的bean示例化。1.为此,控制器类(在类定义级别)需要有
@RequestMapping
注解。1.您需要具有如下处理程序方法参数
Spring将扫描所有的handler方法
@ModelAttribute
,并使用Login类的默认构造函数示例化它,并调用它的所有getter和setter(用于从form到“login”的jsp绑定)。如果缺少以下任何一项,jsp将不会显示,将抛出各种异常1.缺省构造函数
1.类级别@RequestMapping
1.方法参数level @ModelAttribute
同样,jsp中的处理程序方法,在上面的形式
action="save"
中,处理程序方法可能看起来像这样:重要的学习是:
1.在form启动之前,spring应该有适当的annotation来指示form的backing bean,在上面的例子中,“backing bean”或“binding object”是Login login with appropriate handler method的parameter annotation
@ModelAttribute("login") Login login
aemubtdh9#
@ModelAttribute主要用于包含多部分文件作为主体。要从前端传递数据,您需要将数据转换为JSON。甚至测试用例的编写也有点不同。您需要使用**contentType(MediaType.APPLICATION_FORM_URLENCODED)作为内容类型,而不是JSON字符串,您需要将值作为.param(“field”,value)**传递