• SpringBoot教程(五) SpringBoot中Controller用法及传参


    SpringBoot整合SpringMvc其实千面一直讲的都是。只需要我们在pom文件中引入 web的starter就可以了,然后我们就可以正常使用springMvc中的功能了。所以本篇文章可能更多的是回顾,回顾一下springMVC中的一些常用的功能。

    按照正常的流程,我们应该先讲一讲怎么配置视图解析器,但是已经提到了,现在都是前后端分离的项目,后端无需配置页面跳转,只需要返回数据即可,所以这一部分也没必要再讲了。那咱么就介绍下Controller中的常用写法。

    上一次我们介绍了 @RestController 注解,这个注解会把所有的返回结果以json(json其实不太准确,应该是可序列化对象,大部分是json形式)的形式进行返回。我们今天来举个例子。

    5.1关于@RestController注解

    Controller代码:

    @RestController
    public class SecondController {
    
        @RequestMapping("/second")
        public User second(){
            User u = new User("张胜男", 30,"女");
            return u;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这里返回了一个User类。 User类代码如下:

    package com.lsqingfeng.springboot.vo;
    
    /**
     * @className: User
     * @description:
     * @author: sh.Liu
     * @date: 2022-01-12 11:25
     */
    public class User {
    
        private String name;
    
        private Integer age;
    
        private String gender;
    
        public User(String name, Integer age, String gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    访问:http://localhost:9090/second 得到结果:

    看到了返回的就是json类型的数据。这就是 @RestController的作用。如果不用@RestController,我们在方法上加上@ResponseBody是同样的效果。 @RestController注解就是@Controller和@ResponseBody 的组合。

    5.2 关于@RequestMapping注解

    @RequestMapping注解主要用于标识该Controller的请求地址路径。比如上面路径中的@RequestMapping(“/second”) 就代表通过 /second可以访问到这个接口。这个注解既可以放在类上,也可以放到方法上,如果类上也有这个注解,那么类中所有的controller在访问的时候,都要带上类上的路径才可以访问到。比如:

    @RestController
    @RequestMappin("/test")
    public class SecondController {
    
        @RequestMapping("/second")
        public User second(){
            User u = new User("张胜男", 30,"女");
            return u;
        }
        
        @RequestMapping("/third")
        public User third(){
            User u = new User("张胜", 50, "男");
            return u;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    比如上面的Controller, 那么我们访问的路径就变成了

    ip:port/test/second ip:port/test/third

    并且这也是现在最常用的方式,相当于类上的注解里的url作为一个大的分类(一般代表一个模块),方法是模块中的各个功能。

    同时还要注意,如果方法上面使用了@RequestMapping 注解来进行标记,那么其实并没有限定这个方法用Http的哪种请求方式来进行访问,所以我们可以用Get请求,也可以用post请求。当然除了这些还有一下不太常用的Delete,put,optio等请求方式。比如我们最上边那个例子:

    Get请求访问:

    Post请求访问:

    Delete请求访问:

    但是一般情况下,我们都会限定这个接口只能一某一种请求方式访问,如何限制呢?

    方法一: 通过RequestMapping中的参数

    @RestController
    public class SecondController {
    
        @RequestMapping(value = "/second", method = RequestMethod.GET)
        public User second(){
            User u = new User("张胜男", 30,"女");
            return u;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这时候就只能用Get请求来访问了。

    其他请求方式会报错.

    方法二: 使用限定请求方式的注解:

    如果限定Get请求方式, 用@GetMapping 代替 @RequestMapping

    如果限定Post请求方式, 用@PostMapping 代替 @RequestMapping

    比如限定Post请求方式:

    @RestController
    public class SecondController {
    
        @PostMapping("second")
        public User second(){
            User u = new User("张胜男", 30,"女");
            return u;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    我们可以看下 @PostMapping注解的实现方式,其实跟方式一是一样的。

    5.3关于Controller中传参

    Get请求传参:

    Get请求的参数传递都是通过在url后面拼接来进行传参的, 比如我们传一个name 和age 。url的写法如下:

    localhost:9090/thirdname=zhangsan&age=20

    在请求的路径后面表示参数,多个参数之间用 & 进行连接。 那么在Controller中如何接收Get请求传递过来的参数呢。方式很多,我们就说两种最常用的

    1. 直接在Controller方法的参数中,用相同的变量名称接收参数。以上面的请求为例

      @GetMapping(“third”)
      public String third(String name, Integer age){
      System.out.println(name);
      System.out.println(age);
      return “success”;
      }

    成功获取参数:

    1. 如果参数太多,用上面的方式来写,会导致方法中的参数过多,看起来很乱。所以我们也可以使用一个javaBean来接收。前期就是javaBean中的属性名要和参数名相同,同时要有get和set方法。

      @GetMapping(“getParam”)
      public User getParam(User user){
      System.out.println(user);
      // 将接收到的参数直接返回
      return user;
      }

    User类,再给一下:

    package com.lsqingfeng.springboot.vo;
    
    /**
     * @className: User
     * @description:
     * @author: sh.Liu
     * @date: 2022-01-12 11:25
     */
    public class User {
    
        private String name;
    
        private Integer age;
    
        private String gender;
    
        public User(String name, Integer age, String gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + ''' +
                    ", age=" + age +
                    ", gender='" + gender + ''' +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    访问: http://localhost:9090/getParam?name=zhangsan&age=20

    gender没有传值,所以是null, 参数接收成功:

    Post请求传参

    Post请求传参的方式,常用的有两种,一中是通过form表单进行传参(就是html中的form),还有一种是通过json的形式传参。目前来说用json的比较多。

    1. Form传参

    使用form传参,我们的Controller再接收的时候和上面一样可以直接接收上代码。

    @PostMapping("postForm")
    public User postForm(String name, Integer age){
        User u = new User(name, age, null);
        return u;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    post请求需要通过postman来模拟了,注意form传参的位置,要在body的form-data里

    如果参数过多,我们也是可以通过一个javaBean来进行接收的。

    @PostMapping("postForm2")
    public User postForm2(User user){
        return user;
    }
    
    • 1
    • 2
    • 3
    • 4

    2. Json 传参

    通过json传递的参数,content-type一般为: application/json

    我们在接收参数的时候要通过一个新的注解 @RequestBody 来进行标识。

    // 注意,User中一定要有无参构造方法
    @PostMapping("postJson")
    public User postJson(@RequestBody User user){
        return user;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    通过json方式请求,看是否成功获取。

    3. 关于@RequestParam注解

    还有一种方式,这种方式不是很常用,但有的时候,跟三方接口对接的时候,不排除他们使用这种方式。

    就是针对content-type是: application/x-www-form-urlcoded (Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)这是我在网上的资料中找到的,也验证了,如下:

    @PostMapping("postWWWForm")
    public User postWWWForm(@RequestParam String name, @RequestParam Integer  age){
        return new User(name, age, null);
    }
    
    • 1
    • 2
    • 3
    • 4

    后来我把@RequestParam 注解去掉了,发现居然也可以接收到参数。其实这个注解就是用来接收普通参数的一个注解。正常情况下应该是可以省略的。什么时候不能省略呢,就是有时候这个参数是必填项,就是必须要传,那么我们可以在这个注解中标识是否必传和默认值。

    @RequestParam(value="id",required =false,defaultValue ="10086") Integer id,

    默认是true.

    好了关于SpringBoot中Controller的传参方式我们就介绍这么多。如有错误也欢迎大家交流指正。

    先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦

  • 相关阅读:
    使用SSH连接虚拟机一直提示填写密码
    基于SpringBoot的在线教育平台系统
    C++模拟实现string类
    Ubuntu工控机CAN卡驱动安装(手动安装)
    基础算法 - 常见算法模板题(最简洁写法)【下】
    SpringBoot+MyBatisPlus+AOP实现多数据源切换
    制作一个简单HTML个人网页网页(HTML+CSS)大话西游之大圣娶亲电影网页设计
    Java面试题
    Python类和对象怎么使用
    CTFshow web(文件上传158-161)
  • 原文地址:https://blog.csdn.net/m0_67402013/article/details/126114732