【Spring Boot】SpringMVC入门

news2024/11/16 21:38:23

1.什么是springMVC

MVC就是把一个项目分成了三部分:

image-20240108192355814

MVC是一种思想。Spring进行了实现,称为Spring MVC。SpringBoot是创建SpringMVC项目的一种方式而已。springMVC对于MVC做出了一些改变:

image-20240108192623557

当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有view层。所以view又有了一层解释:之前返回的是视图,现在返回的是视图所需要的数据。SpringWebMVC是⼀个Web框架

2. springMVC请求

2.1@RequestMapping 路由映射

可以修饰类也可以修饰方法,访问路径是:类路径+方法路径

@RestController
@RequestMapping("/say/springboot")
public class HelloController {
    @RequestMapping("/hi")
    public String sayHi(){
        return "springboot,hi";
    }
}

RequestMapping 支持get,post等请求,访问路径可以写多层,注意:/可以省略,建议企业开发的时候统一加上,前加后不加。

也可以指定请求传参:

@RequestMapping(value = "/hello",method = RequestMethod.POST)//只支持POST请求
public String sayHello(){
    return "springboot,hello";
}
@RequestMapping(value = "/hello",method = RequestMethod.GET)//只支持GET请求
public String sayHello(){
    return "springboot,hello";
}

2.2 传递单个参数

@RestController
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/m1")
    public String m1(Integer num){
        return "接收到的参数num: " + num;
    }
}

开发中,建议加上类路径

  1. 避免重复
  2. 方便查找代码

发送的请求:http://localhost:8080/param/m1?num=10

发送请求的参数需要名称一样。底层逻辑:从请求的参数中,获取参数名为num的值,并给num赋值

需要注意的是,建议不要使用基本数据类型,要使用包装类,如果使用基本数据类型参数不传递就会报错:

@RequestMapping("/m2")
public String m2(int num){
    return "接收到的参数num: " + num;
}

使用包装类就是获取的数值为null,不会报错。开开发的时候建议使用包装类

2.3 传递多个参数

@RequestMapping("/m3")
public String m3(String username,String password){
    return "接收到的参数username: " + username + "  password: " + password;
}

发送的请求:http://localhost:8080/param/m3?username=“张三”&password=“123456”

参数的顺序可以调换。

2.4 后端参数重命名

使用@RequestMapping注解来进行重命名。如果进行了重命名,就必须要使用@RequestParam注解里的名字

@RequestMapping("/m4")
public String m4(@RequestParam("name") String username, String password){
    return "接收到的参数username: " + username + "  password: " + password;
}

发送的请求:http://localhost:8080/param/m4?name=“张三”&password=“123456”

使用@RequestMapping注解后默认是比传参数,可以改为非必传参数:

@RequestMapping("/m4")
public String m4(@RequestParam(value = "name",required = false) String username, String password){
    return "接收到的参数username: " + username + "  password: " + password;
}

2.5 传递对象

创建一个User对象:

@Data
public class User {
    Integer id;
    String username;
    String password;
}

参数设置为对象:

@RequestMapping("/m5")
public String m5(User user){
    return "接收到的user参数:" + user.toString();
}

开发中,接口的参数通常定义为对象。需要注意的是,基本数据类型比如int,不传递参数的时候,不会报错会赋初始值,int类型则为0。

2.6 传递数组

@RequestMapping("/m6")
public String m6(String[] paramArray){
    return "接收到的paramArray参数:" + Arrays.toString(paramArray);
}

参数传递数组的方式:

http://localhost:8080/param/m6?paramArray=zhangsan,lisi,wangwu,zhaoliu

http://localhost:8080/param/m6?paramArray=zhangsan&paramArray=lisi&paramArray=wangwu&paramArray=zhaoliu

2.7 传递集合

传递集合需要使用@RequestParam注解,说明以集合的方式来接收。这个注解也可以进行参数重命名

@RequestMapping("/m7")
public String m7(@RequestParam List<String> paramList){
    return "接收到的paramList参数:" + paramList;
}

参数传递的方式和数组一样:

http://localhost:8080/param/m7?paramList=zhangsan,lisi,wangwu,zhaoliu

2.8 传递JSON

springmvc中使用@RequestBody注解,来使Json转化为对象,就算Json数据中只有一个键值对,也是转化成对象,后面添加进行修改的时候,可以对后端的对象进行添加字段,符合了开闭原则。

