当前位置: 首页 > news >正文

Spring Boot Web MVC

文章目录

  • 一、Spring Boot Web MVC 概念
  • 二、状态码
  • 三、其他注解
  • 四、响应操作

一、Spring Boot Web MVC 概念

Spring Web MVC 是⼀个 Web 框架,一开始就包含在Spring 框架里。

1. MVC 定义

软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

在这里插入图片描述

2. 什么是Spring MVC

MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现
Spring MVC 是⼀个实现了 MVC 模式的 Web 框架
Spring Boot 只是实现Spring MVC的其中⼀种方式而已
Spring Boot 实现了MVC思想后,就被称为Spring MVC,可以实现 web功能

Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web MVC框架, 来实现web功能

Spring Boot 结合自身特点的情况,如下图,不过核心依旧没变
在这里插入图片描述
3. Spring Boot 不同的传参介绍

  1. 普通传参, 也就是通过查询字符串来传参
  2. form-data
  3. x-www-form-urlencoded
  4. raw
  5. 可以上传任意格式的⽂本,可以上传text、json、xml、html等

4. Spring Boot 不同的传参方式

如果使用的是基本类型,必须要传值,不然会报错,因为基本类型无法被赋值null

(1)传递单个参数

限制方法

@RequestMapping(value = "demo1",method = RequestMethod.PUT)
public String demo1(String name){return "接收到的name:" + name;
}

在这里插入图片描述

不限制方法

@RequestMapping("demo1")
public String demo1(String name){return "接收到的name:" + name;
}

(2)传递多个参数

多个参数发送的时候,顺序是无所谓的

在这里插入图片描述

@RequestMapping("demo2")
public String demo2(String name, Integer age){return "接受到的name:" + name + ",age:" + age;
}

(3)传递对象

@RequestMapping("demo3")
public String demo3(Person person){return person.toString();
}

在这里插入图片描述

@RequestMapping("demo4")
public String demo4(@RequestParam("name") String username){return "接收到的name:" + username;
}

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

想要把name变成非必传参数

计算机这边正规的还是name,但是程序员这边是用username代替了name

(4)传递数组/集合

@RequestMapping("demo5")
public String demo5(String[] str){return "接收到的数组:" + str.toString() + ",长度是:" + str.length;
}

在这里插入图片描述

如果传的是一个列表,idea会把列表默认为数组,需要一个@RequestParam注解,才能让idea知道这个是列表

@RequestMapping("/demo6")
public String m7(@RequestParam(required = false,defaultValue = "zhangsan,lisi,wangwu,zhaoliu") List<String> listParam){return "接收到的参数listParam:"+ listParam + ",长度:"+listParam.size();
}

(5)传递JSON数据

Json 只能接收正文的,而且只能接收JSON字符串格式

工作中,上面四种传参方式都不常用,比起传单个/多个数据,还是更倾向于传对象,但是上述方法太过繁琐,我们一般使用JSON传递数据

概念:本质上是一个字符串,有着自己的格式和语法,可以描述数据信息

语法
(1)数据在 键值对(Key/Value) 中
(2)数据由逗号 , 分隔
(3)对象⽤ {} 表⽰
(4)数组⽤ [] 表⽰
(5)值可以为对象, 也可以为数组, 数组中可以包含多个对象

传递方法

接收JSON对象, 需要使⽤ @RequestBody 注解
原理:赋值是要key=XXX的格式,但是JSON本质是一个字符串,是一整个数据,需要转换

二、状态码

  • http状态码,不是后端定义的
    • 5XX通常指服务端发生错误,4XX通常指客户端发生错误,3XX通常是重定向,2XX通常表示成功
  • 业务状态码,后端定义的,无法作假

三、其他注解

1. 获取URL中参数@PathVariable

@PathVariable:用来获取url路径上的数据绑定

@RequestMapping("/demo8/{name}/{wendiage}")
public String demo8(@PathVariable String name, @PathVariable("wendiage") Integer age){return "解析的name:" + name + ", age:" + age;
}

在这里插入图片描述

  • 查找url的时候,要准确对应

2. 上传文件@RequestPart

