SpringBoot教程(五) | SpringBoot中Controller详解

news2024/9/29 3:35:35

SpringBoot教程(五) | SpringBoot中Controller详解

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

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

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

5.1关于@RestController注解

Controller代码:

java复制代码@RestController
public class SecondController {

    @RequestMapping("/second")
    public User second(){
        User u = new User("张胜男", 30,"女");
        return u;
    }
}

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

java复制代码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;
    }
}

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

image.png

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

5.2 关于@RequestMapping注解

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

java复制代码@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;
    }
}

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

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

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

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

Get请求访问:

image.png

Post请求访问:

image.png

Delete请求访问:

image.png

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

方法一: 通过RequestMapping中的参数

java复制代码@RestController
public class SecondController {

    @RequestMapping(value = "/second", method = RequestMethod.GET)
    public User second(){
        User u = new User("张胜男", 30,"女");
        return u;
    }
}

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

image.png

其他请求方式会报错.

image.png

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

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

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

比如限定Post请求方式:

java复制代码@RestController
public class SecondController {

    @PostMapping("second")
    public User second(){
        User u = new User("张胜男", 30,"女");
        return u;
    }
}

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

image.png

5.3关于Controller中传参

Get请求传参:

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

localhost:9090/third?name=zhangsan&age=20

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

  1. 直接在Controller方法的参数中,用相同的变量名称接收参数。以上面的请求为例
java复制代码@GetMapping("third")
public String third(String name, Integer age){
    System.out.println(name);
    System.out.println(age);
    return "success";
}

image.png

成功获取参数:

image.png

  1. 如果参数太多,用上面的方式来写,会导致方法中的参数过多,看起来很乱。所以我们也可以使用一个javaBean来接收。前期就是javaBean中的属性名要和参数名相同,同时要有get和set方法。
java复制代码@GetMapping("getParam")
public User getParam(User user){
    System.out.println(user);
    // 将接收到的参数直接返回
    return user;
}

User类,再给一下:

