Spring:@ModelAttribute VS @RequestBody

xnifntxz  于 2023-06-21  发布在  Spring
关注(0)|答案(9)|浏览(193)

如果我说错了请纠正我。都可以用于数据绑定
问题是什么时候使用@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){ }

根据我的理解,两者都有类似的目的。
谢谢!

xfyts7mz

xfyts7mz1#

根据我的理解,最简单的方法是,@ModelAttribute将接受一个查询字符串。所以所有的数据都是通过url传递到服务器的。
对于@RequestBody,所有数据都将通过完整的JSON主体传递到服务器。

fae0ux8s

fae0ux8s2#

@ModelAttribute用于绑定来自请求参数的数据(在键值对中),
但是@RequestBody用于绑定来自整个请求体的数据,如POST,PUT..请求类型包含其他格式,如json,xml。

wpx232ag

wpx232ag3#

如果你想上传文件,你必须使用@ModelAttribute。对于@RequestBody,这是不可能的。示例代码

@RestController
@RequestMapping(ProductController.BASE_URL)
public class ProductController {

    public static final String BASE_URL = "/api/v1/products";

    private ProductService productService;

    public ProductController(ProductService productService) {
        this.productService = productService;
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public ProductDTO createProduct(@Valid @ModelAttribute ProductInput productInput) {
        return productService.createProduct(productInput);
    }

}

ProductInput类

@Data
public class ProductInput {

    @NotEmpty(message = "Please provide a name")
    @Size(min = 2, max = 250, message = "Product name should be minimum 2 character and maximum 250 character")
    private String name;

    @NotEmpty(message = "Please provide a product description")
    @Size(min = 2, max = 5000, message = "Product description should be minimum 2 character and maximum 5000 character")
    private String details;

    @Min(value = 0, message = "Price should not be negative")
    private float price;

    @Size(min = 1, max = 10, message = "Product should have minimum 1 image and maximum 10 images")
    private Set<MultipartFile> images;
}
klr1opcd

klr1opcd4#

我发现@RequestBody(也将一个类注解为@RestController)更适合 AJAX 请求,在这种情况下,您可以完全控制正在发出的请求的内容,并且内容以XML或JSON的形式发送(因为Jackson)。这允许内容轻松创建模型对象。相反,@ModelAttribute似乎更适合于有一个“命令”对象支持表单(可能不一定是模型对象)的表单。

rta7y2nd

rta7y2nd5#

如果使用 ModelAttribute 标注,则可以直接在view layer中访问您的宠物对象。另外,您可以在控制器上的方法中示例化此对象以放置模型。see this

  • ModelAttribute* 让你有机会使用这个对象的partial,但是使用 RequestBody,你会得到请求的所有主体。
trnvg8h3

trnvg8h36#

我认为@ModelAttribute和@RequestBody都有相同的用途,唯一的区别是@ModelAttribute用于普通的spring MVC,@RequestBody用于REST Web服务。它是@PathVariable和@PathParam。但在这两种情况下,我们可以混合使用。我们可以在REST中使用@PathVariable,反之亦然。

brqmpdu1

brqmpdu17#

使用@ModelAttribute,您可以在URL参数中传递数据,使用@RequestBody,您可以将其作为JSON主体传递。如果你正在创建一个REST API,那么最好使用@RequestBody。在大多数youtube教程中,您可能会发现使用@ModelAttribute -这只是因为它们可能会演示有关Spring MVC的概念,并使用URL来传递数据。

qyuhtwio

qyuhtwio8#

我们需要使用以下jsp标记将实体数据绑定到jsp表单字段:
表单来自spring标签库:
以下是不完整的HTML,但我希望你能联系你自己:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>

        <form:form action="save" method="post" modelAttribute="patient">
            <table>
                <tr>
                    <td>Name</td>
                    <td>
                        <form:input path="patient.patient_name"  /> <br />
                        
                    </td>
                </tr>
                <tr>
                    <td>Phone</td>
                    <td>
                        <form:input path="patient.phone_number" /> <br />
                    </td>
                </tr>
                <tr>
                    <td colspan="2"><button type="submit">Submit</button></td>
                </tr>
            </table>
        </form:form>

表单必须被处理两次,一次是在呈现表单之前,在此期间,我们需要为属性值modelAttribute="patient"给予适当的bean示例化。
1.为此,控制器类(在类定义级别)需要有@RequestMapping注解。
1.您需要具有如下处理程序方法参数

@GetMapping("logincreate")

public String handleLoginCreate(@ModelAttribute("login") Login login, Model model)
{
    System.out.println(" Inside handleLoginCreate  ");
    model.addAttribute("login",login);
    return "logincreate";
}

Spring将扫描所有的handler方法@ModelAttribute,并使用Login类的默认构造函数示例化它,并调用它的所有getter和setter(用于从form到“login”的jsp绑定)。如果缺少以下任何一项,jsp将不会显示,将抛出各种异常

  1. getters/setters
    1.缺省构造函数
  2. public void run(“login”,“login ");
    1.类级别@RequestMapping
    1.方法参数level @ModelAttribute
    同样,jsp中的处理程序方法,在上面的形式action="save"中,处理程序方法可能看起来像这样:
@PostMapping("save")

public String saveLoginDetails(@ModelAttribute("login") Login login, Model model) {
    
    //write codee to insert record into DB
    System.out.println(" Inside save login details  ");
    System.out.println("The login object is " + login.toString());
    System.out.println("The model object contains the login attribute"+ model.getAttribute("login"));   
    loginService.saveLogin(login);
    return "welcome";
}

重要的学习是:
1.在form启动之前,spring应该有适当的annotation来指示form的backing bean,在上面的例子中,“backing bean”或“binding object”是Login login with appropriate handler method的parameter annotation @ModelAttribute("login") Login login

aemubtdh

aemubtdh9#

@ModelAttribute主要用于包含多部分文件作为主体。要从前端传递数据,您需要将数据转换为JSON。甚至测试用例的编写也有点不同。您需要使用**contentType(MediaType.APPLICATION_FORM_URLENCODED)作为内容类型,而不是JSON字符串,您需要将值作为.param(“field”,value)**传递

相关问题