@ModelAttribute
在 Spring MVC 中的目的和用途是什么?
@ModelAttribute
在 Spring MVC 中的目的和用途是什么?
@ModelAttribute
是指 Model 对象中的一个属性(在 MVC 中的 M);
因此,假设我们有一个名为 "Person" 的表单数据绑定对象,你可以通过使用 @ModelAttribute
注解,让 Spring MVC 将这个对象提供给 Controller 方法:
public String processForm(@ModelAttribute("person") Person person){
person.getStuff();
}
另一方面,注释用于定义应该成为模型一部分的对象。因此,如果您想在模型中引用一个名为Person的对象,可以使用以下方法:
@ModelAttribute("person")
public Person getPerson(){
return new Person();
}
这个有注释的方法将允许您在视图中访问Person对象,因为它会被Spring自动添加到Models中。
@ModelAttribute
。 - Neil McGuigan@ModelAttribute
? - Ryan我知道这是一个旧的线程,但我想参与讨论并看看能否让事情更加混乱 :)
我发现最初理解@ModelAttribute
的难点在于Spring决定将多个注释组合成一个。一旦我将其拆分为几个较小的注释,它就变得更清晰了:
对于参数注释,请将@ModelAttribute
视为相当于@Autowired + @Qualifier
,即它尝试从Spring管理的模型中检索具有给定名称的bean。如果未找到命名bean,则它会隐式地承担@Bean
的角色,即使用默认构造函数创建一个新实例并将该bean添加到模型中,而不是抛出错误或返回null
。
对于方法注释,请将@ModelAttribute
视为相当于@Bean + @Before
,即将用户代码构建的bean放入模型中,并始终在请求处理方法之前调用。
形象地说,我将@ModelAttribute
视为以下内容(请不要字面理解!!):
@Bean("person")
@Before
public Person createPerson(){
return new Person();
}
@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
...
}
正如你所看到的,Spring 做出了明智的决定,将@ModelAttribute
注解作为一种全面包含的注解;没有人想看到注解自助餐。
@ModelAttribute
an all-encompassing annotation; no one wants to see an annotation smorgasbord.@Zombies
后面加上 @Scope("request")
就可以了 :) - OrangeDog那我会尽力用简单易懂的语言来解释。我们来看看:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
如Spring MVC文档所述,@ModelAttribute注解可以用于方法或方法参数。当然,在一个控制器中我们可以同时使用这两种方式。
1. 方法注解
@ModelAttribute("cities")
public List<String> checkOptions(){
return new Arrays.asList(new[]{"Sofia","Pleven","Ruse"});//and so on
}
new Arrays.asList(new[]{"Sofia","Pleven","Ruse"})
作为模型中的值(您可以将模型视为映射(键:值))。控制器中的@ModelAttribute方法在同一控制器内的@RequestMapping方法之前被调用。
在这里,我们想要向模型中添加常见信息,该信息将用于表单以向用户显示。例如,它可用于填充HTML select:
2.方法参数
public String findPerson(@ModelAttriute(value="person") Person person) {
//..Some logic with person
return "person.jsp";
}
方法参数上的@ModelAttribute表示该参数应从模型中检索。因此,在这种情况下,我们期望在模型中有person对象作为键,并且我们想获取其值并将其放入方法参数Person person中。如果不存在这样的对象或者(有时您会拼错(value="persson")),那么Spring将无法在模型中找到它,并使用其默认值创建空的Person对象。然后,将获取请求参数,并尝试使用它们的名称将它们绑定到Person对象中。
name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=&
我们有一个名字,它将使用setName(String name)绑定到Person.name。因此,在
//..Some logic with person
对于我的编程风格,我总是使用@ModelAttribute从Spring表单JSP中获取对象。例如,我在JSP页面上设计表单时,该表单存在commandName属性。
<form:form commandName="Book" action="" methon="post">
<form:input type="text" path="title"></form:input>
</form:form>
然后我使用以下代码在控制器上捕获对象:
and I catch the object on controller with follow code
public String controllerPost(@ModelAttribute("Book") Book book)
每个书籍的字段名都必须与表单子元素路径匹配。modelAttribute
是新的方式;commandName
是旧的方式。https://dev59.com/3WEi5IYBdhLWcg3wNqHN - Nor.Z我知道我来晚了,但正如他们所说的那样,“迟到总比不到好”。所以让我们开始吧,
每个人都有自己解释事物的方式,让我用一个例子尝试通过几个步骤为您概括和简化它;
假设您有一个简单的表单 form.jsp
:
<form:form action="processForm" modelAttribute="student">
First Name : <form:input path="firstName" />
<br/><br/>
Last Name : <form:input path="lastName" />
<br/><br/>
<input type="submit" value="submit"/>
</form:form>
```html
<form:input path="firstName" />
<form:input path="lastName" />
这些是 Student 类中的字段/属性。当表单被调用/初始化时,会调用它们的 getter 方法。在表单提交时,会调用它们的 setter 方法,并将它们的值传递到在表单标签中使用 modelAttribute="student"
指定的 bean 中。
我们有一个包括以下方法的 StudentController
:
@RequestMapping("/showForm")
// `Model` is used to pass data between controllers and views
public String showForm(Model theModel) {
// attribute name, value
theModel.addAttribute("student", new Student());
return "form";
}
@RequestMapping("/processForm")
public String processForm(@ModelAttribute("student") Student theStudent) {
System.out.println("theStudent :"+ theStudent.getLastName());
return "form-details";
}
//@ModelAttribute("student") Student theStudent
//Spring automatically populates the object data with form data
//all behind the scenes
现在我们终于有了一个form-details.jsp
:
<b>Student Information</b>
${student.firstName}
${student.lastName}
那么问题来了,Spring MVC中的@ModelAttribute
是什么?以下是源自http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation的定义:
@ModelAttribute
是一种注释,将方法参数或方法返回值绑定到命名模型属性,然后将其公开给Web视图。
它实际上是获取由表单提交的所有值并保存它们以便将它们绑定或分配给对象。 它的工作方式类似于@RequestParameter
,只是我们只获取一个参数并将值分配给某个方法参数。
不同之处在于@ModelAttribute
包含所有表单数据而不是单个参数。 它为您创建一个bean,其中包含在表单中提交的数据。
回顾整个过程:
步骤1:
发送请求并运行我们的方法showForm()
时,设置一个名称为student
的模型,一个临时的bean,并将其转发到表单:
theModel.addAttribute("student", new Student());
步骤2:
表单属性modelAttribute="student"
定义在表单提交时,模型将更新学生并保存表单的所有参数。
步骤3:
在表单提交时,使用参数@ModelAttribute("student") Student theStudent
调用processForm()
方法:获取带有modelAttribute="student"
的表单中保存的值,并将其分配给Student
对象中的字段。
步骤4:
然后我们可以按照我们的意愿使用它,就像在页面上显示它一样,就像我做的那样。
希望这有助于您理解这个概念。谢谢
@ModelAttribute
呢? - Skod无论是 Gmail、Facebook 还是 Instagram,或者任何其他 Web 应用程序,它们都是有关端用户和应用程序之间或 UI 和后端应用程序之间的数据或信息交换。即使在 Spring MVC 的世界中,也有两种交换数据的方式:
我们感兴趣的是数据如何从 UI 传递到控制器。这也可以通过以下两种方式来实现:
使用 HTML 表单:请考虑以下场景,
当我们从 Web 浏览器提交表单数据时,我们可以将该数据作为对象在 Controller 类中访问。当我们提交 HTML 表单时,Spring 容器会执行四个操作。它会,
要使整个过程能够工作,我们需要遵循某些步骤。
我们首先需要定义一个模型类,比如 User,在其中字段的数量应与 HTML 表单中的字段数量完全匹配。而且,我们在 HTML 表单中使用的名称应与我们在 Java 类中使用的名称匹配。这两点非常重要。名称应匹配,表单中的字段数量应与我们创建的类中的字段数量匹配。一旦我们做到了这一点,容器将自动读取传入的数据,创建此模型对象,设置其值并将其移交给 Controller。为了在 Controller 中读取这些值,我们在方法参数上使用 @ModelAttribute 注释。当我们在 Controller 中创建方法时,我们将使用 @ModelAttribute 并添加一个参数,该参数将自动由容器提供给我们。
以下是一个注册用户的示例代码:
@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
model.addAttribute("user", user);
return "regResult";
}
希望这个图解能够帮助到您!这是在Spring MVC
中用于数据绑定的。让我们假设你有一个包含表单元素的JSP页面,例如:
在
JSP
上:
<form:form action="test-example" method="POST" commandName="testModelAttribute"></form:form>
(Spring Form方法,也可以使用简单的表单元素)
在控制器端:
@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {
}
@ModelAttribute可以作为方法参数或在方法声明之前使用。此注释的主要目的是将请求参数或表单字段绑定到模型对象。
将方法参数或方法返回值绑定到命名的模型属性的注释,暴露给Web视图。
public String add(@ModelAttribute("specified") Model model) {
...
}
@ModelAttribute
会创建一个属性,名称由您指定(@ModelAttribute("Testing") Test test)
在给定的示例中,Test是bean,test是对bean的引用,Testing将可用于模型中,以便您可以进一步在jsp页面上使用它来检索存储在@ModelAttribute
中的值。