如何使用SpringMVC之常用注解

news2024/10/6 1:39:32

❣️关注专栏:JavaEE
在这里插入图片描述

Spring MVC

  • ⌛️ 1. Spring MVC 创建和连接
    • ⌛️ 1.1 @RequestMapping
    • ⌛️ 1.2 @GetMapping
    • ⌛️ 1.3 @PostMapping
  • ⌛️ 2. 获取参数
    • ⌛️ 2.1 传递/获取单个参数
    • ⌛️ 2.2 传递/获取多个参数
    • ⌛️ 2.3 传递/获取对象
    • ⌛️ 2.4 参数重命名
      • ⌛️ 2.4.1 设置参数必传
    • ⌛️ 2.5 获取 JSON 对象
    • ⌛️ 2.6 从基础URL中获取参数
    • ⌛️ 2.7 获取上传的文件
    • ⌛️ 2.8 获取Cookie
    • ⌛️ 2.9 存储和获取 session
    • ⌛️ 2.10 获取 Header

SpringMVC有三个功能:

  1. 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是当用户访问⼀个地址能够调⽤到我们的Spring 程序。
  2. 获取参数的功能:⽤户访问的时候会传入⼀些参数,在程序中要想办法可以获取到参数。
  3. 输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户。
    接下来我们来探索这 3 个功能,掌握了之后就相当于掌握了SpringMVC!!!😀

⌛️ 1. Spring MVC 创建和连接

实现连接可以有 3 种注解:@RequestMapping 、@GetMapping 和 PostMapping

⌛️ 1.1 @RequestMapping

首先创建一个控制类,实现⽤户到 Spring 程序的互联互通。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@RestController // 相当于把 @Controller 和 @ResponseBody 结合起来。@Controller 是让 spring 框架启动时,加载。@ResponseBody 是返回⾮⻚⾯数据
@RequestMapping("/user") 
public class UserController {
	@RequestMapping("/say") // 这里可以是一级路由,也可以是 N 级路由
	public String sayHi(){
		return "springmvc sayhi";
	}
}

完成之后,当访问地址: http://localhost:8080/user/say
时就能在浏览器中打印 “springmvc sayhi” 的信息了。
👏 @RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。也就是当用户访问一个 URL 时,将用户的请求对应到某个类的方法上。
👏 @RequestMapping 可修饰类,也可以修饰⽅法。
当修饰类和⽅法时,访问的地址是:localhost:端口号/类/⽅法。比如: http://localhost:8080/user/say
如果直接修饰的是方法,则访问的地址是:localhost:端口号/⽅法,比如: http://localhost:8080/say

👏 @RequestMapping 支持 post 请求 也支持 get 请求。
我们可以在代码中手动指定为 post 请求:

// 当@RequestMapping() 中只有一个参数,不需要加 value,当有指定方法时要加上。
@RequestMapping(value = "/say", method = RequestMethod.POST)  
    public String sayHi() {
        return "springmvc sayhi";
    }

检测是否支持 post 的请求我们使用 postman,结果如下,可以知道该注解支持 post 请求。
在这里插入图片描述

⌛️ 1.2 @GetMapping

使用如下:

@GetMapping("/hi") // @GetMapping 只支持 get 请求,不支持 post 请求
    public String hi() {
        return "springmvc hi";
    }

⌛️ 1.3 @PostMapping

使用如下:

@PostMapping("/sayhello") // 只支持 post 请求,不支持 get 请求
    public String sayhello() {
        return "springmvc hello";
    }

⌛️ 2. 获取参数

⌛️ 2.1 传递/获取单个参数

在 Spring MVC 中可以直接⽤⽅法中的参数来实现传参,

// 这里列举了 3 种参数类型
@RequestMapping("/sayhi1")
public String sayHi(String name) { // 不传递 name 参数,那么此变量使用的是 String 的默认值 null
     return "hi " + name;
 }

@RequestMapping("/sayhi2")
public String sayhi2(Integer id) { // 不传递参数,使用 Integer(包装类) 的默认值 null
     if(id == null) return "参数有误";
     return "hi " + id;
 }

