SpringMVC 中的常用注解和用法

news2024/11/15 19:32:18

观前提示:本篇博客演示使用的 IDEA 版本为2021.3.3版本,使用的是Java8(又名jdk1.8)

电脑使用的操作系统版本为 Windows 10


 

目录

 前言

Spring Boot

Spring MVC

1. MVC

1.1 MVC 和 Spring MVC 之间的关系

2. 创建 Spring MVC 项目

创建一个 SpringMVC 项目

1. new project

2. 选择 SpringBoot 项目, 选择合适的 jdk 版本, 设置创建项目源

3. 项目的参数

4. 选择Spring Boot 版本, 添加项目依赖

5. 设置项目名称和保存路径

6. 确保 idea 正常加载Spring Boot 项目

7. 删除无用文件(可删可不删)

8. Spring Boot 目录说明

3. SpringMVC 中的常用注解和用法

3.1 实现连接

@RequestMapping 支持 GET 和 POST

@GetMapping 只支持 Get 请求

@PostMapping 只支持 Post 请求

3.2 获取参数

1. 获取单个参数

获取多个参数

2. 获取对象

3. 获取 JSON 对象

4. 从基础 URL 中获取参数(不是从 URL 的参数部分获取参数)

5. 获取上传文件

6. 获取 Cookie

7. 获取 Header

8. 获取 Session

3.3 返回数据 

1. 返回静态页面

2. 跳转地址: 请求转发(forward)和请求重定向(redirect)

forward 和 redirect 具体区别如下:


前言

前面两篇博客介绍了 Spring 的 Bean 的作用域和生命周期, 本篇博客将开始介绍 Spring MVC 的常用注解以及用法

在认识 Spring MVC之前,先认识一下 Spring Boot

Spring Boot

Spring 的诞⽣是为了简化 Java 程序的开发的,⽽ Spring Boot 的诞⽣是为了简化 Spring 程序开发的。它是为了快速开发 Spring 框架⽽诞⽣的。


Spring MVC

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称

(Spring-webmvc),但它通常被称为“Spring MVC"。

从上述定义我们可以得出两个关键信息:

1. Spring MVC 是⼀个 Web 框架。

2. Spring MVC 是基于 Servlet API 构建的。

然⽽要真正的理解什么是 Spring MVC?我们⾸先要搞清楚什么是 MVC?

1. MVC

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分。

Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,控制⽤户输⼊,并向模型发送数据。

1.1 MVC 和 Spring MVC 之间的关系

MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。

总结来说,Spring MVC 是⼀个实现了 MVC 模式,并继承了 Servlet API 的 Web 框架。既然是 Web框架,那么当⽤户在浏览器中输⼊了 url 之后,我们的

Spring MVC 项⽬就可以感知到⽤户的请求。

2. 创建 Spring MVC 项目

现在绝⼤部分的 Java 项⽬都是基于 Spring(或 Spring Boot)的,⽽ Spring 的核⼼就是 SpringMVC。也就是说 Spring MVC 是 Spring 框架的核⼼模块,

⽽ Spring Boot 是 Spring 的脚⼿架,因此我们可以推断出,现在市⾯上绝⼤部分的 Java 项⽬约等于 Spring MVC 项⽬。

在创建 Spring Boot 项⽬时,我们勾选的 Spring Web 框架其实就是 Spring MVC 框架,如下所示:

创建一个 SpringMVC 项目

1. new project

2. 选择 SpringBoot 项目, 选择合适的 jdk 版本, 设置创建项目源

3. 项目的参数

 我选择 JDK 8 是因为我装的就是 JDK 8 

4. 选择Spring Boot 版本, 添加项目依赖

 

在勾选的时候,可以注意看, Spring Web 下面有 Spring MVC, 这就是使用 Spring Boot 创建 Spring MVC

5. 设置项目名称和保存路径

6. 确保 idea 正常加载Spring Boot 项目

启动项目, 没有出现 debug, 并且控制台打印了启动所用的时间, 说明 Spring Boot项目已经创建好了 

