0

我正在研究 Spring MVC Showcase 项目,可从 STS 仪表板下载

我有以下情况对我来说并不完全清楚:

我有以下表格:

<form id="readForm"action="<c:url value="/messageconverters/form" />" method="post">
        <input id="readFormSubmit"type="submit"value="Read Form Data"/>             
</form>

与具有 id="readForm" 的表单的提交操作相关,我有以下 Jquery 函数,它简单地执行一个 AJAX 调用 hadding 到请求的 body 字段两个 valorized 文本变量:**foo=barfruit=apple

$("#readForm").submit(function() {
    var form = $(this); // Contiene il riferimento all'elemento form submittato 

    // Contiene il riferimento all'emento input all'interno del form (il bottone)
    var button = form.children(":first");

    $.ajax({ 
        type: "POST",               // Tipo di Request: POST 
        // URL specificato dall'attributo "action" del form: "/messageconverters/form" 
        url: form.attr("action"),   
        // Dati che vengono passati all'interno del campo body dell'HTTP Request, 2 variabili
        data: "foo=bar&fruit=apple", 

        // Tipo di media type accettabile dalla response
        contentType: "application/x-www-form-urlencoded", 
        dataType: "text", // Tipo di dati passato dalla HTTP Request 

        success: function(text) {       // Caso di successo: 
            MvcUtil.showSuccessResponse(text, button); 
        }, 

        error: function(xhr) {          // Caso di errore:
            MvcUtil.showErrorResponse(xhr.responseText, button); 
        }
    });
    return false;
});

我的控制器类处理这个请求的方法如下:

@RequestMapping(value="/form", method=RequestMethod.POST)
public @ResponseBody String readForm(@ModelAttribute JavaBean bean) {
    return "Read x-www-form-urlencoded: " + bean;
}

好的,该方法将带有@ModelAttribute注释的 JavaBean 对象作为输入参数。

查看示例定义的 JavaBean 类,我有:

@XmlRootElement
public class JavaBean {

    @NotNull
    private String foo;
    @NotNull
    private String fruit;

    public JavaBean() {
    }

    public JavaBean(String foo, String fruit) {
        this.foo = foo;
        this.fruit = fruit;
    }

    // GETTER e SETTER METHOD
}

因此,JavaBeans 包含两个与表单变量同名的属性,这些属性在我提交表单时生成的 HTTP 请求中传递

阅读@ModelAttribute注释文档(http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/bind/annotation/ModelAttribute.html)我发现我可以使用它既要注释方法,又要注释方法参数

我的情况是第二种情况,对于这种情况,我可以阅读:将方法参数或方法返回值绑定到命名模型属性的注释,暴露给 Web 视图

那么具体是什么意思呢?

我认为,如果我用这个注释注释一个方法参数,这意味着如果在 HTTP 请求的正文中传递的变量名称与我的注释对象的变量匹配,Spring 会自动复制这个变量的值在具有相同属性的属性中注释对象中的名称

但我不确定这...

有人可以帮我理解这件事吗?

Tnx安德烈亚

4

2 回答 2

1

我的回答可能会迟到,但我正在研究相同的内容并发现这个链接很有趣。

它提供了在方法级别使用 @ModelAttribute() 的理解,这与 @SessionAttribute 注释配合得很好。 http://www.intertech.com/Blog/understanding-spring-mvc-model-and-session-attributes/

于 2014-09-21T07:45:03.083 回答
1

我不这么认为。@ModelAttribute 与 HTTP 请求参数无关。当您注释方法参数时,例如:

public String foo(@ModelAttribute ("petKey") Pet pet){
}

您将拥有一个来自控制器模型对象的“宠物”对象。Spring 将在模型映射对象中搜索“petKey” 。

当你注释你的方法时:

@ModelAttribute ("petKey")
public Pet foo(){
   return new Pet;
}

在执行方法并从方法返回后,Spring会将“ new Pet ”作为值,将“petKey”作为模型对象(map)中的键。

于 2013-01-13T08:05:21.063 回答