可以使用postman来进行发送数据

image-20240109231213798

@RequestMapping("/m8")
public String m8(@RequestBody User user){
    return "传递的Json数据:" + user;
}

2.9 获取URL中的参数

如果URL是:http://localhost:8080/param/m9/10。我们用之前的方法就没有办法获取参数10 。

要想解决上面的问题,我们得用@PathVariable注解:

@RequestMapping("/m9/{userId}")
public String m9(@PathVariable String userId){
    return "URL参数:userid:" + userId;
}

可以传递多个参数,但是注意顺序和个数必须和后端是对应的。请求格式必须和后端定义的URL格式匹配。

http://localhost:8080/param/m9/10/zhangsan

@RequestMapping("/m9/{userId}/{username}")
public String m9(@PathVariable String userId, @PathVariable String username){
    return "URL参数:userid:" + userId + " username:" + username;
}

还可以对参数重命名:

@RequestMapping("/m9/{userId}/{name}")
public String m9(@PathVariable String userId, @PathVariable("name") String username){
    return "URL参数:userid:" + userId + " username:" + username;
}

2.10 上传文件

用postman发送文件

image-20240109233313177

上传文件后端使用的是@RequestPart注解

@RequestMapping("/m10")
public String m10(@RequestPart MultipartFile file){
    System.out.println(file.getOriginalFilename());
    return "success";
}

2.11 获取cookie/session

网页模拟发送cookie

image-20240110113019844

springMVC获取cookie,我们有传统的servlet方式,这种方式可以获取全部cookie。

@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest req){
    Cookie[] cookies = req.getCookies();
    if (cookies != null){
        Arrays.stream(cookies).forEach(cookie -> {
            System.out.println(cookie.getName() + " : " + cookie.getValue());
        });
    }
    return "获取cookies成功";
}

使用注解的方式获取,只能获取指定的cookie.

@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue(value = "name",required = false) String name){
    return "name : " + name;
}

springMVC获取session也有传统放入获取方式和注解的获取方式。但是在获取session之前先存储session

@RequestMapping("/setSession")
public String setSession(HttpServletRequest req){
    HttpSession session =  req.getSession();
    session.setAttribute("username","zhangsan");
    return "成功存储session" ;
}

用传统的方式去获取session:

@RequestMapping("/getSession")
public String getSession(HttpServletRequest req){
    HttpSession session =  req.getSession(false);
    if (session != null){
        String username = (String) session.getAttribute("username");
        return "登录用户的名称:" + username;
    }
    return "未获取session" ;
}

使用注解获取session

@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute String username){
    return "username: " + username ;
}

参数直接设施为:HttpSession。

@RequestMapping("/getSession3")
public String getSession3(HttpSession session){//等价于:HttpSession session =  req.getSession(true);
    return "username: " + session.getAttribute("username");
}

2.12 获取Header

我们以获取Header中的User-Agent字段为例:

使用传统方式:

@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request){
    return "User-Agent: " + request.getHeader("User-Agent");
}

使用注解:

@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("User-Agent") String userAgent){
    return "User-Agent: " + userAgent;
}

3. spring MVC 响应

3.1 返回静态页面

编写一个index.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Spring MVC 返回的静态页面</h1>
</body>
</html>

用@Controller注解而不是用@RestController注解,是因为@Controller返回的就是试图,随着前后端分离,后端不处理页面,就返回页面所需要的数据使用@ResponseBody。@RestController注解 = @ResponseBody + @Controller

@Controller
public class ReturnController {
    @RequestMapping("/returnIndex")
    public String returnIndex(){
        return "/index.html";
    }
}

3.2 返回数据

返回数据使用的注解是:@ResponseBody。

可以修饰类,也可以修饰方法

  • 修饰类的时候,表示这个类下的所有方法,返回的均为数据
  • 修饰方法时,表示该方法返回的是数据
  • 如果一个类中的所以方法返回的都是数据,我们就把这个注解加在类上
@ResponseBody
@RequestMapping("/returnData")
public String returnData(){
    return  "返回视图所需要的数据";
}

3.3 返回HTML代码片段

返回HTML片段使用@ResponseBody注解就行了,会自动解析成HTML片段,如果想要返回正常的字符串,就需要给字符串中关于HTML标签部分加转义字符。

@ResponseBody
@RequestMapping("/returnHtml")
public String returnHtml(){
    return "<h1>返回的html片段</h1>";
}

