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可以绑定更复杂的对象,如列表,地图,地图集列表等等,但是在场景后面,它使数据绑定变得非常神奇。
-
我们可以在参数中使用@ModelAttribute同时具有模型注释方法和请求方法处理程序。 那么我们必须把规则结合起来。
-
当然,我们有很多不同的情况 – @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可以用作方法参数/参数或者在方法声明之前。 此批注的主要目标是将请求参数或表单字段绑定到模型对象
我知道我迟到了,但我会像他们所说的那样,“迟到比永远”。 所以,让我们开始,每个人都有自己的方式来解释事情,让我试着总结一下,并简单地为你做几个例子, 假设你有一个简单的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
的值。