• Spring MVC 和 @ModelAttribute 注释


    1. 概述

    最重要的SpringMVC注释之一是@ModelAttribute注释。

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

    在本教程中,我们将通过一个通用概念(公司员工提交的表单)来演示此注释的可用性和功能。

    延伸阅读:

    Spring MVC 中的 Model、ModelMap 和 ModelAndView

    了解Spring MVC提供的接口ModelModelMapModelAndView

    阅读更多

    春季@RequestParam注释

    春季@RequestParam注释的详细指南

    阅读更多

    2.@ModelAttribute深度

    正如介绍性段落所揭示的,我们可以将其用作方法参数@ModelAttribute也可以在方法级别使用。

    2.1. 在方法级别

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

    让我们看一个快速示例来了解它是如何工作的:

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

    在上面的示例中,我们看到一个方法,该方法将一个名为msg的属性添加到控制器类中定义的所有模型s。

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

    通常,Spring MVC 总是在调用任何请求处理程序方法之前先调用该方法。基本上,@ModelAttribute方法在调用注释的控制器方法之前@RequestMapping被调用。这是因为必须在控制器方法内部开始任何处理之前创建模型对象。

    同样重要的是,我们将相应的类注释为@ControllerAdvice。因此,我们可以在模型中添加将被标识为全局的值。这实际上意味着对于每个请求,响应中的每个方法都存在默认值。

    2.2. 作为方法参数

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

    在下面的代码片段中,我们将使用提交到addEmployee终结点的表单中的数据填充员工模型属性。Spring MVC 在调用提交方法之前在幕后执行此操作:

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

    在本文的后面部分,我们将看到如何使用employee对象填充employeeView模板的完整示例。

    它将表单数据与 Bean 绑定。批注的控制器@RequestMapping可以具有批注的自定义类参数@ModelAttribute

    在Spring MVC中,我们将其称为数据绑定,这是一种通用机制,使我们不必单独解析每个表单字段。

    3. 表格示例

    在本节中,我们将查看概述部分中概述的示例,这是一个非常基本的表单,提示用户(特别是公司员工)输入一些个人信息(特别是姓名ID)。提交完成后,并且没有任何错误,用户希望在另一个屏幕上看到以前提交的数据。

    3.1. 视图

    让我们首先创建一个包含 id 和名称字段的简单表单:

    1. <form:form method="POST" action="/spring-mvc-basics/addEmployee"
    2. modelAttribute="employee">
    3. <form:label path="name">Name</form:label>
    4. <form:input path="name" />
    5. <form:label path="id">Id</form:label>
    6. <form:input path="id" />
    7. <input type="submit" value="Submit" />
    8. </form:form>

    3.2. 控制

    下面是控制器类,我们将在其中实现上述视图的逻辑:

    1. @Controller
    2. @ControllerAdvice
    3. public class EmployeeController {
    4. private Map<Long, Employee> employeeMap = new HashMap<>();
    5. @RequestMapping(value = "/addEmployee", method = RequestMethod.POST)
    6. public String submit(
    7. @ModelAttribute("employee") Employee employee,
    8. BindingResult result, ModelMap model) {
    9. if (result.hasErrors()) {
    10. return "error";
    11. }
    12. model.addAttribute("name", employee.getName());
    13. model.addAttribute("id", employee.getId());
    14. employeeMap.put(employee.getId(), employee);
    15. return "employeeView";
    16. }
    17. @ModelAttribute
    18. public void addAttributes(Model model) {
    19. model.addAttribute("msg", "Welcome to the Netherlands!");
    20. }
    21. }

    submit() 方法中,我们有一个绑定到视图Employee对象。我们可以简单地将表单字段映射到对象模型。在该方法中,我们从窗体中获取值并将其设置为模型映射

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

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

    3.3. 模型

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

    1. @XmlRootElement
    2. public class Employee {
    3. private long id;
    4. private String name;
    5. public Employee(long id, String name) {
    6. this.id = id;
    7. this.name = name;
    8. }
    9. // standard getters and setters removed
    10. }

    3.4. 总结

    @ControllerAdvice协助控制器,特别是@ModelAttribute适用于所有方法的方法@RequestMapping。当然,我们的addAttributes() 方法将首先运行,先于其他@RequestMapping方法。

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

    3.5. 结果视图

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

    1. <h3>${msg}</h3>
    2. Name : ${name}
    3. ID : ${id}

    4. 结论

    在本文中,我们研究了方法参数和方法级用例中@ModelAttribute注释的使用

    本文的实现可以在github项目中找到。

  • 相关阅读:
    Python 踩坑记 -- 调优
    call apply bind 区别与联系
    nextTick 使用场景
    设计模式(15)组合模式
    HTML5期末考核大作业——学生网页设计作业源码HTML+CSS+JavaScript 中华美德6页面带音乐文化
    java计算机毕业设计共享汽车管理系统MyBatis+系统+LW文档+源码+调试部署
    常见的反爬虫风控 | IP风控
    LNMP架构
    ImageReward:文本到图像生成中的人类偏好学习
    (c语言进阶)字符串函数、字符分类函数和字符转换函数
  • 原文地址:https://blog.csdn.net/allway2/article/details/127777985