我正在研究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 安德烈
答案 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/