ChatGPT解决这个技术问题 Extra ChatGPT

Spring MVC 中的@ModelAttribute 是什么?

Spring MVC中@ModelAttribute的用途和用途是什么?

我认为这是一个有用的问题,因为它允许读者获得比官方 Spring 文档提供的更多信息(包括示例)。
在这里查看这篇文章。 thespringthing.blogspot.com/2010/11/…

A
Aniket Sahrawat

@ModelAttribute 指的是 Model 对象的一个属性(MVC 中的 M ;)所以假设我们有一个表单,它有一个名为“Person”的表单支持对象,那么您可以让 Spring MVC 通过以下方式将此对象提供给 Controller 方法使用 @ModelAttribute 注释:

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

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

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

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

请参阅"Using @ModelAttribute"


@fasseg 在第一种情况下,您实际上并不需要 @ModelAttribute
@Neil 什么时候需要在方法属性中使用 @ModelAttribute
您应该包括如何填充 Person 以及如何调用此方法。
1
12 revs

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

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

对于参数注释,将 @ModelAttribute 视为 @Autowired + @Qualifier 的等价物,即它尝试从 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 成为一个包罗万象的注释;没有人愿意看到注释大杂烩。


嗯,@Bean 默认是单例的。我不确定相同的概念是否适用于此。
绝对不。我只是用更简单的注解来解释这个复杂的注解。请从概念上理解我的解释,而不是字面意思。
@Zombies 添加 @Scope("request") 然后 :)
S
Saikat

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

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
}

这种方法的目的是在模型中添加属性。因此,在我们的例子中,cities 键将列表 new Arras.asList(new[]{“Sofia”,”Pleven","Ruse”}) 作为模型中的值(您可以将模型视为 map(key:value))。控制器中的 @ModelAttribute 方法在同一控制器中的 @RequestMapping 方法之前调用。

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

https://i.stack.imgur.com/huLxb.png

2.方法参数

public String findPerson(@ModelAttriute(value="person") Person person) {
    //..Some logic with person
    return "person.jsp";
}

方法参数上的 @ModelAttribute 指示应从模型中检索该参数。因此,在这种情况下,我们希望我们在 Model 中的 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 等等,但在幕后它使数据绑定变得神奇。

我们可以同时在参数中使用 @ModelAttribute 对带注释的方法和请求方法处理程序进行建模。然后我们必须联合规则。当然,我们有很多不同的情况 - @ModelAttribute 方法也可以在 @ControllerAdvice 中定义等等......


L
Leang Socheat

对于我的风格,我总是使用 @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)

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


catch 动词准确地描述了 @ModelAttribute 所做的工作。好的。
年度最佳答案。
但有必要吗?这在不使用 @ModelAttribute 注释的情况下仍然有效。
modelAttribute 是新的方式; commandName 是旧方法。 stackoverflow.com/questions/21495616/…
t
t0r0X

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

那么回到 Spring MVC 中的 @ModelAttribute 是什么问题?来自源代码的示例定义,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 步:
表单属性 modelAttribute="student" 定义了在提交表单时,模型将更新学生并保存表单的所有参数。

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

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

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


精湛的解释,这就是我在互联网上寻找的东西。感谢上帝,我看到了你的回复
迄今为止最好的解释
很好的解释。但是方法级别的 @ModelAttribute 呢?
N
Nithin Prasad

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

从 Controller 到 UI,从 UI 到 Controller。

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

使用使用查询参数的 HTML 表单。

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

https://i.stack.imgur.com/fLdHj.jpg

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

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

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

https://i.stack.imgur.com/38qzM.png

我们首先需要定义一个模型类,比如 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";
}

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


是不是需要line mode.AddAttribute("user", user)???因为通过@ModelAttribute(“user”),我认为参数自动绑定到模型属性“user”。
C
Chethan D

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

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


S
Sanoj Kashyap

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

}

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


0
0gam

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

public String add(@ModelAttribute("specified") Model model) {
    ...
}

H
Hamad

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


R
Ragu Venkatesan

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


i
ismael

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

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

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

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


V
Vivek Srivastava

在方法级别

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";
  }