• springboot基础(69):Controller相关注解


    前言

    controller相关的注解的使用和解释

    1. 常用controller注解列表

    可能未列全,但是这些是常见的controller注解

    名称作用作为位置
    @Controller处理http的请求ElementType.TYPE
    @ResponseBody将方法的返回值作为body进行返回ElementType.METHOD,ElementType.TYPE
    @RestControllerRestful请求风格,返回方法的返回值,常用于返回json格式内容,底层是@Controller和@ResponseBody的组合ElementType.TYPE
    @RequestMapping通用请求,不区分是GET/POST还是PUT之类的ElementType.METHOD
    @GetMappingGet请求,底层是@RequestMapping(method = {RequestMethod.GET})ElementType.METHOD
    @PostMappingPost请求,底层是@RequestMapping(method = {RequestMethod.POST})ElementType.METHOD
    @PutMappingPUT请求,底层是@RequestMapping(method = {RequestMethod.PUT})ElementType.METHOD
    @DeleteMappingDelete请求,底层是@RequestMapping(method = {RequestMethod.DELETE})ElementType.METHOD
    @PathVariable获取url参数ElementType.PARAMETER
    @RequestParam获取请求参数ElementType.PARAMETER

    2. Controller注解

    2.1 @Controller

    @Controller是万能的注解,可以进行地址跳转,文件的下载,也可以与@ResponseBody组合,变成@RestController
    例如 使用@Controller导出文件

    /**
     * 导出excel
     */
    @Controller
    public class ExportExcelController {
    
        @RequestMapping("/exportExcel")
        public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
            List<String> headList = Arrays.asList("姓名", "地址");
            List<LinkedHashMap<String, Object>> dataList = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                LinkedHashMap<String, Object> map = new LinkedHashMap<>();
                map.put("姓名", "张三" + i);
                map.put("地址", "北京" + i);
                dataList.add(map);
            }
    
            ExcelExportUtils.exportExcel(headList, dataList, "学生名单1", "某校学生名单", response);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2.2 @RestController

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
        @GetMapping("/sayHello/{name}")
        public String sayHello(@PathVariable("name") String name){
            return "hello "+name;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    我们改用@Controller,再运行进行请求则会报错,@RestController表示将方法的返回值作为body返回。
    在这里插入图片描述
    在这里插入图片描述
    我们对方法添加@ResponseBody注解,再次执行代码,则运行正常。
    在这里插入图片描述

    在这里插入图片描述

    @ResponseBody:该注解即可添加在方法上,也可以添加在类上

    3. 请求类型注解

    3.1 @RequestMapping

    不限制请求的类型是GET、POST、PUT、DELETE 等,属于通用型的请求。使用@RequestMapping时,swagger 显示API时会出现重复。
    示例

        @RequestMapping("/sayHello2/{name}")
        public String sayHello2(@PathVariable("name") String name){
            return "hello2 "+name;
        }
    
    • 1
    • 2
    • 3
    • 4

    3.2 @GetMapping

    只能接收客户端发出的GET请求

        @GetMapping("/sayHello/{name}")
        public String sayHello(@PathVariable("name") String name){
            return "hello "+name;
        }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    3.3 @PostMapping

    只能接收客户端发送的POST请求

    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
        @PostMapping("/save")
        public String save(User user) {
            log.info("save方法打印内容:" + JSON.toJSONString(user));
            return "ok";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    3.4 @PutMapping

    只接收PUT请求。
    demo略。
    在这里插入图片描述

    3.5 @DeleteMapping

    只接收Delete请求。
    demo略。
    在这里插入图片描述

    4. 参数注解

    4.1 @PathVariable

    从请求的Path(路径,就是url路径)中获取参数,示例:

     @GetMapping("/sayHello/{name}")
        public String sayHello(@PathVariable("name") String name){
            return "hello "+name;
        }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在这里插入图片描述

    4.2 @RequestParam

    RequestParam是指从request对象里获取参数,就是我们传统的request.getParameter(“name1”)一样,不区分请求类型,等价于下面这样的代码。

    request.getParameter("name1");
    request.getParameter("name2");
    
    • 1
    • 2
        @PostMapping("/testInsert")
        public String testInsert(@RequestParam("name1")String name1, @RequestParam("name2")String name2){
            log.info("name1:"+name1);
            log.info("name2:"+name2);
            return "ok";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    4.3 接收对象

    参数接收可以缺省注解,直接在方法括号内接收即可。

        @PostMapping("/testUser")
        public String testUser(User user){
            log.info(JSON.toJSONString(user));
            return "ok";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    4.4 缺省接收参数

    我们可以不设置注解,直接接收参数,显然在方法内接收参数,我们并没有使用@PathVariable和@RequestParam,直接缺省,同样可以获取到请求的参数。

    @GetMapping("/testUser2")
        public String testUser2(String name){
            log.info("get "+name);
            return "ok";
        }
        @PostMapping("/testUser3")
        public String testUser3(String name){
            log.info("post "+name);
            return "ok";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    4.5 required是否必传

    @PathVariable和@RequestParam都支持自行设定参数是否必须,默认都是必传。
    在这里插入图片描述
    在这里插入图片描述
    示例,name1非必传

    @RequestParam(value = "name1",required = false)String name1
    
    • 1
        @PostMapping("/testInsert")
        public String testInsert(@RequestParam(value = "name1",required = false)String name1, @RequestParam("name2")String name2, HttpServletRequest request){
            request.getParameter("name1");
            request.getParameter("name2");
            log.info("name1:"+name1);
            log.info("name2:"+name2);
    //        userService.insertTest(name1,name2);
            return "ok";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5. 返回内容

    5.1 @RequestBody

    如果使用@RestController,它本身就是@Controller和@@RequestBody的组合。
    @RequestBody 返回方法的返回值,而不是将其进行解析成跳转路径等信息。
    @RequestBody 添加在方法上,表示将该方法的返回内容输出的前端。
    @RequestBody 添加在类上,表示这个类的每个方法都被作用到,等同于将@RequestBody添加在每个方法上。
    举个例子:
    下面这段代码,使用@Controller 则,而不使用@RequestBody,表示页面跳转到index2.html页面

    @Controller
    public class HelloController {
        @RequestMapping("/")
        public String hello(){
            return "forward:index2.html";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    在这里插入图片描述

    如果添加@RequestBody,访问这个链接,则直接输出return的字符串
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    同旺科技 USB TO SPI / I2C适配器读写24LC256--页写
    2023下半年软考高级信息系统项目管理师考后解析
    Zabbix 利用 Grafana 进行图形展示
    HTML contenteditable 属性
    什么是 WebXR Device API?
    7. dws 层建设(大宽表)
    每个程序员都应该知道的Swoole知识-定时器
    【Linux】静态库的制作和使用详解
    C# --- 坦克大战项目(1)--- 类型转换与多线程
    GSN前瞻预处理
  • 原文地址:https://blog.csdn.net/u011628753/article/details/126825507