【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}";
}

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

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

相关文章

【JaveWeb教程】(18) MySQL数据库开发之 MySQL数据库设计-DDL 如何查询、创建、使用、删除数据库数据表 详细代码示例讲解

目录 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库2.2.3.2 操作数据库 2.3 表操作2.3.1 创建2.3.1.1 语法2.3.1.2 约束2.3.1.3 数据类…

从0到1实现html文件转换为markdown文档(进度0.1)

Spider-Man 前言准备环境1、node.js2、git 执行指令顺序报错及其解决方案一、npm 错误&#xff01;可以在以下位置找到此运行的完整日志解决方案 二、没有修改权限解决方案&#xff1a; 注意事项总结 前言 当我们处理文档时&#xff0c;常常会遇到将HTML文档转换为Markdown文档…

微信小程序:发送小程序订阅消息

文档&#xff1a;小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 目录 步骤一&#xff1a;获取模板 ID步骤二&#xff1a;小程序端获取参数2.1、获取消息下发权限2.2、获取登录凭证&#xff08;code&#xff09; 步骤三&#xff1a;后端调用接口下发订阅消息…

从生活入手学编程(1):Edge浏览器设置自动刷新专业教程

一、前言 我们都知道&#xff0c;Edge浏览器运行时的速度卡的实在是感人…… 于是今天&#xff0c;我就突发奇想&#xff0c;来看一看怎么刷新并且还能保留页面内容。 二、探索 首先&#xff0c;我在此提醒您&#xff0c;在使用这种方法时要非常小心。因为更改网页源代…

一级倒立摆控制 - 非线性 MPC 控制及 MATLAB 实现

系列文章目录 前言 本示例使用非线性模型预测控制器对象和块实现对小车上倒立摆的摆动和平衡控制。 本示例需要 Optimization Toolbox™ 软件为非线性 MPC 提供默认的非线性编程求解器&#xff0c;以计算每个控制间隔的最优控制动作。 一、摆锤/小车装配 本例中的被控对象是…

[笔记]学习做微信小程序

学习视频&#xff1a;前端微信小程序开发教程 本篇文章 只对关键内容笔记&#xff0c;用于自用。 这里写目录标题 注册、下载、安装我的小程序ID&#xff1a;wxe1fbd6939d8797d8我的小游戏ID&#xff1a;wx8b2c3e47ac9127b7开发者工具外观代理设置 创建第一个小程序主界面5个组…

Redis:原理速成+项目实战——Redis实战8(基于Redis的分布式锁及优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战7&#xff08;优惠券秒杀细节解决超卖、一人一单问题&#xff09; &#x1f4d…

C语言数组基础知识

目录 一维数组&#xff1a; 一维数组的创建&#xff1a; 一维数组的访问&#xff1a; 一维数组在内存中的存储&#xff1a; 二维数组&#xff1a; 二维数组的创建&#xff1a; 二维数组的初始化&#xff1a; 二维数组的使用&#xff1a; 二维数组在内存中的存储&#x…

UE5 将类修改目录

有个需求&#xff0c;需要修改ue里面类的位置&#xff0c;默认在Public类下面&#xff0c;我想创建一个二级目录&#xff0c;将所有的类分好位置&#xff0c;方便查看。 上图为创建一个类所在的默认位置。 接下来&#xff0c;将其移动到一个新的目录中。 首先在资源管理器中找…

kubeSphere DevOps自定义容器环境JDK11

kubeSphere DevOps自定义容器环境JDK11 &#x1f342;前言&#x1f342;增加JDK11容器环境&#x1f341;检查是否成功 &#x1f342;不生效的原因排查&#x1f341;按步骤执行如下命令 &#x1f342;前言 kubeSphere 版本v3.1.1 遇到问题:kubeSphere默认支持容器只有JDK8,目前…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-3(1) 刚体的位形 Configuration of Rigid Body

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

接口测试管理续集

今天应大家需要&#xff0c;接着谈app端数据返回层面的用例设计方法。第二部分给大家安利一个“接口管理平台”&#xff0c;以帮助大家解决接口文档维护、接口测试数据Mock、接口自动化测试等问题。希望对小伙伴们有用。 言归正传&#xff0c;进入今天的话题。 一、用例设计 …

【大数据OLAP引擎】StartRocks存算分离

存算分离的原因 降低存储成本&#xff1a;同样的存储大小对象存储价格只有SSD的1/10&#xff0c;所以号称存储成本降低80%不是吹的。 存算一体到存算分离 存算一体 作为 MPP 数据库的典型代表&#xff0c;StarRocks 3.0 版本之前使用存算一体 (shared-nothing) 架构&#xf…

Flink任务实战优化

前言&#xff1a;一个好产品&#xff0c;功能应该尽量包装在服务内部&#xff1b;对于Flink而言&#xff0c;无疑是做到了这一点。但是用户在使用Flink的时候&#xff0c;依然可以从版本的选择、代码逻辑、资源参数、业务的数据情况等方面做任务级的定制化优化&#xff1b;用最…

OpenMv颜色识别

本文旨在分享OpenMv实现数字识别并通过串口打印出来的工程源码。如果大家想将识别的结果传给单片机&#xff0c;即OpenMv与单片机之间的通信&#xff0c;可以参考以下文章&#xff1a; OpenMV与STM32之间的通信&#xff08;附源码&#xff09;_openmv与stm32串口-CSDN博客 ​​…

webpack学习笔记

为什么要使用Webpack webpack是一个用于现代JavaScript应用程序的静态模块打包工具。在webpack里一切文件皆模块&#xff0c;通过loader转换文件&#xff0c;通过plugin注入钩子&#xff0c;最后输出由多个模块组合成的文件&#xff0c;webpack专注构建模块化项目。 webPack可以…

HTTPS详解及openssl简单使用

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

pulsar的架构与特性记录

一、什么是云原生 云原生的概念是2013年Matt Stine提出的,到目前为止&#xff0c;云原生的概念发生了多次变更&#xff0c;目前最新对云原生定义为: Devps持续交付微服务容器 而符合云原生架构的应用程序是: 采用开源堆栈(K8SDocker)进行容器化&#xff0c;基于微服务架构提高灵…

java.net.ConnectException: Connection refused: connect已解决

&#x1f95a;今日鸡汤&#x1f95a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 —— 《枫》 遇见问题莫着急&#xff0c;着急也没用~&#x1f636;‍&#x1f32b;️ 目录 &#x1f9c2;1.令人发麻的问题 &am…

vue/vue3/js来动态修改我们的界面浏览器上面的文字和图标

前言&#xff1a; 整理vue/vue3项目中修改界面浏览器上面的文字和图标的方法。 效果&#xff1a; vue2/vue3: 默认修改 public/index.html index.html <!DOCTYPE html> <html lang"en"><head><link rel"icon" type"image/sv…