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

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的传参方式我们就介绍这么多。如有错误也欢迎大家交流指正**。**

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

01.15

#include "widget.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();VideoCapture mv;mv.open("D:\\opencv\\heads\\01.mp4");//定义一个存放视频里读取到的一帧图像Mat src;//定义一个存…

自定义typora样式,如引用块颜色

要进行自定义typora中的样式&#xff0c;你最好像我一样&#xff0c;自己新建一个主题 首先文件->偏好设置->打开主题文件夹 然后自己新建一个文件夹&#xff0c;可以命名为selfmake&#xff0c;并copy一下github.css一个副本&#xff0c;将其命名为selfmake.css&#…

NLP论文阅读记录 - 2021 | WOS 基于动态记忆网络的抽取式摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Extractive Summarization Based on Dynamic Memory Network&#xf…

百亿补贴链接的快速控价方式

各大电商平台都有推出百亿补贴这个通道&#xff0c;作为低价引流的方式&#xff0c;百亿补贴越来越受到消费者认可&#xff0c;对于平台来说&#xff0c;其带来的流量也是巨大的&#xff0c;而对于品牌来说&#xff0c;百亿补贴的价格对渠道的影响非常大&#xff0c;如果百亿补…

Linux之引导和服务篇

系统引导是操作系统运行的开始&#xff0c;在用户能够正常登录之前&#xff0c;Linux的引导过程完成了一系列的初始化任务&#xff0c;并加载必要的程序和命令终端&#xff0c;为用户登录做好准备。 一. 引导过程 开机自检--->MBR引导--->GRUB菜单--->加载Linux内核-…

pandas进行数据计算时如何处理空值的问题?

目录 1.数据预览&#xff1a; 2.解决方法 &#xff08;1&#xff09;问题示例 &#xff08;2&#xff09;方法 A.方法一 B.方法二 1.数据预览&#xff1a; 2.解决方法 &#xff08;1&#xff09;问题示例 如下图如果不理睬这些空值的话&#xff0c;计算总分便也会是空值…

Chapter 10 类的继承(上篇)

目的&#xff1a;了解三种继承方式&#xff0c;并清楚其中的差别 &#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;…

安科瑞微电网能量监测系统Acrel-2000MG 储能电站监测预警

在新型电力系统中&#xff0c;储能将成为至关重要的一环&#xff0c;是分布式光伏、风电等新能源消纳以及电网安全保障必要保障&#xff0c;在电源侧、电网侧、用户侧都会得到广泛的应用。《电力现货市场基本规则&#xff08;征求意见稿&#xff09;》以及各地出台的扶持政策给…

Axure RP软件揭秘:设计师的秘密武器

Axure rp是一种快速原型设计工具&#xff0c;可以制作高度互动的HTML原型。设计师不仅可以使用Axure绘制线框图和原型&#xff0c;还可以在Axure rp中完成一系列用户体验设计。在本文中&#xff0c;我们将根据用户体验设计师的真实经验&#xff0c;触发用户体验设计师的实际工作…

我们公司都用哪些软件?强烈推荐这些

大家好&#xff0c;我是鱼皮。周末给大家分享一些轻松的干货吧&#xff0c;聊聊我们公司在用的软件&#xff0c;说不定能帮大家提高学习工作效率呢~ 我把软件分为四大类&#xff1a;团队协作、内容创作、文件共享、效率提升&#xff0c;分别介绍&#xff0c;便于大家选取。 团队…

Flink会话集群docker-compose一键安装

1、安装docker 参考&#xff0c;本人这篇博客&#xff1a;https://blog.csdn.net/taotao_guiwang/article/details/135508643?spm1001.2014.3001.5501 2、flink-conf.yaml flink-conf.yaml放在/home/flink/conf/job、/home/flink/conf/task下面&#xff0c;flink-conf.yaml…

如何利用静态代理IP优化跨境电商运营

文章目录 什么是跨境电商心得分享IP的重要性如何注册小结 什么是跨境电商 跨境电商&#xff0c;即跨境电子商务&#xff0c;是指在不同关境&#xff08;国境&#xff09;之间通过互联网进行的商业交易活动。这种商业模式充分利用了网络的全球化特性&#xff0c;使得买卖双方不…

探索FTP:原理、实践与安全优化

引言 在正式开始讲解之前&#xff0c;首先来了解一下文件存储的类型有哪些。 DAS、SAN和NAS是三种不同的存储架构&#xff0c;分别用于解决不同场景下的数据存储需求。 DAS (Direct Attached Storage 直接附加存储)&#xff1a;DAS 是指将存储设备&#xff08;如硬盘&#x…

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…

商城小程序(8.购物车页面)

目录 一、商品列表区域1、渲染购物车商品列表的标题区域2、渲染商品列表区域的基本结构3、为my-goods组件封装radio勾选状态4、为my-goods组件封装radio-change事件5、修改购物车中商品的选择状态6、为my-goods组件封装NumberBox7、为my-goods封装num-change事件8、修改购物车商…

[zabbix] zabbix监控

一、温习zabbix自定义监控 二、zabbix 自动发现与自动注册 2.1 zabbix 自动发现 //zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数…

Linux进程【2】进程地址空间(+页表详解哦)

fork 引言&#xff08;程序地址空间&#xff09;进程地址空间进程地址空间mm_struct 虚拟地址到物理地址的转化总结 引言&#xff08;程序地址空间&#xff09; 在之前的学习过程中&#xff0c;我们认识了内存与地址&#xff0c;并且了解了在程序地址空间中的基本分区&#xf…

C++ 之LeetCode刷题记录(十)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅&#xff0c;多学多练&#xff0c;尽力而为。 先易后难&#xff0c;先刷简单的。 66. 加一 给定一个由 整数 组成的 非空 数组所表示的非负整数…

Alist开源网盘搭建

官网&#xff1a;https://alist.nn.ci/zh/github下载地址&#xff1a;https://github.com/alist-org/alist/releases gitcode上也提供了源码:https://gitcode.com/mirrors/alist-org/alist/tags 源码安装使用自己研究,这里不讲解,较为复杂 我使⽤的版本:v3.29.1 我的下载地址:…

[ACM学习] 动态规划基础之一二三维dp

课内学习的动态规划 有记忆的迭代 优化解的结构&#xff1a;原始问题的一部分解是子问题的解 三要素&#xff1a;1.子问题 2.状态的定义 3.状态转移方程 定义 线性dp的一道例题 dp[i]表示以位置 i 结尾的方案总数&#xff0c;dp[4]2&#xff0c;因为&#xff1a;首先只放一…