Spring Boot Web MVC

news2025/1/17 6:02:18

文章目录

  • 一、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){
    //设置header
    response.setHeader("myhead","myhead");
    return "{'OK':1}";
}
  • consumes:限制能够处理的请求,不是这个请求的处理不了
  • produces:设置返回的内容类型

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

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

相关文章

最新版本idea2023.2新特性,最后一点你肯定想不到哈哈

idea2023.2版本正式发布&#xff0c;最新的idea2023.2包含以下新特性&#xff1a; AI Assistant 当前具备一组由 AI 提供支持的初始功能&#xff0c;提供集成式 AI 聊天&#xff0c;可以完成一些任务&#xff0c;例如自动编写文档注释、建议名称、生成提交消息等。编辑器内性能…

【23真题】对不起,由于我的择校分析,这所可能会炸!

哈喽大家好&#xff0c;现在这个时间节点&#xff0c;有很多同学开始刷真题了&#xff01;所以23真题系列正式启动&#xff01;小马哥将全面发布23真题及详细解析&#xff01; 注意太原科技大学&#xff0c;自我发了择校分析以后&#xff08;苍天为证&#xff0c;我真的没有任…

水果FL Studio21.2体验版下载安装教程(增加云服务功能)

FL Cloud 音效库包含开放版权的Loop和采样&#xff0c;以及来自 FL Studio 著名用户的艺术家独家内容。更新后&#xff0c;现在还可以使用人工智能辅助母带处理和数字发行功能来制作音轨。FL Studio 由最初的 "Fruity Loops" DAW 发展而来&#xff0c;25 年来&#x…

RISC-V IDE MRS无感远程协助模块详解

RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块&#xff08;Sensorless Remote Assistant Module&#xff0c;以下简称SRA模块&#xff09;。SRA模块是一款支…

PowerCLI vCenter批量更改esxi主机root密码

前提条件 安装 powercli开启wmi,配置网卡,参考 PowerCLi 批量添加所有esxi到vCenter 编写通过vCenter批量更改所有esxi主机root密码自动化脚本 最终实现批量重置所有esxi 密码,无需干预。$vCenterServer = "192.168.19.254" #你的vCenter 管理中心地址更改$User= …

国外调查问卷真的能做吗?

大家好&#xff0c;我是橙河网络&#xff0c;今天聊一聊国外调查问卷真的能做吗&#xff1f; 国外问卷调查这个项目已经存在多年&#xff0c;其赚钱逻辑非常简单&#xff0c;即通过填写国外公司发放的商业调查问卷来获取报酬&#xff0c;一般都是以美元的方式结算。这些问卷可…

性能优化之AA反走样优化

反走样主要是解决采样不足导致的。一般方案选择需要兼顾画面质量与渲染效率权衡的前提下&#xff0c;对图像进行增强。反走样经过了第一代超级采样抗锯齿SSAA&#xff0c;到第二代的多重采样抗锯齿MSAA&#xff0c;快速近似采样FXAA&#xff0c;增强子像素变形抗锯齿SMAA&#…

弱网测试神器—Qnet(上)

一、APP 弱网测试背景 App 在使用的过程中&#xff0c;难免会遇到不同的弱网络环境&#xff0c;像在公车上、在地铁、地下车库等。在这种情况下&#xff0c;手机常常会出现网络抖动、上行或下行超时&#xff0c;导致 APP 应用中出现丢包延迟&#xff0c;从而影响用户体验。 作…

写在2023末,很庆幸自己入了软件测试这行...

为什么会学习软件测试&#xff1f; 已经28岁了&#xff0c;算一下快过去3年了&#xff0c;刚毕业那会工作了一年&#xff0c;因为自己当时很迷茫&#xff08;觉得自己挺废的&#xff09;&#xff0c;所以就没去工作就一直在家&#xff0c;家里固定每个月给点生活费&#xff0c…

查看公司电脑里软件安装

