Spring MVC中的@ModelAttribute是什么?

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

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

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

在这里查看一个例子(Spring 2.5),另请参阅“在方法参数上使用@ModelAttribute” (Spring 3.1)。

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

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

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

请参阅“在方法上使用@ModelAttribute” (Spring 3.1)。

希望这有助于。

我知道这是一个古老的线程,但我想我把我的帽子扔在戒指,看看我是否可以多一点泥泞的水:)

我发现我最初的理解@ModelAttribute是Spring将几个注释合并为一个的决定的结果。 一旦我把它分成几个较小的注释,它就变得更清晰了:

对于参数注释,@ @ModelAttribute等同于@Autowired + @Qualifier即它试图从Springpipe理模型中检索具有给定名称的bean。 如果找不到命名的bean,而不是抛出错误或返回null ,它隐式地承担@Bean的angular色,即使用默认的构造函数创build一个新的实例,并将该bean添加到模型。

对于方法注释, @Bean + @Before等同于@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从Spring窗体jsp中捕获对象。 例如,我在jsp页面上devise表单,那个表单存在与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) 

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

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

 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 Arras.asList(new[]{“Sofia”,”Pleven","Ruse”});//and so on } 

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

在这里,我们要添加到模型的常用信息,这些信息将在表单中用来显示给用户。 例如,它可以用来填充HTMLselect:

在这里输入图像描述

2.方法论据

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

方法参数上的@ModelAttribute指示参数应该从模型中检索。 因此,在这种情况下,我们期望我们将模型person对象作为关键字,并且我们希望获得它的值并将其放到方法参数Person person中 。 如果这样不存在或(有时你拼错(价值=“persson”))。 然后Spring将不会在模型中find它,并使用其默认值创build空的Person对象。 然后将采取请求参数,并尝试使用其名称将数据绑定在Person对象中。

 name="Dmitrij"&countries=Lesoto&sponsor.organization="SilkRoad"&authorizedFunds=&authorizedHours=& 

所以我们有名字,它将使用setName(String name)绑定到Person.name。 所以在

 //..Some logic with person 

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

当然,Spring可以绑定更复杂的对象,如列表,地图,地图集列表等等,但是在场景后面,它使数据绑定变得非常神奇。

  1. 我们可以在参数中使用@ModelAttribute同时具有模型注释方法和请求方法处理程序。 那么我们必须把规则结合起来。

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

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

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

这在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可以用作方法参数/参数或者在方法声明之前。 此批注的主要目标是将请求参数或表单字段绑定到模型对象

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

我知道我迟到了,但我会像他们所说的那样,“迟到比永远”。 所以,让我们开始,每个人都有自己的方式来解释事情,让我试着总结一下,并简单地为你做几个例子, 假设你有一个简单的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> 

path =“firstName”path =“lastName”这些是StudentClass中的字段/属性,当表单被调用时,它们的getter被调用,但是一旦被提交,他们的setter被调用,并且它们的值被设置在modelAttribute =表单标签中的“学生”。

我们有StudentController,包括以下方法;

 @RequestMapping("/showForm") public String showForm(Model theModel){ //Model is used to pass data between //controllers and views theModel.addAttribute("student", new Student()); //attribute name, value 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视图。

实际发生的是它获取由它提交的所有ur表单的值,然后保存它们形成你绑定或分配给对象。 它像@RequestParameter一样工作,我们只得到一个参数,并赋值给一些字段。 唯一不同的是@ModelAttribute保存所有表单数据而不是单个参数。 它会为您创build一个bean,用于保存表单提交的数据以供开发人员稍后使用。

重述整个事情。 步骤1:发送一个请求,并且我们的方法showForm运行,并且一个模型,一个临时bean被设置,并且学生的名字被转发给表单。 theModel.addAttribute(“student”,new Student());

第2步: modelAttribute =“学生”在表单提交模型改变了学生,现在它拥有fomr的所有参数

第3步: @ModelAttribute(“student”)Student学生我们获取@ModelAttribute所保存的值,并将整个bean /对象分配给Student。

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

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

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