@RequestMapping("/sayhi3")
public String sayhi3(int id) { // 不传递参数,报错 --> 所以参数传递不要使用基础数据类型,使用包装类
     return "hi " + id;
 }

访问第一个地址时,我传入参数 name=zhangsan,结果如下:在这里插入图片描述

⌛️ 2.2 传递/获取多个参数

@RequestMapping("/sayhi11")
    public String sayHi11(String name, String password) {
        return "name:" + name + " | password:" + password;
    }

比如我们传递参数 name=zhangsan,password=123,结果如下:
在这里插入图片描述
那么有人可能会把参数的顺序传错了,那会影响我们的结果吗?答案是不会的,因为当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果。结果如下:
在这里插入图片描述

⌛️ 2.3 传递/获取对象

首先我们新建一个类 Userinfo:

package com.example.demo.entity;
import lombok.Data;
@Data
public class Userinfo {  // 类下面有以下属性
    private int id;
    private String name;
    private String password;
    private int age;
}

接下来我们来获取对象:

@RequestMapping("/reg")
    public Object reg(Userinfo userinfo) { // 框架会实现自动的参数映射
        System.out.println(userinfo); // 拿到的对象只是普通格式的对象
        return userinfo;
    }

Spring MVC 可以⾃动实现参数对象的赋值,也就是框架会实现自动的参数映射。运行结果如下:
在这里插入图片描述

⌛️ 2.4 参数重命名

我们可以对后端的参数重命名,也叫作后端参数映射。因为工作中有时候前端和后端的参数命名要求不同,比如前端规定他们的命名为 username,而后端要求的为 name,那么此时我们就需要使用 @RequestParam 来重命名参数。
如果参数不重名的话,结果如下:
在这里插入图片描述
参数重命名就给前面加上注解:

@RequestMapping("/reg2")
    // 使⽤ @RequestParam 来重命名前后端的参数值。eg:前端传入 username,后端命名为 name
    public Object reg(@RequestParam(value = "username") String name, String password) {
        return name + ":" + password;
    }

结果如下:在这里插入图片描述

⌛️ 2.4.1 设置参数必传

如果在上述例子中,我们不给 username 传入参数,那么访问时就会出错,所以当我们的实际业务中前端的参数是⼀个⾮必传的参数,我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,具体实现如下:

@RequestMapping("/reg2")
    public Object reg(String name,@RequestParam(value = "username", required = false)
            String password) {
        return name + ":" + password;
    }

⌛️ 2.5 获取 JSON 对象

 @RequestMapping("/reg3")
    // @RequestBody --> 接收 JSON 对象,要想拿到 json 格式的,必须加上 @RequestBody 注解
    public Object reg3(@RequestBody Userinfo userinfo) {
        System.out.println(userinfo); // 拿到的对象只是普通格式的对象
        return userinfo;
    }

⌛️ 2.6 从基础URL中获取参数

