什么是Spring MVC中的@ModelAttribute?

时间:2010-08-06 11:20:31

标签: java spring-mvc modelattribute

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

13 个答案:

答案 0 :(得分:376)

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

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

Check here示例(Spring 2.5),另见"Using @ModelAttribute on a method argument"(Spring 3.1)。

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

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

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

"Using @ModelAttribute on a method"(春季3.1)。

希望这会有所帮助。

答案 1 :(得分:125)

我知道这是一个老话题,但我想我把帽子戴在戒指上,看看我是否能把水弄得更干净了一些:)

我发现我最初理解@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成为一个包罗万象的注释;没有人想看到一个注释smorgasbord。

答案 2 :(得分:22)

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

并且书的每个字段名称必须与表单

的子元素中的路径匹配

答案 3 :(得分:17)

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

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }
}

如Spring MVC文档中所述 - @ModelAttribute 注释可用于方法方法参数。当然,我们可以在一个控制器中同时使用它们。

1.Method annotation

@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(键:值))。控制器中的 @ModelAttribute 方法在同一控制器中的 @RequestMapping 方法之前调用。

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

enter image description here

2.Method参数

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

方法参数上的@ModelAttribute指示应从模型中检索参数。因此,在这种情况下,我们希望我们在模型 person 对象中作为键,我们希望获取其值并将其放入方法参数 Person person 。如果不存在或(有时你拼错了(value =&#34; persson&#34;))那么Spring将不会在模型中找到它并使用其默认值创建空Person对象。然后将获取请求参数并尝试使用其名称将数据绑定到Person对象中。

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

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

//..Some logic with person

我们可以使用价值&#34; Dimitrij&#34;来访问这个填充的名称。

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

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

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

答案 4 :(得分:9)

我知道我迟到了,但我会像他们说的那样引用, &#34;最好迟到而不是#34;。让我们开始吧 每个人都有自己的方式来解释事情,让我尝试总结一下,并通过一个例子在几个步骤中为你简单化; 假设您有一个简单的表单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>

路径=&#34;的firstName&#34; 路径=&#34; lastName的&#34; 这些是StudentClass中的字段/属性 当表单被调用时,他们的getter被调用但是一旦被提交,他们的setter被调用并且他们的值被设置在modelAttribute =&#34; student&#34;中指定的bean中。在表格标签中。

我们有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 包含所有表单数据而不是单个参数。它为您创建了一个bean,用于保存表单提交的数据,供开发人员稍后使用。

回顾整个事情。 步骤1 : 发送一个请求,我们的方法showForm运行,一个模型,一个临时bean设置名称student转发到表单。 theModel.addAttribute(&#34; student&#34;,new Student());

第2步: 的 的ModelAttribute =&#34;学生&#34; 在表单提交模型上更改学生,现在它保存表单的所有参数

第3步: @ModelAttribute(&#34;学生&#34;)学生theStudent 我们获取 @ModelAttribute 所持有的值,并将整个bean /对象分配给Student。

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

我希望它可以帮助您理解这个概念。感谢

答案 5 :(得分:4)

Annotation that binds a method parameter or method return value to a named model attribute, exposed to a web view.

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

答案 6 :(得分:3)

这用于Spring MVC中的数据绑定目的。让你有一个带有表单元素的jsp,例如

  

on JSP

<form:form action="test-example" method="POST" commandName="testModelAttribute"> </form:form>

(Spring Form方法,也可以使用Simple form元素)

  

在控制器端

@RequestMapping(value = "/test-example", method = RequestMethod.POST)
public ModelAndView testExample(@ModelAttribute("testModelAttribute") TestModel testModel, Map<String, Object> map,...) {

}

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

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

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

  1. 从Controller到UI,以及
  2. 从用户界面到控制器。

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

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

使用HTML表单: 考虑以下情形,

Form Submission Representation

当我们从Web浏览器提交表单数据时,我们可以将其作为对象访问Controller类中的数据。当我们提交HTML表单时,Spring容器会做四件事。会

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

要使整个工作正常进行,我们必须遵循某些步骤。

Internal working

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

希望这个图解说明有所帮助!

答案 9 :(得分:1)

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

答案 10 :(得分:0)

ModelAttribute批注用作Spring MVC Web应用程序的一部分,并且可以在两种情况下使用。

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

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

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

答案 11 :(得分:0)

在方法级别

1。当在方法级别使用注释时,表示该目的    方法是添加一个或多个模型属性

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

在方法参数上  1.用作方法参数时,它指示应从模型中检索参数。如果不存在,则应首先实例化,然后将其添加到模型中,然后再添加到模型中,则应从所有具有匹配名称的请求参数中填充arguments字段,以便将表单数据与Bean绑定。

 @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
  public String submit(@ModelAttribute("employee") Employee employee) {
  return "employeeView";
  }

答案 12 :(得分:-1)

function openurl($url, $postvars = "") { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, '3'); $content = trim(curl_exec($ch)); curl_close($ch); return $content; } 将在给定的示例中使用您@ModelAttribute指定的名称创建一个属性,Test是bean测试,是对bean的引用,测试将在模型中可用,以便您可以进一步在jsp页面上使用它来检索存储在(@ModelAttribute("Testing") Test test) as Testing中的值。