7. 删除无用文件(可删可不删)

这里面存储的是一些对我们帮助不大的文件

其中  .mvn目录 和 mvnw 文件以及 mvnw.cmd 文件, 是一个用来帮助在没有安装 Maven 的情况下运行 Maven 项目的脚本。

help.md 文件是 Spring Boot 项目的帮助文档,它包含了当前项目的基本信息、可用命令以及如何使用这些命令等重要内容。

是否删除看你个人选择,不做强制要求

是否删除看你个人选择,不做强制要求

是否删除看你个人选择,不做强制要求

8. Spring Boot 目录说明

3. SpringMVC 中的常用注解和用法

3.1 实现连接

@RequestMapping 是 Spring Web 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的路由映射的。

先建立 com.example.demo.Controller, 在里面建立 UserController类
package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller //让 Spring 框架启动时,加载
@ResponseBody //返回非页面数据
@RequestMapping("/user") // 路由器规则注册,此时是一级路由
public class UserController {
    @RequestMapping("/hello") // 路由器规则注册,此时是二级路由,可以一直往下套,无限层
    public String Hello() {
        return "<h1>Hello,World<h1>";
    }
}

运行程序,访问 http://localhost:8080/user/hello

此时完成了程序员的经典操作输出 Hello World

对于 @Controller 和 @ResponseBody 可以使用 @RestController 取代,因为点开 @RestController 的源码会发现,他有这两位的注解

@RequestMapping 支持 GET 和 POST

打开 Postman, 进行测试即可知道答案

@GetMapping 只支持 Get 请求

 给 get 发送 POST 请求就会报错405 

@PostMapping 只支持 Post 请求

 给 POST 发送 Get 请求就会报错405 

上面三个的测试代码

package com.example.demo.Controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user") // 路由器规则注册,此时是一级路由
public class UserController {
    @RequestMapping("/hello") // 路由器规则注册,此时是二级路由,可以一直往下套,无限层
    public String Hello() {
        return "<h1>Hello,World<h1>";
    }

    @PostMapping("/post")
    public String post() {
        return "post";
    }

    @GetMapping("/get")
    public String get() {
        return "get";
    }
}

3.2 获取参数

1. 获取单个参数

package com.example.demo.Controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/user") 
public class UserController {
    @RequestMapping
    public String name(String name){
        return "hi " + name;
    }
}

注意: url 里面的 name 必须和 idea 里面传参的 name 保持一致

获取多个参数

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

在不输入name以及 password的情况下,默认是 null 

2. 获取对象

获取对象之前需要先创建一个对象出来

新建 com.example.demo.enity ,再建一个 Userinfo 类

package com.example.demo.enity;

import lombok.Data;

@Data
public class Userinfo {
    private int id;
    private String name;
    private String password;
    private int age;
}

其中, @Data 是 lombok 他会帮我处理 get,set

@RequestMapping("/reg")
    public Object reg(Userinfo userinfo){
        System.out.println(userinfo);
        return userinfo;
    }

 

注意: 框架会实现自动的参数映射 

3. 获取 JSON 对象

@RequestMapping("/reg2")
    public Object reg2(@RequestBody Userinfo userinfo){
        System.out.println(userinfo);
        return userinfo;
    }

继续使用 Postman 

4. 从基础 URL 中获取参数(不是从 URL 的参数部分获取参数)

@PathVariable: 基础 URL 里面的参数(? 之前的参数)

@RequestParm: URL 参数部分的参数(? 之后的参数)

package com.example.demo.enity;

import lombok.Data;

@Data
public class Userinfo {
    private int id;
    private String name;
//    private String password;
private String pwd;
    private int age;
}

将 password 修改成 pwd

@RequestMapping("/reg3/{name}/{pwd}")
    public Object reg3(@PathVariable String name, @PathVariable(required = false, name = "pwd") String password) {
        return "name=" + name + " " + "password=" + password;
    }