从基础的 URL中获取参数(?之前的参数,比如:http://localhost:8080/reg4/sy/123,获取的参数就是 sy 和123), 而不是从 URL的参数部分获取参数(是?之后的,比如http://localhost:8080/reg4?name=sy&password=123)。

 @RequestMapping("/reg4/{name}/{password}")
    public Object reg4(@PathVariable String name, @PathVariable("password") String password) {
        return "name=" + name + " | password=" + password;
    }
    @RequestMapping("/reg44/{name}/{pwd}")  // 参数名不同
    public Object reg44(@PathVariable String name,
                        @PathVariable(required = false, name = "pwd") String password) {
        return "name=" + name + " | password=" + password;
    }

结果为:
在这里插入图片描述
一般当参数比较少的情况下使用这种传参。

⌛️ 2.7 获取上传的文件

后端代码:

@RequestMapping("/myupload")
    public Object upload(@RequestPart("dog")MultipartFile file) {
        String fileName = UUID.randomUUID() +  // 文件名
                file.getOriginalFilename().substring( // substring 处理的是文件后缀
                        file.getOriginalFilename().lastIndexOf(".")); // . 之前的为文件名

        File saveFile = new File(
                "D:\\Y\\106\\rrich\\java-ee\\JavaEE_further\\" + fileName); // 这里D:\\Y\\106\\rrich\\java-ee\\JavaEE_further\\是我的文件的保存路径
        try{
            file.transferTo(saveFile);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

前端:
在这里插入图片描述
在我的文件中查看,已经有了该图片:在这里插入图片描述

⌛️ 2.8 获取Cookie

@RequestMapping("/getck")
    public Object getCk(@CookieValue(value = "java", required = false) String java) {
        return java;
    }

在这里插入图片描述

⌛️ 2.9 存储和获取 session

存储 session 代码:

  @RequestMapping("/setsess")
   public void doPostConstruct(HttpServletRequest request) {
       HttpSession session = request.getSession();
       session.setAttribute(SESSION_KEY,"zhangsan");
   }

只需要访问 http://localhost:8080/setsess 地址就可以成功存储 session。
获取 session 代码:

@RequestMapping("/getsess")
    public Object getSession(@SessionAttribute(SESSION_KEY) String name) {
        return "session -> " + name;
    }

获取的结果如下:
在这里插入图片描述

⌛️ 2.10 获取 Header

@RequestMapping("/gethd")
	// @RequestHeader() 里边的 header 是可以改变的
    public Object getHeader(@RequestHeader("User-Agent")String ua) {
        return "header -> " + ua;
    }

结果为:
在这里插入图片描述

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

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

相关文章

【链表OJ题 5】牛客 CM11 链表分割

目录 题目来源: 代码实现: 1.带哨兵位的头结点 2.不带哨兵位的头结点 思路分析: 1.带哨兵位的头结点 实现过程: 易错点: 2.不带哨兵位的头结点 实现过程: 易错点: 题目来源&#xff…

【图神经网络】GNNExplainer代码解读及其PyG实现

GNNExplainer代码解读及其PyG实现 使用GNNExplainerGNNExplainer源码速读前向传播损失函数 基于GNNExplainer图分类解释的PyG代码示例参考资料 接上一篇博客图神经网络的可解释性方法及GNNexplainer代码示例,我们这里简单分析GNNExplainer源码,并用PyTor…

2023年中职组“网络空间安全”赛项XX市竞赛任务书

2023年中职组“网络空间安全”赛项 XX市竞赛任务书 一、竞赛时间 共计:180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 SSH弱口令渗透测试 100分钟 100 任务二 Linux操作系统渗透测试 100 任…

deep learning system 笔记 自动微分 reverse mode AD

计算图 Computational Graph 图上的每个节点代表一个中间值边事输入输出的关系 forward 求导 forward mode AD 上图中从前向后,一步一步计算每个中间值对 x1的偏导,那么计算到 v7,就得到了整个函数对于 x1的偏导。 有limitation 对一个参数…

单机版部署Redis详细教程

概述 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址:https://redis.io/ 单机安装Redis 1.1.安装Redis依…

【IP地址与子网掩码】如何计算网络地址、广播地址、地址范围、主机个数、子网数(附详解与习题)

【写在前面】其实很多时候通过IP地址和子网掩码计算其网络地址、广播地址、可用IP,地址范围,主机数啥的,有些人不太清楚规则就只能瞎猜了,但是作为一个网络管理员还是一个基础常识的,这不因为最近备考网络管理员&#…

【数据结构】八大排序(二)

😛作者:日出等日落 📘 专栏:数据结构 在最黑暗的那段人生,是我自己把自己拉出深渊。没有那个人,我就做那个人。 …

API接口的对接流程和注意事项

一、对接API数据接口的步骤通常包括以下几个部分: 了解API:首先需要详细了解API的基本信息、请求格式、返回数据格式、错误码等相关信息。可以查看API的官方文档或者使用API探索工具。同时,还需要明确数据请求的频率和使用权限等限制。 ​​测…

恐怖,又要有多少人下岗!AI零成本设计主图,渗入10万亿电商市场

在电商平台上,主图是吸引消费者点击进入商品详情页的重要因素之一。 一张高点击的电商主图,不仅要能够吸引消费者的眼球,还要能够清晰地展示产品的特点和卖点。下面是一些制作高点击电商主图的建议。 1. 突出产品特点:在制作主图…

【Spring】Spring的事务管理

目录 1.Spring事务管理概述1.1 事务管理的核心接口1. PlatformTransactionManager2. TransactionDefinition3. TransactionStatus 1.2 事务管理的方式 2.声明式事务管理2.1 基于XML方式的声明式事务2.2 基于Annotation方式的声明式事务 1.Spring事务管理概述 Spring的事务…

惠普暗影精灵5 super 873-068rcn如何重装系统

惠普暗影精灵5 super 873-068rcn是一款家用游戏台式电脑,有时候你可能用久会遇到系统出现故障、中毒、卡顿等问题,或者你想要更换一个新的操作系统,这时候你就需要重装系统。重装系统可以让你的电脑恢复到出厂状态,清除所有的个人…

【vite+vue3.2 项目性能优化实战】打包体积分析插件rollup-plugin-visualizer视图分析

rollup-plugin-visualizer是一个用于Rollup构建工具的插件,它可以生成可视化的构建报告,帮助开发者更好地了解构建过程中的文件大小、依赖关系等信息。 使用rollup-plugin-visualizer插件,可以在构建完成后生成一个交互式的HTML报告&#xf…

【提示学习】Label prompt for multi-label text classification

论文信息 名称内容论文标题Label prompt for multi-label text classification论文地址https://link.springer.com/article/10.1007/s10489-022-03896-4研究领域NLP, 文本分类, 提示学习, 多标签提出模型LP-MTC(Label Prompt Multi-label Text Classification model)来源Appli…

Docker跨主机网络通信

常见的跨主机通信方案主要有以下几种: 形式描述Host模式容器直接使用宿主机的网络,这样天生就可以支持跨主机通信。这样方式虽然可以解决跨主机通信的问题,但应用场景很有限,容易出现端口冲突,也无法做到隔离网络环境…

buildroot系统调试苹果手机网络共享功能

苹果手机usb共享网络调试 首先了解usb基础知识,比如usb分为主设备和从设备进行通信, 1.HOST模式下是只能做主设备, 2.OTG模式下是可以即做主又可以做从,主设备即HCD,从设备即UDC(USB_GADGET &#xff09…

年后准备进腾讯的可以看看....

大家好~ 最近内卷严重,各种跳槽裁员,今天特意分享一套学习笔记 / 面试手册,年后跳槽的朋友想去腾讯的可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的软件测试技术栈,非常珍贵,肝完进大厂&a…

多态的原理

有了虚函数,会在类的对象增加一个指针,该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时,是对父类的虚表指针进行了拷…

密码学:古典密码.

密码学:古典密码. 古典密码是密码学的一个类型,大部分加密方式是利用替换式密码或移项式密码,有时是两者的混合。古典密码在历史上普遍被使用,但到现代已经渐渐不常用了。一般来说,一种古典密码体制包含一个字母表(如…

MATLAB 点云均匀体素下采样(6)

MATLAB 点云均匀体素下采样的不同参数效果测试 (6) 一、实现效果二、算法介绍三、函数说明3.1 函数3.2 参数四、实现代码(详细注释!)一、实现效果 不同参数调整下的均匀体素下采样结果如下图所示,后续代码复制黏贴即可: 分别为0.3m,0.2m,0.1m尺度下的格网下采样结果…

【C++复习2】C++编译器的工作原理

如果你是一名newbird的话,建议观看如下视频加深你的理解,再看如下内容: https://www.bilibili.com/video/BV1N24y1B7nQ?p7 The cherno会额外告诉你如何将目标文件转换成汇编代码,CPU执行指令的过程以及编译器如何通过删除冗余变…