3.4 返回JSON

使用@ResponseBody注解,返回的时候直接返回对象或者Map数据类型返回的就是Json数据格式。

@ResponseBody
@RequestMapping("/returnJson")
public User returnJson(){
    User user = new User();
    user.setId(1);
    user.setUsername("zhangsan");
    user.setPassword("123456");
    return user;
}

使用Map数据类型:

@ResponseBody
@RequestMapping("/returnMap")
public Map<String,String> returnMap(){
    Map<String,String> map = new HashMap<>();
    map.put("id","1");
    map.put("name","lisi");
    map.put("gender","男");
    return map;
}

3.5 设置状态码

设置状态码,不影响数据展示。

@ResponseBody
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){
    response.setStatus(401);
    return "设置状态码成功";
}

3.6 设置Header(了解)

使用注解中的produces设置Content-Type字段。

produces:设置返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回

@ResponseBody
//使用注解中的produces设置Content-Type字段
@RequestMapping(value = "/setHeader",produces = "application/json;charset=utf-8")
public String setHeader(HttpServletResponse response){
    response.setHeader("test111","test111");//设施header其他字段
    return "{'ok':1}";
}

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

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

相关文章

【python基础】一文搞懂:Python 中轻量型数据库 SQLite3 的用法

一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法 文章目录 一文搞懂&#xff1a;Python 中轻量型数据库 SQLite3 的用法1 引言2 SQLite3 简介3 基本步骤4 示例代码4.1 连接数据库4.2 创建表4.3 插入数据4.4 查询数据4.5 更新/删除数据4.6 关闭数据库连接 5 实例演示…

作业--day44

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面。如果账号和密码不匹配&#xf…

Win10下python3和python2同时安装并解决pip共存问题

特别说明&#xff0c;本文是在Windows64位系统下进行的&#xff0c;32位系统请下载相应版本的安装包&#xff0c;安装方法类似。 使用python开发&#xff0c;环境有Python2和 python3 两种&#xff0c;有时候需要两种环境切换使用&#xff0c;下面提供详细教程一份。 1、下载…

MySQL之导入、导出远程备份

一、Navicat工具导入、导出 1.1 导入 第一步&#xff1a; 右键&#xff0c;点击运行SQL文件 第二步&#xff1a; 选择要运行的SQL&#xff0c;点击开始 第三步&#xff1a; 关闭即可 1.2 导出 第一步&#xff1a; 右键选择&#xff0c;导出向导 第二步&#xff1a; 选择SQL脚…

QT开发 QT5.15.2安装(换源极速安装)

▬▬▬▬▬▶QT安装◀▬▬▬▬▬ &#x1f384;QT下载器获取 点我下载(●’◡’●) &#x1f384;下载器放自定义文件夹(路径全英文) 文件名改短好操作 &#x1f384;在自定路径唤出cmd窗口 &#x1f384;输入命令开始换源安装 ins.exe --mirror https://mirrors.ustc.ed…

空间转录组与单细胞转录组联合分析——MIA,代码分享(Nature Biotechnology :)

​ 原文&#xff1a;Integrating microarray-based spatial transcriptomics and single-cell RNA-seq reveals tissue architecture in pancreatic ductal adenocarcinomas | Nature Biotechnology 研究者采用 MIA 联合 scRNAseq 和 ST 数据&#xff0c;分析原发性胰腺导管腺癌…

SCS模型(径流曲线法)概述

目录 1.介绍&#xff1a;2.计算公式&#xff1a;参考文献&#xff1a;小结&#xff1a; 1.介绍&#xff1a; SCS模型&#xff08;径流曲线法&#xff09;是由美国农业部水土保持局(Soil Conservation Service) 基于经验提出&#xff0c;最初用于预测在农业用地小型流域降雨所累…

秒变办公达人,只因用了这5款在线协同文档app!

在日常工作中&#xff0c;我们不可避免地需要处理各种文档&#xff0c;有时你可能会为如何高效地管理这些文档而感到烦恼&#xff0c;或是不知道如何挑选合适的在线文档工具&#xff1f; 不用担心&#xff01;在这篇文章中&#xff0c;我们将介绍5个好用的在线文档工具App&…

Gamebryo游戏引擎源码(gb2.6+gb3.2+gb4.0+中文手册)