上述代码中,我们使用 @RequestMapping 注解将请求映射到 /reg3/{name}/{pwd} 路径上,并使用 @PathVariable 注解绑定 URL 路径变量到方法参数上。

具体来说,@PathVariable String name 表示将 URL 路径中的 {name} 变量映射到方法参数 name 上;而 @PathVariable(required = false, name = "pwd") String password 表示将 URL 路径中的 {pwd} 变量映射到方法参数 password 上。其中,required=false 表示 {pwd} 变量是可选的,如果请求 URL 中不包含该变量,则 password 参数的值为 nullname="pwd" 表示将 {pwd} 变量与 password 方法参数名称进行映射,即使它们名称不匹配。

在方法体内部,我们使用字符串拼接的方式将 namepassword 变量的值组合成一个响应字符串,并返回给客户端。

小结: 该方法的作用是根据传入的用户名和密码,在服务器端生成响应字符串并返回给客户端。如果请求 URL 中不包含密码变量,则返回的字符串中不包含密码信息。

5. 获取上传文件

@RequestMapping("/myupload")
    public Object upload(@RequestPart("hero") MultipartFile file) {
        File saveFile = new File("D:\\blogTest\\hero.jpg");
        try {
            file.transferTo(saveFile);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

使用 Postman 进行模拟

注意: 你要上传的图片和你要保存的图片不能再一个文件夹里面,因为看不出来区别,看不出来是因为有个缺陷

上面这段代码有个缺陷,就是你新上传的图片会覆盖上一张图片,这里面始终只有一张图片

@RequestMapping("/myupload")
    public Object upload(@RequestPart("hero") MultipartFile file) {
        String fileName = UUID.randomUUID() + // 文件名
                file.getOriginalFilename().substring( // 文件后缀
                        file.getOriginalFilename().lastIndexOf("."));
        File saveFile = new File("D:\\blogTest\\" + fileName);
        try {
            file.transferTo(saveFile);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

还是使用 Postman 进行测试 

现在就不会覆盖上一张图片了

6. 获取 Cookie

获取单一的 cooking

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

输入 URL 进行访问

发现一片空白,不要慌

F12 打开开发者工具: 点击应用, 点击 Cookie, 点击他下面的

然后开始伪造 Cookie,必须名称是 java, 因为 idea 写的就是 java. 后面的值看你自己

刷新就得到了结果

7. 获取 Header

@RequestMapping("/header")
    public Object getHeader(@RequestHeader("Host") String ht) {
        return "Host ->" + ht;
    }

标头里面的东西全都可以获取 

8. 获取 Session

//存储 Session, 只有存了才能读取
    //先调用 set 在调用 get
    private static final String SESSION_KEY = "USERINFO_SESSION_KEY";

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

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

3.3 返回数据 

1. 返回静态页面

先弄一个前端返回

在 resource 下面的 static 里面建一个 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>index.html</title>
</head>
<body>
<h1>hello index</h1>
</body>
</html>

在 com.example.demo.Controller 新建一个 TestController

@Controller
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/index")
    public Object getIndex(){
        return "/index.html";
    }
}

 

 

2. 跳转地址: 请求转发(forward)和请求重定向(redirect)

请求转发展示

@RequestMapping("/forward")
    public String forward() {
        return "forward:/index.html";
    }

 

 

请求重定向展示

@RequestMapping("/redirect")
    public String redirect() {
        return "redirect:/index.html";
    }

 

 

请求重定向:百度

@RequestMapping("/redirect2")
    public void redirect2(HttpServletResponse response) throws IOException {
        response.sendRedirect("https://www.baidu.com");
    }

使用 Fiddler 抓包演示

先输入网址,但是不要按下回车,打开 Fiddler 在按下回车

 

通过抓包软件可以看到, 原本的localhost:8080/test/redirect2 状态码是302. 请求重定向成功

forward 和 redirect 具体区别如下:

1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。

2. 请求重定向地址发⽣变化,请求转发地址不发生变化。

3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问。


本文完,感谢观看,不足之处请在评论区指出 !

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

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

相关文章

PyQt学习笔记-使用通用数据库接口QtSql操作SQLite数据库

使用通用的数据库接口的好处是当数据库发生改变时&#xff0c;只需要修改初始化的配置即可&#xff0c;而不用修改对应的更多的代码。 一、QtSql类 QtSql类时的数据库操作接口类&#xff0c;包含如下类&#xff1a; QSql QSqlError QSqlQueryModel QSqlRelationalTableMo…

SQL基础入门-条件查询语句

前言 可以关注我的云原生社区&#xff1a;云原生社区 也可以关注我的英语社区&#xff1a;从零开始学英语 一. 创建数据库并写入数据 1.1 创建数据库 MySQL [school]> create database game; Query OK, 1 row affected (0.01 sec)MySQL [school]> use game Database c…

[PyTorch][chapter 40][CIFAR-10 数据集]

前言&#xff1a; CIFAR-10和CIFAR-100是8000万个微小图像数据集的标记子集。它们由Alex Krizhevsky、Vinod Nair和Geoffrey Hinto收集 目录&#xff1a; CIFAR-10数据集简介 在线下载方式 离线下载方式 一 CIFAR-10数据集简介 CIFAR-10数据集由10个类别的60000张32x32…

碳中和城市建筑能源系统(3):负荷篇(龙惟定)2022

碳中和城市建筑能源系统(3):负荷篇 摘要 本文是碳中和城市建筑能源系统系列文章的第三篇。碳中和城市能源系统要实现“两个替代”&#xff0c;即能源生产的可再生能源替代和能源消费的电力替代。因此有&#xff12;个关键点对负荷分析提出了要求&#xff1a;一是建筑电气化&a…

网络安全运维-数字取证篇

Volatility使用 使用工具&#xff1a;Autopsy、Volatility、Wireshark 这部分可分为数据分析与取证、内存取证两块内容 一、数据分析与取证 1、wirwshark图形化 wireshark基本操作 过滤器使用 ip.src x.x.x.x 选择源ip为x.x.x.x的数据包 tcp.port xx 选择源或目标端口…

WPF开发txt阅读器13:绑定快捷键实现翻页

文章目录 绑定快捷键翻页功能跳转到首尾章节跳转 txt阅读器系列&#xff1a; 需求分析和文件读写目录提取类&#x1f48e;列表控件与目录字体控件绑定&#x1f48e;前景/背景颜色书籍管理系统&#x1f48e;用树形图管理书籍语音播放&#x1f48e;播放进度显示&#x1f48e;快进…

python数据可视化玩转Matplotlib直方图、箱型图、密度图、正态分布、偏度和峰度

目录 1. 直方图、箱线图和密度图 1.1 直方图 1.2 箱线图 1.3 密度图 2. 正态分布 3. 偏度和峰度 结论 1. 直方图、箱线图和密度图 直方图、箱线图和密度图是数据分析中十分常用的图形。它们可以帮助我们更好地理解数据的分布情况&#xff0c;从而更好地进行数据分析和处…

M1和M2的剪刀差是什么意思?

Scissors difference between M1 and M2. 在市场上流通的货币的数量&#xff0c;用金融术语来讲叫货币供应量。 因为市场上的货币流动性各不相同&#xff0c;长期存款的流动性不如短期存款的强&#xff0c;短期存款的流动性不如现金的强。 所以在统计货币量的时候&#xff0c;标…

Linux优化命令之free命令

free 这里写目录标题 一、free命令描述&#xff1a;1.free命令的语法&#xff1a;2.free命令的选项&#xff1a;3.free命令的输出格式&#xff1a; 二、压力测试工具stress&#xff1a;1.工具简介&#xff1a;2.参数详解&#xff1a;3.下载压力测试工具&#xff1a; 三、模拟实…

osg环境搭建与使用

目录 环境安装 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; 案例四&#xff1a; 我的vs2022,window11 环境安装 看这个文章即可,博客很详细&#xff0c;按照这个没问题的 (5条消息) 【OSG】OSG环境部署 OSG3.6.5vs2017win10_x64&#xff08;超详细&…

STM32F407的介绍

文章目录 芯片STM32F407资源F407总线架构STM32F407系统框图STM32F407地址分配 芯片 STM32F407资源 内核 32位 高性能ARM Cortex-M4处理器时钟&#xff1a; 高达168MHz&#xff0c;实际还可以超频一点点 stm32f407的主频通过PLL倍频后能够达到168MHz&#xff0c;而且芯片内置一…

使用大白菜PE给苹果电脑安装win7ghost

如何安装大白菜苹果电脑&#xff1f;ghost (苹果电脑能用大白菜安装系统吗) 喜欢用苹果Mac电脑&#xff0c;开始后发现不习惯苹果的操作系统&#xff0c;还是习惯用Windows我们可以给苹果系统Mac电脑上安装Windows系统&#xff0c;享受苹果的外观&#xff0c;操作windows系统…

【Java】Java核心要点总结 66

文章目录 1. 成员变量 和 局部变量 的区别2 . 静态方法 和 实例方法 区别3. 基本数据类型 和 包装类 的区别4. 局部变量一定存储在栈中吗&#xff1f;5. 包装类型的缓存机制 1. 成员变量 和 局部变量 的区别 ● 语法形式 &#xff1a;从语法形式上看&#xff0c;成员变量是属于…

基于opencv与mediapipe的民族舞舞蹈动作识别

需要项目的请关注、私信 基于opencv与mediapipe的民族舞舞蹈动作识别 1、原理介绍1.1 Opencv1.2 Mediapipe 2、实验步骤2.1 导入工具包2.2 中文输入2.4 建立姿态位置信息库2.5 位置信息获取2.6 姿态识别 3 实验结果与评价 1、原理介绍 1.1 Opencv Opencv&#xff08;Open So…

Android Studio实现知乎日报App

项目目录 一、项目概述二、开发环境三、运行演示 一、项目概述 本系统基于 MVP RxJava Retrofit进行设计和开发&#xff0c;通过 Retrofit 实现了无网缓存&#xff0c;基于 MVP 模式对 Activity 和 Fragment 封装了两个基类&#xff0c;同样适用于非 MVP 的实现。运用 Recyc…

termux中apache+php的安装

如果 ssl.so.3 not found 需要 apk update 更新一下 然后&#xff0c;pkg install php 完成php 8.2安装 使用命令开启 存储 权限 termux-setup-storage apt install phpmyadmin apt install php-apache apache2 配置文件位于 cd $PREFIX/etc/apache2/ cd /data/data/com.te…

【干货】Android系统定制基础篇:第四部分-Android二次构建

背景 有时我们需要使用同一套Android源码编译生成各种差异化产品固件&#xff0c;比如&#xff1a;A产品、B产品、C产品&#xff0c;各产品之间大部分功能是相同的&#xff0c;仅个别功能定义上有差别。 方法一 Android默认的做法是在源码 device 目录下增加A、B、C产品&…

三个领域的微调模型;Meta推出新的生成式AI模型Voicebox

&#x1f989; AI新闻 &#x1f680; Meta推出新的生成式AI模型Voicebox&#xff0c;可执行音频编辑、采样、风格化等语音生成任务 摘要&#xff1a;Meta继推出ImageBind之后&#xff0c;于今天再次推出了全新的生成式AI模型Voicebox。该模型帮助创作者执行音频编辑、采样和风…

2023年6月最新|大屏可视化配置

大屏可视化配置 运行环境&#xff1a;VScode 一、可视化适配 大屏下显示一般都是16:9尺寸 1920*1080 &#xff0c;做适配也就是在这个比例的基础上进行的 方案一&#xff1a;打开VSCode终端&#xff0c;下载flexible 1、选中要运行的文件&#xff0c;右键–>【在集成终…

使用Apache ShardingSphere简答实现水平分表

1 简介 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 官方网站 https://shardingsphere.apache.org/document/current/cn/overview/2 创建…