查看公司电脑里软件安装是一项重要的任务&#xff0c;可以帮助管理员了解员工在工作中使用的软件情况&#xff0c;以及发现潜在的安全风险。 方法一&#xff1a;事件查看器 点击开始菜单&#xff0c;搜索“事件查看器” 2、点击“windows”日志&#xff0c;打开“应用程序”&a…

XAMPP的下载安装配置详细教程

XAMPP的下载安装配置详细教程&#xff08;含拒绝访问坑&#xff09; ​ xampp 话不相瞒&#xff0c;当初为了在XAMPP&#xff08;ApacheMySQLPHPPERL&#xff09;里面配置phpwind&#xff0c;我在卸载与安装之间来回了不下10次&#xff0c;但是我的phpwind始终还是安装不成功…

『OpenStack』云计算平台『Nova』计算服务学习指南

前言 本文将会讲解 OpenStack 平台计算服务组件 Nova &#xff0c;结合抽象概念和简单易懂的实战操作&#xff0c;帮助您更好的理解 Nova 计算服务在 OpenStack 中的作用 系统配置&#xff1a;宿主机 Ubuntu 20.04&#xff08;WSL2&#xff09; 简介 OpenStack 官网链接&…

如何利用数字化系统发挥数据的最大价值?

社会日新月异&#xff0c;企业管理也在时刻发生着变化&#xff0c;数字化系统的引入&#xff0c;解决了企业纸质化的汇报形式&#xff0c;简便快捷&#xff0c;一切事物都是有两面性的&#xff0c;数字化也给企业带来了新的挑战&#xff0c;如何利用数字化发挥数据的最大价值&a…

【记录】使用yolov5_obb训练自己的数据集

引言 对于寻常的yolov5目标检测任务&#xff0c;只能检测水平或者垂直的检测框&#xff0c;而对于旋转框的检测却无能为力。为此&#xff0c;在这记录下使用yolov5_obb来训练自己数据集。 一、准备数据集 1、我们先看所需要的数据集文件什么样子&#xff0c;如下图文件夹Sym…

Spring Boot与Redis的完美结合:高效实现订单超时处理

redis监听超时 概述修改配置文件redis配置yml/properties配置 pom依赖配置类创建订单时设置超时时间监听类优缺点 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Redis支持过期监听&#xff0c;可以根据这个监听过期数据来进行订单的超时处理 流程如下: 修改配置文件 re…

golang的类型断言

前言&#xff1a;原因很简单&#xff0c;写的代码panic了。报错如下。为此专门看下golang的类型断言。 “[PANIC]interface conversion: interface {} is string, not float64”。 1、类型断言(assertion) 所谓“类型断言”即判断一个变量是不是某个类型的实例(简单来讲就是判…

STM32-电源管理(实现低功耗)

电源管理 STM32 HAL库对电源管理提供了完善的函数和命令。 工作模式&#xff08;高功耗->低功耗&#xff09;&#xff1a;运行、睡眠、停止、待机。 若备份域电源正常供电&#xff0c;备份域内的RTC都可以正常运行&#xff0c;备份域内的寄存器的数据会被保存&#xff0c;不…

制作一个可以arm架构下运行的docker镜像(for Python)

看完本篇文章&#xff0c;你将得到一个可以arm架构下运行的python 基础镜像。 题外话 这里直接说docker镜像有点儿草率&#xff0c;因为目前很多容器都是Podman了。 podman的介绍 arm和aarch傻傻分不清楚 现在这两个是一样的意思了。 arm64和aarch64之间的区别 开始制作镜…

笔记48:51序列模型--课程笔记

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\序列模型 a a a a a a a a a a a a a a a a a a 8.1. 序列模型 — 动手学深度学习 2.0.0 documentation

双十一真香数码好物推荐!相信总有一款适合你!

在这个数字化时代&#xff0c;科技产品已经渗透到我们的日常生活&#xff0c;成为不可或缺的一部分。随着电商平台不断举办各种促销活动&#xff0c;双11购物狂欢节已经成为备受瞩目的盛事。在这场购物狂欢中&#xff0c;数码产品是热门之选。我们都期望在这个特殊的时刻找到高…