412

@ModelAttributeSpring MVC中的用途和用途是什么?

4

13 回答 13

418

@ModelAttribute指的是 Model 对象的一个​​属性(MVC 中的 M ;)所以假设我们有一个表单,它有一个名为“Person”的表单支持对象然后你可以让 Spring MVC 使用@ModelAttribute注解将此对象提供给 Controller 方法:

public String processForm(@ModelAttribute("person") Person person){
    person.getStuff();
}

另一方面,注释用于定义应该是模型一部分的对象。因此,如果您想在 Model 中引用 Person 对象,可以使用以下方法:

@ModelAttribute("person")
public Person getPerson(){
    return new Person();
}

这个带注释的方法将允许访问 View 中的 Person 对象,因为它会被 Spring 自动添加到 Models 中。

请参阅“使用 @ModelAttribute”

于 2010-08-06T11:56:28.527 回答
150

我知道这是一个旧线程,但我想我把帽子扔进擂台上,看看我能不能把水弄得更混一点:)

我发现我最初难以理解@ModelAttribute的原因是 Spring 决定将几个注释合并为一个。将其拆分为几个较小的注释后,它变得更加清晰:

对于参数注释,可以将@ModelAttribute其视为@Autowired + @Qualifierie,它尝试从 Spring 托管模型中检索具有给定名称的 bean。如果没有找到命名的bean,而不是抛出错误或返回null,它会隐式地扮演一个角色,@Bean即使用默认构造函数创建一个新实例并将bean 添加到模型中。

对于方法注解,可以@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包罗万象的注释的正确决定;没有人愿意看到注释大杂烩。

于 2013-01-31T00:59:08.867 回答
33

对于我的风格,我总是使用 @ModelAttribute 从 spring form jsp 中捕获对象。例如,我在 jsp 页面上设计表单,该表单与 commandName 一起存在

<form:form commandName="Book" action="" methon="post">
      <form:input type="text" path="title"></form:input>
</form:form>

我用下面的代码在控制器上捕获对象

public String controllerPost(@ModelAttribute("Book") Book book)

并且书的每个字段名称必须与表单子元素中的路径匹配

于 2015-12-31T02:50:20.523 回答
31

所以我会尝试用更简单的方式来解释它。让我们:

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 Arras.asList(new[]{“Sofia”,”Pleven","Ruse”})作为模型中的值(您可以将模型视为地图(键:值))。 在同一控制器中,在@RequestMapping方法之前调用控制器中的@ModelAttribute方法。

在这里,我们要向模型中添加公共信息,这些信息将在表单中显示给用户。例如,它可用于填充 HTML 选择:

在此处输入图像描述

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

我们可以使用值“Dimitrij”访问这个填充名称。

当然 Spring 可以绑定更复杂的对象,如 Lists、Maps、List of Sets of Maps 等,但在幕后它使数据绑定变得神奇。

  1. 我们可以同时在参数中使用 @ModelAttribute 对带注释的方法和请求方法处理程序进行建模。然后我们必须联合规则。

  2. 当然,我们有很多不同的情况 - @ModelAttribute 方法也可以在 @ControllerAdvice 中定义等等......

于 2016-12-11T20:11:59.140 回答
27

我知道我迟到了,但我会像他们说的那样引用“迟到总比没有好”。所以让我们开始吧,每个人都有自己的解释方式,让我试着总结一下,并通过一个例子为你分几步简单; 假设你有一个简单的表格,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>

<form:input path="firstName" /> <form:input path="lastName" />这些是 Student 类中的字段/属性。当表单被调用/初始化时,它们的 getter 被调用。在表单提交时,它们的设置器被调用,它们的值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}

回到问题@ModelAttributeSpring MVC 中有什么?来自源代码的示例定义, http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation@ModelAttribute将方法参数或方法返回值绑定到命名模型属性的注释,然后将其公开给 Web 视图。

实际发生的是它获取表单中所有由它提交的值,然后保存它们以供您绑定或分配给对象。它的工作原理就像@RequestParameter我们只获取一个参数并将值分配给某个方法参数。不同之处在于它@ModelAttribute保存所有表单数据而不是单个参数。它为您创建一个 bean,其中包含表单中提交的数据。

回顾一下整个事情:

第 1 步:
发送请求并showForm()运行我们的方法,并使用名称设置模型(临时 bean)student并转发到表单:
theModel.addAttribute("student", new Student());

第 2 步:
Form 属性modelAttribute="student"定义了在提交表单时模型将更新学生并保存表单的所有参数。

第 3 步:
在提交表单processForm()时,使用参数调用该方法@ModelAttribute("student") Student theStudent:获取表单中保存的值modelAttribute="student"并将其分配给Student对象中的字段。

第 4 步:
然后我们在出价时使用它,就像我在页面上显示它一样

