Spring MVC 和 @ModelAttribute 注解

x33g5p2x  于2022-09-25 转载在 Spring  
字(3.3k)|赞(0)|评价(0)|浏览(271)

1 概述

最重要的 Spring-MVC 注解之一是 @ModelAttribute 注解。

  • @ModelAttribute* 是一个注解,它将方法参数或方法返回值绑定到命名模型属性,然后将其公开给 Web 视图。

在下面的示例中,我们将通过一个通用概念演示注解的可用性和功能:从公司员工提交的表单。

2 @ModelAttribute 深度

正如介绍性段落所揭示的,@ModelAttribute 可以用作方法参数或方法级别。

2.1 在方法级别

在方法级别使用注解时,它表明该方法的目的是添加一个或多个模型属性。此类方法支持与 @RequestMappingmethods 相同的参数类型,但不能直接映射到请求。

让我们看一个简单的例子来开始理解它是如何工作的:

@ModelAttribute
public void addAttributes(Model model) {
    model.addAttribute("msg", "Welcome to the Netherlands!");
}

在示例中,我们展示了一个方法,该方法将名为 msg 的属性添加到控制器类中定义的所有 models。

当然,我们将在本文后面看到这一点。

一般来说,Spring-MVC 总是先调用该方法,然后再调用任何请求处理程序方法。 也就是说,在调用带有 @RequestMapping 注解的控制器方法之前调用 @ModelAttribute 方法。 该序列背后的逻辑是,必须在控制器方法内部开始任何处理之前创建模型对象。

将相应的类注解为 @ControllerAdvice 也很重要。因此,您可以在将被标识为全局的 Model 中添加值。这实际上意味着对于每个请求,对于响应部分中的每个方法,都存在一个默认值。

2.2 作为方法参数

当用作方法参数时,它指示应从模型中检索参数。当不存在时,它应该首先被实例化,然后添加到模型中,一旦出现在模型中,参数字段应该从具有匹配名称的所有请求参数中填充。

employee 模型属性后面的代码片段中,填充了来自提交给 addEmployee 端点的表单的数据。 Spring MVC 在调用提交方法之前在后台执行此操作:

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

稍后,在本文中,我们将看到一个完整示例,说明如何使用 employee 对象来填充 employeeView 模板。

因此,它将表单数据与 bean 绑定。 带有 @RequestMapping 注解的控制器可以具有带有 @ModelAttribute 注解的自定义类参数。

这就是 Spring-MVC 中通常所说的数据绑定,这是一种通用机制,可以让您不必单独解析每个表单字段。

3 表格示例

在本节中,我们将提供概述部分中提到的示例:提示用户(在我们的具体示例中为公司员工)输入一些个人信息(特别是 name 和 *id)的非常基本的表单。 * 提交完成且没有任何错误后,用户希望看到之前提交的数据,显示在另一个屏幕上。

3.1 观点

让我们首先创建一个带有 id 和 name 字段的简单表单:

<form:form method="POST" action="/spring-mvc-basics/addEmployee"
  modelAttribute="employee">
    <form:label path="name">Name</form:label>
    <form:input path="name" />
     
    <form:label path="id">Id</form:label>
    <form:input path="id" />
     
    <input type="submit" value="Submit" />
</form:form>

3.2 控制器

这是控制器类,其中正在实现上述视图的逻辑:

@Controller
@ControllerAdvice
public class EmployeeController {
 
    private Map<Long, Employee> employeeMap = new HashMap<>();
 
    @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    public String submit(
      @ModelAttribute("employee") Employee employee,
      BindingResult result, ModelMap model) {
        if (result.hasErrors()) {
            return "error";
        }
        model.addAttribute("name", employee.getName());
        model.addAttribute("id", employee.getId());
 
        employeeMap.put(employee.getId(), employee);
 
        return "employeeView";
    }
 
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("msg", "Welcome to the Netherlands!");
    }
}

submit() 方法中,我们有一个 Employee 对象绑定到我们的视图。你能看出这个注解的威力吗?您可以像这样简单地将表单字段映射到对象模型。在该方法中,我们从表单中获取值并将它们设置为 ModelMap

最后我们返回 employeeView,这意味着相应的 JSP 文件将被称为 View 代表。

此外,还有一个 addAttributes() 方法。其目的是在将在全球范围内识别的 Model 中添加值。也就是说,默认值将作为对每个控制器方法的每个请求的响应返回。我们还必须将特定类注解为 @ControllerAdvice

3.3 模型

如前所述,Model 对象非常简单,包含“前端”属性所需的所有内容。现在,让我们看一个例子:

@XmlRootElement
public class Employee {
 
    private long id;
    private String name;
 
    public Employee(long id, String name) {
        this.id = id;
        this.name = name;
    }
 
    // standard getters and setters removed
}

3.4 总结

@ControllerAdvice 协助控制器,特别是适用于所有 @RequestMapping 方法的 @ModelAttribute 方法。当然,我们的 addAttributes() 方法将是第一个运行的,在其余的 @RequestMapping 方法之前。

记住这一点,在 submit()addAttributes() 都运行后,我们可以在 Controller 类返回的 View 中引用它们,方法是在美元化的花括号中提及它们的名字-大括号二重奏,例如 ${name}

3.5 结果视图

现在让我们打印我们从表单中收到的内容:

<h3>${msg}</h3>
Name : ${name}
ID : ${id}

4 结论

在本教程中,我们研究了 *@ModelAttribute *注解的用法,用于方法参数和方法级用例

相关文章