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

有帮助吗?

解决方案

@ModelAttribute 指模型对象的属性(MVC中的M;),因此,假设我们的表单具有称为“人”的形式的对象,那么您可以使用Spring MVC通过使用该对象将此对象提供给控制器方法 @ModelAttribute 注解:

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

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

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

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

“使用@ModelAttribute”.

其他提示

我知道这是一个古老的线程,但我想我把我的帽子环,看看我能搅浑了水多一点点:)

我发现我最初很难理解@ModelAttribute是春天决定一些注释合并成一个的结果。它变得更清晰,一旦我把它分解成几个较小的注解:

有关参数注释,认为@ModelAttribute为等效的@Autowired + @Qualifier即它试图从Spring管理模型给定的名称检索bean的。如果没有找到的,而不是抛出一个错误或返回null命名的豆,它含蓄地呈现的@Bean即角色使用默认构造函数创建一个新的实例和bean添加到模型中。

有关方法注解,认为@ModelAttribute作为@Bean + @Before的等效的,即,它把由用户在模型代码构造的豆和一个请求处理方法之前,它总是被调用。

打个比方,我看到@ModelAttribute如下面的(请不要采取它的字面!!):

@Bean("person")
@Before
public Person createPerson(){
  return new Person();
}

@RequestMapping(...)
public xxx handlePersonRequest( (@Autowired @Qualifier("person") | @Bean("person")) Person person, xxx){
  ...
}

正如你所看到的,春天做出了正确的决定,使@ModelAttribute一个包罗万象的注释;没有人愿意看到注解自助餐。

有关我的风格,我总是用@ModelAttribute来捕捉对象从Spring表单JSP。例如,我jsp页面上设计形式,即形式存在与命令名

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

和我赶在物体上控制器后续代码

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

和本书的每一字段名称必须是匹配与形式的子元素路径

所以,我将试图解释它在更简单的方法。让我们有:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

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

所描述的弹簧视文件的 @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”}) 作为价值的模型(你可以认为模型的地图(项:值)). @ModelAttribute 方法中的一个控制器是援引之前 @RequestMapping 方法,在相同的控制器。

在这里,我们想到加共同信息模型将使用的形式以显示用户使用。例如,它可以用来填补一个HTML选择:

enter image description here

2.方法论

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

一个@ModelAttribute上的方法的参数表示的论点应该可以从中检索模式。因此,在这种情况下,我们希望,我们在模型 对象为关键,我们希望得到它的价值,并把它的方法参数 人人.如果不存在,或者(有时你拼错的(value="佩尔松"))然后春天不会找到它的模型,并将创造空的人目的使用它的默认。然后将采取的请求的参数和尝试的数据结合他们的个人目的使用他们的名字。

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

所以我们的名字,并将被结合到人。名称的使用setName(String名)。所以

//..Some logic with person

我们有访问这个充满名与价值"的迪米特里伊".

当然,弹簧可以结合更复杂的对象像列表、地图、列表的设置的地图和所以上,但在幕后,它使得数据结合的魔法。

  1. 我们可以在同一时间模式附加说明的方法和要求的方法处理程序与@ModelAttribute的论点。然后,我们必须联盟的规则。

  2. 当然,我们有大量的不同情况下的-@ModelAttribute方法也可以被定义中的一个@ControllerAdvice等等...

我知道我迟到了,但我还要举像他们说的, “最好是比从不迟到。”因此,让我们出发吧, 每个人都有自己的方式来解释的东西,让我试着总结一下,简单的它为您在用一个例子几步; 假设有一个简单的形式,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>

路径= “名字” 路径=“姓氏” 这些是场/在StudentClass属性 当形式被称为其吸气剂被称为但一旦提交了它们的设置器被称为和它们的值在被指示的那个的ModelAttribute =在form标签“学生”的豆设置。

我们有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 

现在我们终于有一个表格-details.jsp

<b>Student Information</b>
${student.firstName}
${student.lastName}

所以回到刚才的问题是什么@ModelAttribute在Spring MVC? 从源头上为您的样品定义, http://www.baeldung.com/spring-mvc-and-在-的ModelAttribute的注释 @ModelAttribute 是一个注释结合的方法参数或方法返回值来命名模型属性,然后将其暴露到Web视图。

而实际上,它得到所有那些提交了它的表单的值,然后保存他们为你绑定或将其分配给对象。 它的工作原理相同,如 @RequestParameter 在这里我们只得到一个参数赋值给一些领域。 唯一的区别是<强> @ModelAttribute 包含所有形式的数据,而不是一个单一的参数。它创建你一个bean保存形式提交的数据要由显影剂以后使用上。

要回顾一下整个事情。 步骤1 : 请求被发送,我们的方法showForm运行和模型,临时豆设置名为学生被转发到窗体。 的 theModel.addAttribute( “学生”,新学生());

步骤2: 的 的ModelAttribute = “学生” 表单提交模型改变学生,现在,它保持该表格的所有参数

3步: 的 @ModelAttribute( “学生”)学生theStudent 我们通过获取的值是保持 @ModelAttribute 并分配全豆/对象的学生。

步骤4: 然后我们把它作为我们出价,就像它显示在页面等,像我一样。

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

采取任何网络应用程序是否是快速Facebook或Instagram或任何其他网应用程序,它是所有关于交换数据或信息之间的终端用户和应用程序或用户界面和后端应用程序。即使在春天视世界上有两种方式来交换数据:

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

我们感兴趣这是如何的数据被传达从UI到控制器。这也可以在2种方式:

  1. 采用HTML格式
  2. 使用的查询参数。

使用HTML形式:考虑以下方案中,

Form Submission Representation

当我们提交的数据的网络浏览器,我们可以访问该数据在我们的控制器类作为一个对象。当我们提交一份HTML形式,弹簧容器做四件事情。它会,

  1. 第一次读到的所有数据提交的,涉及在请求使用 请求。getParameter 法。
  2. 一旦读取他们,将他们转换成适当的Java类型的使用 整数。确给出, 一倍。parseDouble 和所有其他分析方法,提供基础数据类型的数据。
  3. 一旦分析,它将创造一个对象的模型类,我们创建的。例如,在这种情况下,它是用户信息,提交和我们创建一类称为用户、其容器将创造一个目的,它将设置的所有价值观,来自动成,对象。
  4. 然后,它将切换的,对象,通过设置价值向控制器。

获得这整件事的工作,我们将必须按照某些步骤。

Internal working

我们首先需要定义一个模式类似的用户,在这些领域应完全匹配的数量的领域在HTML形式。此外,名字,我们在使用HTML格式应相匹配的名称,我们已经在Java类。这两个都是非常重要的。名字应符合数字段的形式应该符合这些领域在类,我们创建的。一旦我们做到这一点,容器将会自动读取的数据来,创建一个对象的这种模式,设置价值观和它的手中,它通过向控制器。阅读这些价值观的内部控制器,我们使用 @ModelAttribute 批注的方法的参数。当我们创造的方法在控制器,我们将使用@ModelAttribute,并添加一个参数,这将自动具有这个目的给予通过的容器。

这里的一个例子是代码,用于注册用户:

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

希望这个图解说明。

此用于数据在Spring MVC结合的目的。让你有在它具有形式元件一个jsp e.g

  

JSP

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

(Spring表单的方法,简单的形式元件也可以使用)

  

在控制器侧

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

}

现在,当您将提交表单的表单字段的值将提供给你。

注释结合的方法参数或方法返回值来命名模型属性,暴露于web视图。

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

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

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

@ModelAttribute将创建与您在给定的例子(@ModelAttribute("Testing") Test test) as Testing,试验是豆测试作为参考豆和测试将在模型可用,以便您可以进一步使用它进行检索jsp页面中指定的名称的属性的,你存储在你ModelAttribute值。

@ModelAttribute简单地结合从JSP字段POJO的CALSS到控制器类中执行我们的逻辑值。如果熟悉支柱,那么这是像在提交填充的formbean对象。

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

首先,它可以被用于将数据注入到预JSP负荷模型。这是保证一个JSP需要显示所有的数据本身是特别有用的。的注射是通过一种方法连接到所述模型获得。

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

https://dzone.com/articles/using-弹簧-MVC%E2%80%99S

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top