• SpringBoot--@ModelAttribute--使用/实例


    原文网址:SpringBoot--@ModelAttribute--使用/实例_IT利刃出鞘的博客-CSDN博客

    简介

    说明

            本文介绍@ModelAttribute注解的用法。

    作用

            @ModelAttribute可以用在方法参数上或方法上,它的作用主要是当注解在方法参数上时会将注解的参数对象添加到Model中。若被@ModelAttribute注释的方法不是请求方法,则此方法会在此controller每个方法执行前被执行。

    使用场景

            当@ModelAttribute注解用于方法时,与其处于同一个处理类的所有请求方法执行前都会执行一次此方法,这可能并不是我们想要的,我们使用更多的是将其应用在请求方法的参数上。

            @ModelAttribute的一部分功能与@RequestParam注解是一致的,只不过@RequestParam用于绑定单个参数值,而@ModelAttribute注解可以绑定所有名称匹配的,此外它自动将绑定后的数据添加到模型中。

    用法1:用在方法上获得任意实体

    代码

    实体类

    1. package com.example.entity;
    2. import lombok.Data;
    3. @Data
    4. public class User {
    5. private Integer id;
    6. private String name;
    7. private Integer age;
    8. }

     控制器

    1. package com.example.controller;
    2. import com.example.entity.User;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. @RestController
    6. @RequestMapping("/hello")
    7. public class HelloController {
    8. @RequestMapping("/test1")
    9. public User test1(User user) {
    10. System.out.println("HelloController.test1");
    11. return user;
    12. }
    13. }

    @ModelAttribute类

    1. package com.example.advice;
    2. import com.example.entity.User;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ModelAttribute;
    5. import javax.servlet.http.HttpServletRequest;
    6. @ControllerAdvice
    7. public class GlobalControllerAdvice {
    8. @ModelAttribute
    9. public User authenticationUser(HttpServletRequest httpServletRequest, User user) {
    10. System.out.println("GlobalControllerAdvice.authenticationUser");
    11. System.out.println("URL:" + httpServletRequest.getRequestURL());
    12. if (user.getName() != null && "Tony".equals(user.getName())) {
    13. user.setAge(20);
    14. return user;
    15. }
    16. throw new RuntimeException("用户名错误");
    17. }
    18. }

    测试

    postman访问:http://localhost:8080/hello/test1?name=Tony 

    后端结果

    1. GlobalControllerAdvice.authenticationUser
    2. URL:http://localhost:8080/hello/test1
    3. HelloController.test1

    postman结果

    1. {
    2. "id": null,
    3. "name": "Tony",
    4. "age": 20
    5. }

     postman访问:http://localhost:8080/hello/test1?name=Stark 

    后端结果

    1. GlobalControllerAdvice.authenticationUser
    2. URL:http://localhost:8080/hello/test1
    3. 2020-09-05 18:17:41.669 ERROR 4240 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: 用户名错误] with root cause
    4. java.lang.RuntimeException: 用户名错误
    5. at com.example.advice.GlobalControllerAdvice.authenticationUser(GlobalControllerAdvice.java:19) ~[classes/:na]

    postman结果

    HTTP Status 500 – Internal Server Error

    用法2:用在参数上获得实体

            @ModelAttribute注释方法的一个参数表示应从模型model中取得。若在model中未找到,那么这个参数将先被实例化后加入到model中。若在model中找到,则请求参数名称和model属性字段若相匹配就会自动填充。这个机制对于表单提交数据绑定到对象属性上很有效。

    代码

    1. package com.example.controller;
    2. import com.example.entity.User;
    3. import org.springframework.ui.Model;
    4. import org.springframework.web.bind.annotation.ModelAttribute;
    5. import org.springframework.web.bind.annotation.RequestMapping;
    6. import org.springframework.web.bind.annotation.RestController;
    7. @RestController
    8. public class HelloController {
    9. // 方法1:通过返回值的方式默认地将添加一个属性
    10. // 属性名没有被显式指定的时:框架将根据属性的类型给予一个默认名称
    11. // 例如:本例返回一个 User 类型的对象,则默认的属性名为"user"
    12. // 你可以通过设置 @ModelAttribute 注解的值来改变默认值 @ModelAttribute("myUser")
    13. @ModelAttribute("user")
    14. public User addUser(String name) {
    15. System.out.println("addUser without model");
    16. User user = new User();
    17. user.setName(name);
    18. return user;
    19. }
    20. @RequestMapping("/test")
    21. public User test(@ModelAttribute("user")User user) {
    22. user.setAge(22);
    23. return user;
    24. }
    25. }

    测试

    访问:http://localhost:8080/test?name=Tony

    响应:

    1. {
    2. "id": null,
    3. "name": "Tony",
    4. "age": 22
    5. }

    用法3:用在方法上设置属性

            有两种类型的@ModelAttribute方法。一种是:只加入一个属性,用方法的返回类型隐含表示。另一种是:方法接受一个Model类型的参数,这个model可以加入任意多个model属性。

    后端

    1. package com.example.controller;
    2. import com.example.entity.User;
    3. import org.springframework.stereotype.Controller;
    4. import org.springframework.ui.Model;
    5. import org.springframework.web.bind.annotation.ModelAttribute;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.servlet.ModelAndView;
    8. @Controller
    9. public class HelloController {
    10. // 方法1:通过返回值的方式默认地将添加一个属性
    11. // 属性名没有被显式指定的时:框架将根据属性的类型给予一个默认名称
    12. // 例如:本例返回一个 User 类型的对象,则默认的属性名为"user"
    13. // 你可以通过设置 @ModelAttribute 注解的值来改变默认值 @ModelAttribute("myUser")
    14. @ModelAttribute
    15. public User addUser(String name) {
    16. System.out.println("addUser without model");
    17. User user = new User();
    18. user.setName(name);
    19. return user;
    20. }
    21. // 方法2:方法接收一个 Model 对象,然后可以向其中添加任意数量的属性
    22. @ModelAttribute
    23. public void addUser(String name, Model model) {
    24. System.out.println("addUser with model");
    25. model.addAttribute("name", "Tony");
    26. model.addAttribute("age", 20);
    27. }
    28. @RequestMapping("/test")
    29. public ModelAndView test() {
    30. return new ModelAndView("hello");
    31. }
    32. }

    前端

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. 账户名称:${account.name}<br/>
    8. 年龄:${account.age}<br/>
    9. number:${number}<br/>
    10. other:${other}<br/>
    11. </body>
    12. </html>

    用法4:@ModelAttribute和@RequestMapping同时注释一个方法

    后端 

    1. @Controller
    2. @RequestMapping(value="/test")
    3. public class TestController {
    4. @RequestMapping(value = "/helloWorld")
    5. @ModelAttribute("attributeName")
    6. public String helloWorld() {
    7. return "hi";
    8. }
    9. }

            这时这个方法的返回值并不是表示一个视图名称,而是model属性的值,视图名称由RequestToViewNameTranslator根据请求"/helloWorld"转换为helloWorld。Model属性名称由@ModelAttribute(value="")指定,相当于在request中封装了key=attributeName,value=hi。

    前端Jsp页面

    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    2. <html>
    3. <head>
    4. <title>helloWorld</title>
    5. </head>
    6. <body>
    7. The attributeValue is: ${attributeName}
    8. </body>
    9. </html>

  • 相关阅读:
    乐观锁和悲观锁在kubernetes中的应用
    聊聊.NET Core处理全局异常有那些方法
    【Confluence】使用start-confluence.sh命令重启后提示找不到网页HTTP404
    苍穹外卖(八) 使用WebSocket协议完成来单提醒及客户催单功能
    Linux命令(115)之journalctl
    【Java 进阶篇】使用 JDBCTemplate 执行 DML 语句详解
    SpringBoot 开放HTTPS HTTP ,并且强制HTTP转HTTPS端口
    网站有绕过认证逻辑漏洞怎么修复
    多线程--JUC并发编程
    CentOS7离线安装mysql5.7
  • 原文地址:https://blog.csdn.net/feiying0canglang/article/details/125528394