3

我正在研究可从 di STS 仪表板下载的 Spring MVS Showcase。我正在研究 Spring 如何映射请求,但在理解以下内容时遇到了一些问题:

我有这个带有提交按钮的表单:

        <li>
            <form id="byConsumes" class="readJsonForm" action="<c:url value="/mapping/consumes" />" method="post">
                <input id="byConsumesSubmit" type="submit" value="By consumes" />
            </form>
        </li>

当我单击提交按钮时,HTTP Post 请求传递了一个创建 JSON 对象的 Jquery 函数,这是 JQuery 函数的代码:

$("form.readJsonForm").submit(function() {          

    var form = $(this);                 // Variabile che si riferisce all'elemento nel DOM che ha scatenato l'evento click (il form) 
    var button = form.children(":first");       // Seleziona il bottone submit 

    var data = form.hasClass("invalid") ?       // OPERATORE CONDIZIONALE: il form ha classe "invalid" ? 
            "{ \"foo\": \"bar\" }" :            // SI: foo = bar 
            "{ \"foo\": \"bar\", \"fruit\": \"apple\" }";   // NO: foo= bar ; fruit = apple 


    /* AJAX CALL PARAMETER:
       type: Say to the servlet path, the request is a POST HTTP Request
       url: The address to which to send the call   
       data: the content of my data variable
       contentType: an object having JSON format
       dataType: the type of content returned by the server
    */
    $.ajax({ type: "POST", url: form.attr("action"), data: data, contentType: "application/json", dataType: "text", 
        success: function(text) { MvcUtil.showSuccessResponse(text, button); }, 
        error: function(xhr) { MvcUtil.showErrorResponse(xhr.responseText, button); }});

    return false;
});

我创建并传递的 JSON 对象由 data 变量表示,并包含以下键\值:{ \"foo\": \"bar\", \"fruit\": \"apple\" }

就像是:

富:酒吧

水果:苹果

现在,在我的控制器中,我有处理这个请求的方法:

@RequestMapping(value="/mapping/consumes", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody String byConsumes(@RequestBody JavaBean javaBean) {
    return "Mapped by path + method + consumable media type (javaBean '" + javaBean + "')";
}

所以我很清楚,这个方法处理 HTTP Post Request 到“映射/消费”路径(只有 POST 请求),但我不确定以下项目的含义:

  1. consumes=MediaType.APPLICATION_JSON_VALUE:这到底是什么意思?我认为它对 Spring 说,此方法接收 JSON 格式的对象,因此可以以某种方式对其进行解析……但我不确定,也没有在文档中找到它。

    什么是消耗?变量或类似注释的东西?我不明白,因为这里它是 @RequestMapping 注释的参数,但在 Google 上搜索显示它被用作独立注释......

  2. 在我的 byConsumes() 方法中,我有以下输入参数:@RequestBody JavaBean javaBean。阅读 Spring 文档我了解到:@RequestBody 方法参数注释表明使用@RequestBody 注释方法参数应该绑定到 HTTP 请求正文的值。

    因此,在实践中,这意味着我的 HTTP 请求正文字段中有我的 JSON 对象,并使用此注释将其转换为一个名为 javaBean 的对象,该对象具有 JavaBean 类?

    如果我的肯定是真的……JavaBean 类型的对象是什么类型的对象?一个只包含一些变量和相应的 getter 和 setter 方法的对象?(在前一种情况下,一个对象只包含两个变量:第一个名为 foo 且值为“bar”,第二个名为 fruit 且值为“apple”)

这样对吗?

非常感谢安德里亚

4

1 回答 1

8

您对这段代码所做的事情的解释基本上是正确的。

'Consumes' 是注解的一个参数,@RequestMapping用于指示该方法处理的 HTTP 内容类型。在这种情况下,它向 Spring 指示该方法将 JSON 作为输入。您可以在此处的 Spring 文档中阅读有关此内容的更多信息。您可以类似地指出一个方法“使用”XML。

至于@RequestBody注解,这用于表示被注解的方法参数应该由HTTP请求的正文组成,它的文档在这里。Spring 通常会通过在请求中获取 HTTP 参数的名称并使用 setter 方法在 Java bean 中设置值来执行此操作。

在您的示例中,Spring 将检查方法的注释并确定请求正文应映射到 type 的对象JavaBean。它将自动创建该类的实例,并且(通过消息转换器)将填充该JavaBean实例。Spring 将使用反射来完成所有这些工作,但它执行的代码基本上会这样做:

JavaBean parameter = new JavaBean();
parameter.setFoo("bar");
parameter.setFruit("apple");

您可以将类型替换JavaBean为任何其他为字段声明 getter/setter 的 Java 类foofruit.

于 2012-11-26T19:18:37.513 回答