@RequestMapping("/demo9")
public String demo9(@RequestPart MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("D:/else/" + file.getOriginalFilename()));return "success";
}

3. 获取Cookie/Session

  1. 传统获取方式
  2. 简洁注解获取方式

这两个都是会话机制

(1) 概念理解

Cookie
Cookie 相当于学生证,注册完成之后,可以让保安知道是该学校的学生,并完成一系列操作

问题:是可以伪造的

Session
会话:⼀个客户与服务器之间的不中断的请求响应

本质上是个“哈希表”,用来存储用户的信息,确保服务器能够分辨出请求从属于哪个对话/用户

在这里插入图片描述

(1)Session是由服务器生成的唯一的标识符。Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失

(2)Session 是服务器端的,无法伪造,需要写代码手动添加。在内存中存储,服务器重启后,就会被清空

(3)问题:分布式情况下,会多创建Session

在这里插入图片描述
在这里插入图片描述

Cookie 和 Session 的区别

  • Cookie 是客⼾端保存⽤⼾信息的⼀种机制,Session 是服务器端保存⽤⼾信息的⼀种机制
  • Cookie 和 Session之间主要是通过 SessionId 关联起来的
  • Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合

(2) 获取Cookie 代码

Spring 是基于servlet创建的,所以servlet支持的,Spring 都支持

//拿到所有的Cookie@RequestMapping("/demo10")public String demo10(HttpServletRequest request, HttpServletResponse response){//Spring内置对象Cookie[] cookies = request.getCookies();StringBuilder builder = new StringBuilder();if (cookies != null){for (Cookie ck : cookies){builder.append(ck.getName() + ":" + ck.getValue());}}return "Cookie信息:" + builder;}//使用注解的方式,一个一个去拿
@RequestMapping("/demo11")
public String cookie(@CookieValue("kunjuan") String bite) {return "bite:" + bite;
}

Cookie 的值需要设置,浏览器 F12打开开发者工具,可以手动设置,但也因说明Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏Cookie校验

在这里插入图片描述

(3) Session 代码

解析:getSession 内部提取到请求中Cookie里的SessionId,然后根据SessionId获取到对应的Session 对象, Session 对象⽤HttpSession来描述

Session 存储

@RequestMapping("/setSess")
public String setsess(HttpServletRequest request) {// 获取Session对象HttpSession session = request.getSession();if (session != null) {session.setAttribute("username", "java");}return "session 存储成功";
}

Session 读取

@RequestMapping("/getSess1")
public String sess(HttpServletRequest request) {// 如果 session 不存在, 不会⾃动创建HttpSession session = request.getSession(false);String username = null;if (session != null && session.getAttribute("username") != null) {username = (String) session.getAttribute("username");}return "username:" + username;
}//通过注解只能拿到一个
@RequestMapping("/getSession2")
public String getSession2(@SessionAttribute(required = false) String username){//@SessionAttribute 默认是一个必传参数return "username:"+username;
}@RequestMapping("/getSession3")
public String getSession3(HttpSession session){String username = (String)session.getAttribute("username");return "登录用户:"+username;
}
//HttpSession session 等同于 HttpSession session = request.getSession(true)

(4) Cookie 和Session 的联系

(1)当一台电脑打开了多个浏览器,每一个浏览器对应的服务器都会创建一个会话,但是服务器之间是不知道这些浏览器都是由用户一个人打开的,服务器每一个会话都会记录一个SessionId,而每一个Id都会对应一个SessionValue,value 里面存了许多值。

(2)后台服务器会把SessionId告诉客户端,把SessionId存到Cookie里面,后面再访问的时候,就会带着SessionId去访问。服务器就可以根据SessionId 带你去拿到这个SessionId对象

3. 获取header

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

四、响应操作

  • Http响应结果可以是数据, 也可以是静态页面,也可以针对响应设置状态码, Header信息等
  • 多个注解时, 没有先后顺序, 先写哪个都可以
  • 响应中的 Content-Type 常见取值有以下几种:
    • text/html : body 数据格式是 HTML
    • text/css : body 数据格式是 CSS
    • application/javascript : body 数据格式是 JavaScript
    • application/json : body 数据格式是 JSON