我希望它能帮助你理解这个概念。谢谢

于 2017-11-09T17:00:13.063 回答
13

以任何 Web 应用程序为例,无论是 Gmail、Facebook、Instagram 还是任何其他 Web 应用程序,它都是关于在最终用户与应用程序或 UI 与后端应用程序之间交换数据或信息的。即使在 Spring MVC 世界中,也有两种交换数据的方式:

  1. 从控制器到 UI,以及
  2. 从 UI 到控制器。

我们在这里感兴趣的是数据是如何从 UI 传递到 Controller 的。这也可以通过两种方式完成:

  1. 使用 HTML 表单
  2. 使用查询参数。

使用 HTML 表单:考虑以下场景,

表单提交表示

当我们从 Web 浏览器提交表单数据时,我们可以在 Controller 类中以对象的形式访问该数据。当我们提交 HTML 表单时,Spring 容器会做四件事。它会,

  1. 首先使用request.getParameter方法读取请求中提交的所有数据。
  2. 一旦读取它们,它将使用integer.parseIntdouble.parseDouble和所有其他可用的基于数据的数据类型的解析方法将它们转换为适当的 Java 类型。
  3. 解析后,它将创建我们创建的模型类的对象。例如,在这种情况下,提交的是用户信息,我们创建了一个名为 User 的类,Container 将为其创建一个对象,并将自动进入该对象的所有值设置为该对象。
  4. 然后它将通过将值设置给控制器来移交该对象。

为了让整个事情发挥作用,我们必须遵循某些步骤。

内部工作

我们首先需要定义一个模型类,比如 User,其中的字段数应该与 HTML 表单中的字段数完全匹配。此外,我们在 HTML 表单中使用的名称应该与我们在 Java 类中的名称相匹配。这两点非常重要。名称应匹配,表单中的字段数应与我们创建的类中的字段数匹配。一旦我们这样做了,容器将自动读取进来的数据,创建这个模型的一个对象,设置值并将其交给控制器。要在 Controller 中读取这些值,我们使用@ModelAttribute方法参数上的注释。当我们在 Controller 中创建方法时,我们将使用 @ModelAttribute 并向其添加一个参数,该参数将自动获得由 Container 提供的该对象。

下面是一个注册用户的示例代码:

@RequestMapping(value = "registerUser", method = RequestMethod.POST)
public String registerUser(@ModelAttribute("user") User user, ModelMap model) {
    model.addAttribute("user", user);
    return "regResult";
}

希望这个图解解释有所帮助!

于 2019-03-01T08:49:12.447 回答
4

@ModelAttribute 可以用作方法参数/参数或方法声明之前。此注解的主要目的是将请求参数或表单字段绑定到模型对象

参考。http://www.javabeat.net/modelattribute-spring-mvc/

于 2015-12-14T14:03:52.220 回答
4

这用于 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,...) {

}

现在,当您提交表单时,您可以使用表单字段值。

于 2016-08-24T07:05:39.080 回答
4

将方法参数或方法返回值绑定到命名模型属性的注释,公开给 Web 视图。

public String add(@ModelAttribute("specified") Model model) {
    ...
}
于 2016-04-25T09:23:34.310 回答
1

@ModelAttribute 只是将 jsp 字段中的值绑定到 Pojo calss 以在控制器类中执行我们的逻辑。如果您熟悉 struts,那么这就像在提交时填充 formbean 对象。

于 2018-05-01T17:32:51.540 回答
1

@ModelAttribute将使用您在给定示例中指定的名称创建一个属性(@ModelAttribute("Testing") Test test) as Testing ,Test 是 bean test 是对 bean 的引用,并且 Testing 将在模型中可用,以便您可以在 jsp 页面上进一步使用它来检索您存储的值在你ModelAttribute

于 2016-01-28T07:50:30.980 回答
0

在方法级别

1.在方法级别使用注解时,表明该方法的目的是添加一个或多个模型属性

@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("india", "india");
}

在方法参数处 1. 当用作方法参数时,它表示应该从模型中检索参数。当不存在并且应该首先实例化然后添加到模型中并且一旦存在于模型中时,应该从具有匹配名称的所有请求参数填充参数字段因此,它将表单数据与bean绑定。

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }
于 2019-10-30T10:52:58.797 回答
0

ModelAttribute 注解用作 Spring MVC Web 应用程序的一部分,可用于两种场景。

首先,它可以用于将数据注入到预 JSP 加载模型中。这在确保需要 JSP 来显示所有数据本身时特别有用。通过将一种方法连接到模型来获得注入。

其次,它可用于从现有模型中读取数据并将其分配给教练方法的参数。

参考https://dzone.com/articles/using-spring-mvc%E2%80%99s

于 2019-02-02T12:07:44.097 回答