java复制代码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 + ''' +
                '}';
    }
}

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

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

image.png

Post请求传参

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

  1. Form传参

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

java复制代码@PostMapping("postForm")
public User postForm(String name, Integer age){
    User u = new User(name, age, null);
    return u;
}

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

image.png

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

java复制代码@PostMapping("postForm2")
public User postForm2(User user){
    return user;
}

image.png 2. Json 传参

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

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

java复制代码// 注意,User中一定要有无参构造方法
@PostMapping("postJson")
public User postJson(@RequestBody User user){
    return user;
}

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

image.png 3. 关于@RequestParam注解

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

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

java复制代码@PostMapping("postWWWForm")
public User postWWWForm(@RequestParam String name, @RequestParam Integer  age){
    return new User(name, age, null);
}

image.png

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

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

默认是true.

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7 制作系统镜像iso文件

Centos7 制作系统镜像iso文件 1. 系统备份镜像1.1 安装mondo1.2 制作备份镜像1.3 恢复系统 1. 系统备份镜像 这部分针对有系统备份需求,防止系统遭受意外状况,无法紧急恢复。整体备份内容较大,建议考虑后再进行操作 本次使用mondo软件进行备…

代码随想录算法训练营第28天 | 93.复原IP地址 78.子集 90.子集II

目录 93.复原IP地址 💡解题思路 回溯三部曲 # 判断子串是否合法 💻实现代码 78.子集 💡解题思路 回溯三部曲 💻实现代码 90.子集II 💡解题思路 💻实现代码 93.复原IP地址 题目链接&#x…

Rocketmq rust版本-开篇

我是蚂蚁背大象(Apache EventMesh PMC&Committer),文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm,文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com Rust重构Rocketmq,大家好我是mxsm(Apache EventMesh PMC&Comm…

Linux网络编程---IP 地址格式转换函数

Linux网络编程—IP 地址格式转换函数 我们更容易阅读的IP地址是以点分十进制表示的,例如:192.168.5.10 ,这是一种字符串的形式,但是计算器所需要的IP地址是以二进制进行表示,这便需要我们在点分十进制字符串和二进制地…

Swift 周报 第四十五期

文章目录 前言新闻和社区苹果或将扩充健康版图,为Apple Watch X铺路更新后的《Apple Developer Program 许可协议》现已发布 提案通过的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第四十五期,每个模块已初步成型。各位…

【Linux】初识Linux及几个基本指令

Hello everybody!算算时间我已经有一个多月没有更新啦!因为本专业是纺织工程,所以一直在复习应付期末考试\(0^◇^0)/。那好,废话不多说。让我们进入今天的主题! 关于Linux系统可能很多同学不是很熟悉,有的人可能听过&…

《ORANGE’S:一个操作系统的实现》读书笔记(三十一)文件系统(六)

上一篇文章记录了对文件的读写操作,那么文件操作到目前为止,已经完成了创建和读写,还剩下的常用操作就是删除文件了。这篇文章就来记录删除文件的实现以及总结一下为文件系统添加系统调用的步骤。 删除文件 删除是添加的反过程,…

EndNote登录一直显示The username/password specified is not valid

EndNote登录一直显示The username/password specified is not valid EndNote20今天想打开之前的share library的时候一直显示 ‘The Username/password specified is not valid’,查了很多解决方案,现在献上解决方案: 该密码然后重新登陆…

如何在 SwiftUI 中使用 AccessibilityCustomContentKey 修饰符

文章目录 前言创建 User 结构体添加辅助修饰符使用新的修饰符使用修饰符来替换和覆盖数据可运行代码总结 前言 SwiftUI 3 发布了许多新的辅助功能 API,我们可以利用这些 API 以轻松的方式显著提高用户体验。本篇文章来聊聊另一个新的 API,我们可以使用 …

数仓面试之手写拉链表SQL,并分析有多少个job

数仓面试之手写拉链表SQL,并分析有多少个job 拉链表定义 维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已,通过拉链表可以…

phpinfo和php -m 加载的php.ini不一致

目的: 将phpinfo在web中展示的php.ini和在命令行中展示的php.ini加载路径设置一致。 原本的php.ini加载路劲是: /usr/local/lib/php.ini 解决思路: (1)which php 查看服务器加载的php的位置,这里原来是&a…

Sketch不会安装?教你在Windows中打开Sketch!

使用 Windows 系统的 UI 设计师可能遇到过这样一个问题:他们收到了其他人发送的 Sketch 文件,但 Windows 系统无法打开 Sketch 文件,也不知道如何在 Windows 上打开 Sketch 文件。这是一个真实工作场景的问题。对于这个问题,即时设…

RT-Thread: 控制台调试串口波特率更改

说明:rt_kprintf 函数是RT 的一个调试接口使用的函数,波特率默认是 115200 ,本文介绍更改这个波特率。 1.根据截图路径找到文件 serial.h 修改如下代码中关于波特率定义部分。 /* Default config for serial_configure structure */ #defin…

测试工程师必会能力之缺陷分析入门

缺陷分析也是测试工程师需要掌握的一个能力,但是很多时候大家只记得要提交缺陷、统计缺陷情况,而忽视了缺陷分析。 其实每个项目的缺陷记录都是有很大价值的: 在测试阶段分析当前缺陷情况,及时发现存在的问题并调整测试策略&…

微软Power Platform使用Canvas app画布应用添加自定义连接器调用外部API展示数据

微软Power Platform使用Power Apps的Canvas app画布应用添加自定义连接器,调用外部API展示数据 目录 微软Power Platform使用Power Apps的Canvas app画布应用添加自定义连接器,调用外部API展示数据1、在Power Apps中找到自定义连接器2、创建一个空白的自…

数码秒表设计

#include<reg51.h> // 包含51单片机寄存器定义的头文件 unsigned char code Tab[10]{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管显示0&#xff5e;9的段码表 unsigned char int_time; //记录中断次数 unsigned char second; //储存…

java基础 - 03 List之AbstractSequentialList、LinkedList

上一篇我们围绕了ArrayList以及List进行简单介绍&#xff0c;本篇我们将围绕AbstractSequentialList、LinkedList进行。 AbstractSequentialList AbstractSequentialList是Java集合框架中的一个抽象类&#xff0c;它实现了List接口&#xff0c;并且是针对顺序访问的列表数据结…

ME6211C33M5G-N 输出3.3V 500mA 线性稳压器LDO 参数

描述 ME6211系列是高精度&#xff0c;低噪声&#xff0c;CMOS LDO电压调压器。ME6211系列提供低输出噪声&#xff0c;高纹波抑制率&#xff0c;低辍学率和非常快速的开启时间&#xff0c;ME6211系列是当今最前沿的手机的理想选择。ME6211内部包括参考电压源、误差放大器、驱动…

运放负反馈

学习记录所使用书籍为西安交通大学杨建国教授著《新概念模拟电路》&#xff0c;可在ADI官网下载PDF版学习。 运算放大器&#xff0c;英文为 Operational Amplifier&#xff0c;简写 OA 或 OPA&#xff0c;中文简称为运放。 理想运算放大器如图所示&#xff0c;它具有两个差分的…

uni-table改表头的样式,uniapp项目,颜色,字体颜色

:first-child,:nth-child选择器的使用和隔行变色_firstchild怎么用-CSDN博客