1. 返回静态页面

Content-Type 为 text/htm

@RestController
@RequestMapping("/return")
public class returnController {@RequestMapping("/htmlTest")public String htmlTest(){return "/index.html";}
}

在这里插入图片描述

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

在这里插入图片描述
(1)解析

@RestController

@RestController 定义返回的数据格式为非视图, 返回⼀个 text/html 信息,即返回的是正文信息

@Controller

@Controller 定义⼀个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理

ResponseBody

@ResponseBody,定义返回的数据格式为⾮视图, 返回⼀个 text/html 信息

在这里插入图片描述
生命周期:活在代码里,编译后,就消失了

2. 返回数据

可以修饰类,也可以修饰方法。修饰类的时候,表示这个类下的所有方法,返回的均为数据,修饰方法时,表示该方法返回的是数据

@ResponseBody
@RequestMapping("/index2")
public String htmlTest3(){return "/index.html";
}

Content-Type 为 text/htm

3. 返回HTML代码片段

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

Content-Type 为 text/htm

4. 返回JSON

@ResponseBody
@RequestMapping("/returnJson")
public Person returnJson(){Person person = new Person();person.setId(1);person.setName("zhangsan");person.setAge(7);return person;
}

当我们的接口返回的是对象时,Content-Type 为 application/json

5. 设置状态码

Spring MVC会根据我们⽅法的返回结果自动设置响应状态码, 程序员也可以⼿动指定状态码

@ResponseBody
@RequestMapping("/setStatus")
public String setStatus(HttpServletResponse response){response.setStatus(401);//通常表示没有登录return "设置状态码";
}

6. 设置header

@ResponseBody
@RequestMapping(value = "/r1",produces = "application/json;charset=utf-8")
public String r1(HttpServletResponse response){//设置headerresponse.setHeader("myhead","myhead");return "{'OK':1}";
}
  • consumes:限制能够处理的请求,不是这个请求的处理不了
  • produces:设置返回的内容类型

相关文章:

Spring Boot Web MVC

文章目录 一、Spring Boot Web MVC 概念二、状态码三、其他注解四、响应操作 一、Spring Boot Web MVC 概念 Spring Web MVC 是⼀个 Web 框架&#xff0c;一开始就包含在Spring 框架里。 1. MVC 定义 软件⼯程中的⼀种软件架构设计模式&#xff0c;它把软件系统分为模型、视…...

设置防火墙

1.RHEL7中的防火墙类型 防火墙只能同时使用一张,firewall底层调用的还是lptables的服务: firewalld:默认 &#xff0c;基于不同的区域做规则 iptables: RHEL6使用&#xff0c;基于链表 Ip6tables Ebtables 2.防火墙的配置方式 查看防火墙状态: rootlinuxidc -]#systemct…...

3.Docker的客户端指令学习与实战

1.Docker的命令 1.1 启动Docker&#xff08;systemctl start docker&#xff09; systemctl start docker1.2 查看docker的版本信息&#xff08;docker version&#xff09; docker version1.3 显示docker系统范围的信息&#xff08;docker info&#xff09; docker info1.4…...

【微服务开篇-RestTemplate服务调用、Eureka注册中心、Nacos注册中心】

本篇用到的资料&#xff1a;https://gitee.com/Allengan/cloud-demo.githttps://gitee.com/Allengan/cloud-demo.git 目录 1.认识微服务 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 …...

python if和while的区别有哪些

python if和while的区别有哪些&#xff1f;下面给大家具体介绍&#xff1a; 1、用法 while和if本身就用法不同&#xff0c;一个是循环语句&#xff0c;一个是判断语句。 2、运行模式 if 只做判断&#xff0c;判断一次之后&#xff0c;便不会再回来了。 while 的话&#xf…...

Unity计时器

