【Spring Boot】SpringMVC入门

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

传递JSON使用对象来接收:

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

传递JSON使用Map来接收:

@RequestMapping("/m8")
public String m8(@RequestBody Map<String,String> map){return "传递的Json数据:" + map;
}

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.mzph.cn/news/612540.shtml

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

相关文章

众和策略股市行情分析:了解散户的典型特征

散户特色如下&#xff1a; 1、出资规模小&#xff1a;散户的出资规模一般比较小&#xff0c;资金量有限&#xff0c;无法对商场发生显著的影响。资金量较小的一起&#xff0c;其对危险的承受能力也相对较弱。 2、缺少危险意识&#xff1a;散户往往缺少危险意识&#xff0c;没…

2024年网络工程师10大必备软件,最新安装包分享

功夫再高&#xff0c;也怕菜刀。作为网络工程师&#xff0c;我们手中的菜刀是什么&#xff1f; 以下10大网工必备软件都已整理好安装包&#xff0c;需要的朋友可以在文末获取。 1、Cisco Packet Tracer&#xff08;思科模拟器&#xff09; Cisco Packet Tracer 是由Cisco公司发…

C++学习笔记(三十):c++ 多个返回值

本节主要介绍c函数多个返回值的实现方式。 返回结构体 通过返回一个结构体来返回多个值&#xff0c;该实现方式代码的可读性高&#xff0c;便于维护。同时在栈上创建结构体&#xff0c;函数也拥有比较好的性能。示例代码如下&#xff1a; #include <iostream>struct Test…

详解JavaScript中的WeakMap和WeakSet

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》 ​ ​ ✨ 前言 内存管理一直是JavaScript这门语言中的难点和痛点。由于其自动垃圾回收机制的限制,在某些场…

HTTPS详解及openssl简单使用

OpenSSL 中文手册 | OpenSSL 中文网 本文介绍https传输协议中涉及的概念&#xff0c;流程&#xff0c;算法&#xff0c;如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代&#xff0c;最大的原因就是不安全&#xff0c;至于为什么不安全&#xff0c;看了下面这张图…

媒体运营常用的ChatGPT通用提示词模板

媒体平台选择&#xff1a;如何选择合适的媒体平台&#xff0c;确保内容的有效传播&#xff1f; 内容策划与创作&#xff1a;如何策划和创作高质量的内容&#xff0c;吸引和留住目标受众&#xff1f; 内容发布与推广&#xff1a;如何有效地发布和推广内容&#xff0c;提高内容…

如何通过 Prompt 优化大模型 Text2SQL 的效果

前言 在上篇文章中「大模型LLM在Text2SQL上的应用实践」介绍了基于SQLDatabaseChain的Text2SQL实践&#xff0c;但对于逻辑复杂的查询在稳定性、可靠性、安全性方面可能无法达到预期&#xff0c;比如输出幻觉、数据安全、用户输入错误等问题。 本文将从以下4个方面探讨通过Pr…

Python办公自动化 – 操作NoSQL数据库和自动化图像识别

Python办公自动化 – 操作NoSQL数据库和自动化图像识别 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动…

前端-基础 表格标签 - 相关属性详解

目录 相关属性 &#xff1a; align 属性 &#xff1a; border 属性 &#xff1a; cellpadding 属性 &#xff1a; cellspacing 属性 &#xff1a; width 属性 &#xff1a; height 属性 &#xff1a; 首先&#xff0c;需要声明的是 表格标签这部分属性&…

Hive基础题-1

别看我&#xff0c;不看答案我也不会写 正因为不会写&#xff0c;所以才要每天一练 本地hive练习题 SET hive.exec.mode.local.autotrue; -- 默认 false SET hive.exec.mode.local.auto.inputbytes.max50000000; SET hive.exec.mode.local.auto.input.files.max5; -- 默认 4# …

【2023开发组一等奖】星地一体化智能土壤环境分析监测系统

作品介绍 1 需求分析 土壤是国家最重要的自然资源之一,不仅是构成生态系统的基本要素,同时也是人类赖以生存的物质基础。土壤环境状况不仅直接影响到国民经济发展,而且直接关系到农产品安全和人体健康。2021年底,国务院印发的《“十四五”土壤、地下水和农村生态环境保护规…

云卷云舒:数据库的serverless演进趋势

随着阿里云、华为云的PolarDB、guessDB都在大力演进serverless版本的发布&#xff0c;部分特性已经发布公测&#xff0c;国内的另外两家云服务商移动云、天翼云也相继推出serverless版本&#xff0c;并计划近期公测&#xff0c;可以看出数据库的serverless趋势依然非常明显。 数…

Hotspot源码解析-第十七章-虚拟机万物创建(三)

17.4 Java堆空间内存分配 分配Java堆内存前&#xff0c;我们先通过两图来了解下C堆、Java堆、内核空间、native本地空间的关系。 1、从图17-1来看&#xff0c;Java堆的分配其实就是从Java进程运行时堆中选中一块内存区域来映射 2、从图17-2&#xff0c;可以看中各内存空间的…

Grafana Promtail 配置解析

由于目前项目一般都是部署在k8s上&#xff0c;因此这篇文章中的配置只摘录k8s相关的配置&#xff0c;仅供参考&#xff0c;其他的配置建议上官网查询。 运行时打印配置 -print-config-stderr 通过 ./promtail 直接运行Promtail时能够快速输出配置 -log-config-reverse-order 配…

thinkphp学习07-数据库的数据查询

单数据查询 单条数据查询&#xff0c;一般是一维数组 Db::table()中 table 必须指定完整数据表&#xff08;包括前缀&#xff09;&#xff0c;如果配置了表前缀&#xff0c;Db::name()中可以忽略 如果希望只查询一条数据&#xff0c;可以使用 find()方法&#xff0c;需指定 wh…

Django 框架添加管理员,完成对普通用户信息管理

前情回顾&#xff1a;Django框架 完成用户登录注册 文章目录 1.创建管理员2.完善管理员功能2.1增加管理员登录功能2.2完善展示用户信息功能2.3完善修改用户信息功能2.4完善删除用户信息功能 1.创建管理员 一般管理员都是直接指定&#xff0c;不开放页面注册&#xff0c;可以直…

Mermaid 教程

Mermaid 教程 Mermaid 介绍 Mermaid 是一个用于生成流程图、时序图、甘特图等图表的 JavaScript 库。它使用类似于 Markdown 的文本语法&#xff0c;使得创建图表变得简单直观。以下是一个简单的 Mermaid 教程&#xff0c;介绍如何使用 Mermaid 创建流程图、时序图和甘特图。…

Qt中QByteArray之元素访问

访问QByteArray类对象中的某个元素主要有4种方式,分别为[]、at()、 data[]和constData[]。其中&#xff0c;[]和data]]方式为可读可写&#xff0c;at()和constData[]方式仅为可读。如果只是进行读操作&#xff0c;则通过at()和constData[]方式的访问速度最快&#xff0c;因为避…

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

【MMC子系统】四、MMC控制器驱动层

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …