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:设置返回的内容类型

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

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

相关文章

Linux高级命令(扩展)

一、find命令 1、find命令作用 在Linux操作系统中&#xff0c;find命令主要用于进行文件的搜索。 2、基本语法 # find 搜索路径 [选项 选项的值] ... 选项说明&#xff1a; -name &#xff1a;根据文件的名称搜索文件&#xff0c;支持*通配符 -type &#xff1a;f代表普通文…

IP地址管理系统phpipam部署

IP地址管理系统phpipam部署 一、IPAM管理系统简介二、IPAM安装部署教程2.1 环境准备 三、phpIPAM web配置3.1 初始化3.2 WEB配置使用 四、IPAM管理和使用4.1配置dns4.2 配置ip网段4.3 配置ip地址自动扫描 一、IPAM管理系统简介 phpipam是一个开源Web IP地址管理应用程序&#…

Easy-Laser激光测平仪维修易激光对中仪E920

Easy-Laser激光对中仪常见故障&#xff1a;触摸屏损坏&#xff08;屏碎&#xff0c;不显示&#xff0c;黑屏&#xff0c;蓝屏&#xff0c;无背光等&#xff09;&#xff0c;对中仪电路板损坏&#xff0c;对中仪接收装置电路板&#xff0c;对中仪发射控制装置电路板等均可维修。…

迅镭激光董事长颜章健荣膺“2023年如皋市科技强企人物”!

10月28日&#xff0c;2023如皋科技人才洽谈会开幕式在如皋隆重举行。江苏省科学技术厅副厅长、党组成员蒋洪&#xff0c;江苏省商务厅副厅长、党组成员孙津&#xff0c;中共南通市委副书记、政法委书记沈雷&#xff0c;中共如皋市市委书记何益军&#xff0c;中共如皋市委副书记…

目标检测与图像识别分类的区别?

目标检测与图像识别分类的区别 目标检测和图像识别分类是计算机视觉领域中两个重要的任务&#xff0c;它们在处理图像数据时有一些区别。 目标检测是指在图像中定位和识别多个目标的过程。其主要目标是确定图像中每个目标的边界框位置以及对应的类别标签。目标检测任务通常涉…

avi怎么转mp4?

avi怎么转mp4&#xff1f;如今市面上涌现了各种多样的视频格式&#xff0c;其中AVI作为一种音频视频交错格式&#xff0c;虽然使用较少但相对常见。它的优点在于占用空间较小&#xff0c;但画面质量并不是很出色。然而&#xff0c;AVI格式也存在一个明显的缺点&#xff0c;即兼…

Java实现Hive UDF详细步骤 (Hive 3.x版本,IDEA开发)

这里写目录标题 前言1. 新建项目2.配置maven依赖3.编写代码4.打jar包5.上传服务器6.代码中引用 前言 老版本编写UDF时&#xff0c;需要继承 org.apache.hadoop.hive.ql.exec.UDF类&#xff0c;然后直接实现evaluate()方法即可。 由于公司hive版本比较高&#xff08;3.x&#x…

软件工程:小组开发过程技术(VS VSS UNIX C++)

&#xff08;注&#xff1a;这个东西是2007年写的&#xff0c;算是个缅怀&#xff0c;或是个吐槽。所有注都是本次发布新加的。&#xff09; 简介 本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C程序&#xff0c;实现在小组规模的初级开发过程。这不…

【EI会议征稿】第七届先进算法与控制工程国际学术会议(ICAACE 2024)

第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09; 2024 7th International Conference on Advanced Algorithms and Control Engineering 第七届先进算法与控制工程国际学术会议&#xff08;ICAACE 2024&#xff09;定于2024年1月26-28日在中国上海…

HD.047 | 水文数据——全球植被数据集[V: VCI]

写在前面 植被作为影响联系土壤、大气、水分等地气要素的重要因素,其准确估算不仅对研究植被动态变化、植被物候过程具有重要意义,而且对于流域生态水文等方面具有十分重要的应用价值。目前已有大量全球植被数据产品,本期选取植被条件指数Vegetation Condition Index(VCI)…

这三种方法轻松实现Excel文档名翻译

在电脑使用中&#xff0c;我们常常需要批量修改文件名并翻译。这时候&#xff0c;我们可以使用“固乔文件管家”软件来轻松实现这一需求。下面就介绍三种方法&#xff0c;帮助你轻松实现Excel文档名翻译。 方法一&#xff1a;使用“固乔文件管家”软件批量修改文件名 1.安装并打…

云原生安全日志审计

记得添加&#xff0c;把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…

Paper reading: segment anything in high quality NIPS2023

最近发展起来的SAM模型&#xff0c;表示分割模型的一个大的跃进&#xff0c;尤其是在零样本的能力和灵活提升方面。尽管利用1.1bollion的mask&#xff0c;SAM在掩码预测方面已经存在很大的问题&#xff0c;尤其是目标有着复杂结构的时候。 我们提出一个HA-SAM。 设计学习一个…

MySQL 基础学习笔记(二)

目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束 1.1 约束概述 约束是作用于表…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

arcgis图上添加发光效果!

看完本文, 你可以不借助外部图片素材, 让你的图纸符号表达出你想要的光! 我们以之前的某个项目图纸为例,来介绍下让符号发光的技术! 第一步—底图整理 准备好栅格影像底图、行政边界的矢量数据,确保“数据合适、位置正确、边界吻合”。 确定好图纸的大小、出图比例、投…

《TCP/IP详解 卷一:协议》第5章的IPv4数据报的IHL字段解释

首先说明一下&#xff0c;这里并不解释整个IPv4数据报各个字段的含义&#xff0c;仅仅针对IHL字段作解释。 我们先看下IPv4数据报格式 对于IHL字段&#xff0c; 《TCP/IP详解 卷一&#xff1a;协议》这么解释&#xff1a; IPv4数据报。头部大小可变&#xff0c;4位的IHL字段…

怎么让小程序排名靠前?小程序搜索排名问题

小程序的排名是十分重要的&#xff0c;因为这会直接影响到用户的点击率&#xff0c;用户在搜索小程序时&#xff0c;会看到搜索引擎的前几条搜索结果&#xff0c;如果您的小程序不在这些位置上&#xff0c;很可能就会被忽略&#xff0c;所以&#xff0c;想要让用户能够看到您的…

设置博客域名跳转实现方案(免费版)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

《低代码指南》——维格云机器人常见报错怎么解决?

在使用维格机器人调用维格表的API过程中,可能会出现机器人执行结果未达到预期的情况,此时可能是机器人运行出现了问题;通过点击这个机器人右上角的“运行历史”可以查看运行记录,通过对运行记录的分析,可以推断出问题所在,然后进行修改。 而对于运行历史的分析,主要是针…