using UnityEngine; using System.Collections;public class Timer : MonoBehaviour {public float duration 1.0f; // 定时器持续时间public bool isLooping false; // 是否循环public bool isPaused false; // 是否暂停计时器private float currentDuration 0.0f; // 当前…...

Unity热更新介绍

打包函数 BuildPipeline.BuildAssetBundles("AssetBundles", BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.Android);打包策略和方案 按文件夹打包&#xff1a;Bundle数量少&#xff0c;首次下载块&#xff0c;但是后期更新补丁大按文件打包&#…...

在虚拟机centos7中部署docker+jenkins最新稳定版

在虚拟机centos7中部署dockerjenkins最新稳定版 查看端口是否被占用 lsof -i:80 查看运行中容器 docker ps 查看所有容器 docker ps -a 删除容器 docker rm 镜像/容器名称 强制删除 docker rmi -f 镜像名 查看当前目录 pwd 查看当前目录下所有文件名称 ls 赋予权限 chown 777 …...

nodejs express vue 点餐外卖系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;vscode&#xff08;webstorm&#xff09;&#xff0c;大于mysql5.5 技术说明&#xff1a; nodejs express vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索菜品&#xff0c;轮播图&#xf…...

微信小程序导入js使用时候报错

我是引入weapp库时候&#xff0c;导入js会报错。 需要在小程序开发工具里面配置 就可以了。...

相机存储卡被格式化了怎么恢复?数据恢复办法分享!

随着时代的发展&#xff0c;相机被越来越多的用户所使用&#xff0c;这也意味着更多的用户面临着相机数据丢失的问题&#xff0c;很多用户在使用相机的过程中&#xff0c;都出现过不小心格式化相机存储卡的情况&#xff0c;里面的数据也将一并消失&#xff0c;相机存储卡被格式…...

Firefox修改缓存目录的方法

打开Firefox&#xff0c;在地址栏输入“about:config” 查找是否有 browser.cache.disk.parent_directory&#xff0c;如果没有就新建一个同名的字符串&#xff0c;然后修改值为你要存放Firefox浏览器缓存的目录地址&#xff08;E:\FirefoxCacheFiles&#xff09; 然后重新…...

maven子模块无法导入jar包问题

明明本地仓库有jar包 maven子模块无法导入jar包&#xff0c;然后放到父项目的pom.xml则可以导入 可以试试更新仓库后&#xff0c;引入成功...

ardupilot开发 --- 代码解析 篇

0. 前言 根据SITL的断点调试和自己阅读代码的一些理解&#xff0c;写一点自己的注释&#xff0c;有什么不恰当的地方请各位读者不吝赐教。 1. GCS::update_send 线程 主动向MavLink system发送消息包。 1.1 不断向地面站发送飞机状态数据 msg_attitude: msg_location: n…...

C++引用概述

变量名实质上是一段连续存储空间的别名&#xff0c;是一个标号(门牌号)&#xff0c;程序中通过变量来申请并命 名内存空间&#xff0c;通过变量的名字可以使用存储空间。引用是 C中新增加的概念&#xff0c;引用可以看作 一个已定义变量的别名。 引用的语法&#xff1a; Type&…...

精准努力,提升自己的核心竞争力——中国人民大学与加拿大女王大学金融硕士

步入职场&#xff0c;相信大家都想成为职场的宠儿。经过一番摸爬滚打后&#xff0c;在职场稳固了地位。但想叱咤职场&#xff0c;还需要精准努力&#xff0c;提升自己的核心竞争力。中国人民大学与加拿大女王大学金融硕士项目为你补给能量。 任何资产都有贬值的风险&#xff0…...

string【C++】

string 是什么 string 是什么 长度可变的字符串。...

【Python爬虫】selenium4新版本使用指南

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0c;Opera&am…...

CCF_A 计算机视觉顶会CVPR2024投稿指南以及论文模板

目录 CVPR2024官网&#xff1a; CVPR2024投稿链接&#xff1a; CVPR2024 重要时间节点&#xff1a; CVPR2024投稿模板: WORD: LATEX : CVPR2024_AuthorGuidelines CVPR2024投稿Topics&#xff1a; CVPR2024官网&#xff1a; https://cvpr.thecvf.com/Conferences/2024CV…...

什么是鉴权?一篇文章带你了解postman的多种方式

一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁&#xff0c;您想要进入室内&#xff0c;必须通…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...