Gamebryo游戏引擎源码&#xff0c;是源码&#xff0c;是源码&#xff0c;是源码。喜欢研究游戏的可以下载研究研究&#xff0c;代码写得很好&#xff0c;有很多借得参考的地方。 Gamebryo游戏引擎源码&#xff08;gb2.6gb3.2gb4.0中文手册&#xff09; 下载地址&#xff1a; 链…

linux --proc文件夹学习笔记

内容在飞书文档&#xff1a; Docshttps://r0dhfl3ujy9.feishu.cn/docx/Xe2wd23MToSmGrxUm9kcVHrPn7g?fromfrom_copylink

CentOS 6 制作openssh 9.6 p1 rpm包(含ssh-copy-id、openssl) —— 筑梦之路

openssh 9.6 需要openssl 1.1.1 以上版本&#xff0c;因此需要先安装openssl 1.1.1&#xff0c;可阅读这篇升级更新openssl版本到1.1.1w CentOS 6 制作openssl 1.1.1w rpm包 —— 筑梦之路-CSDN博客 CentOS 6很久都停止更新和支持&#xff0c;关于此版本的写的不多&#xff…

OpenHarmony之编译构建使用指导

目录结构 /build # 编译构建主目录├── __pycache__ ├── build_scripts/ # 编译相关的python脚本 ├── common/ ├── config/ # 编译相关的配置项 ├─…

vue3 ts defineProps、defineEmits、defineExpose、defineOptions、defineSlots

文章目录 前言一、defineProps二、defineEmits三、defineExpose四、defineOptions&#xff08; Vue3.3 新特性&#xff09;五、defineSlots(Vue3.3 新特性) 前言 本章我们来讲解vue3 ts 中 defineProps、defineEmits、defineExpose、defineOptions、defineSlots的使用及作用。 …

多机TCP通讯之hello world(C++)

文章目录 TCP是什么准备工作CMakeLists.txt服务端代码客户端代码参考 TCP是什么 TCP&#xff08;传输控制协议&#xff09;是一种在计算机网络中广泛使用的协议&#xff0c;它提供了可靠的、面向连接的数据传输服务。TCP 是 OSI 模型中的传输层协议&#xff0c;它确保了数据的…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用RPA全球生态 2024-01-05 17:27 发表于河北

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷&#xff0c;但现有研究成果主要集中在财务业务单一领域&#xff0c;缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理&#xff0c;无论从自身技术发展&#xff0c;或…

php处理高并发下单减库存解决

目录 一&#xff1a; 问题描述 二&#xff1a;可能方案 三&#xff1a;加锁方案 一&#xff1a; 问题描述 处理高并发下的库存减少是电商系统中的一大挑战。当多个用户同时尝试下单购买同一商品时&#xff0c;如何确保库存的准确性&#xff0c;同时保证系统的高可用性&#…

(23)Linux的软硬连接

前言&#xff1a;上一章我们讲解了 inode&#xff0c;为文件系统收了尾&#xff0c;这几章我们充分地讲解完了文件系统的知识点&#xff0c;现在我们开始开始学习软硬链接了。 软硬链接 1、Linux 下的快捷方式&#xff1a;软链接 上一章我们介绍完了 inode &#xff0c;我们…

SpringCloudAlibaba微服务架构实战派上下册技术交流!

另外我的新书RocketMQ消息中间件实战派上下册&#xff0c;在京东已经上架啦&#xff0c;目前都是5折&#xff0c;非常的实惠。 https://item.jd.com/14337086.html​编辑https://item.jd.com/14337086.html “RocketMQ消息中间件实战派上下册”是我既“Spring Cloud Alibaba微…

力扣最热一百题——只出现一次的数字

这个合集已经很久没有更新了&#xff0c;今天来更新更新~~~ 目录 力扣题号 题目 题目描述 示例 提示 题解 Java解法一&#xff1a;Map集合 Java解法二&#xff1a;位运算 C位运算代码 力扣题号 136. 只出现一次的数字 - 力扣&#xff08;LeetCode&#xff09; 下述题…

FS【1】:SSP

文章目录 前言1. Abstract2. Introduction2.1. Motivation2.1.1. Few-shot Segmentation (FSS) Task2.1.2. Few-shot Segmentation (FSS) Problem 2.2. Contribution 3. Methods3.1. Motivation3.2. Overview of the architecture4.3. Self-support Prototype4.4. Adaptive Sel…