有关在Spring MVC中使用@ModelAttribute注释方法参数的一些信息

时间:2013-01-12 17:44:48

标签: java spring spring-mvc annotations

我正在研究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调用,该请求的主体字段包含两个有价值的文本变量:** foo = bar fruit = 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 安德烈

2 个答案:

答案 0 :(得分:1)

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

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

您将拥有一个“宠物”对象,该对象来自您的控制器 模型 对象。 Spring会在 模型 地图对象中搜索“petKey”。

当你注释你的方法时:

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

执行方法并从方法返回后,Spring将“ new Pet ”作为值,将“petKey”作为 model 对象中的键(地图)。

答案 1 :(得分:1)

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

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