SpringMVC的基础知识
创建SpringMVC项目
SpringMVC项目其实和SpingBoot项目差不多,就多引入了一个SpringWeb项目而已拉
可以看这篇博客,创建的就是一个SpringMVC项目--创建项目の博客
SpringMVC是啥
Spring是啥相信大家都了解 啥是MVC呢?MVC是Model View Controller的缩写 我们分开看这三个词Model(模型),View(视图),Controller(控制器)
百度上搜的图 挺形象的
MVC是一种形式,SpringMVC是具体实现,就好像jvm方法区的具体实现是永久代和元空间,也就是说SpringMVC实现了MVC软件工程架构模式
顺带一提 SpringMVC里面塞的还是servelet的API
连接
就是和浏览器连接拉,当时学serverlet的时候要死要活的404 403 500报错,真是吐了
我们再demo目录下面创建一个类UserController
然后写下这么一坨子代码
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller @RequestMapping("/user") public class UserController {@RequestMapping("sayhi")@ResponseBodypublic Object Sayhi(){return "hi!SpringMVC";} }
然后在浏览器中访问这个
127.0.0.1是内网地址 固定的
8080是端口号 在配置文件中定义的
user和sayhi是......
运行结果:
@Controller是表示这个类是个控制器,要在Spring启动的时候加载并注册,注意!用五大注解的其他注解会报错!
@RequestMapping("/user") 是指在"/user"里面可以访问这个类(设置路由)
@RequestMapping("/sayhi") 访问类(上一个@RequestMapping中的类)里面的这个方法(可以;理解成多级目录) 类上的@RequestMapping可以省略 方法上的不行
@ResponseBody 如果没有这个注解的话依然会报错,return返回的类型会被以View的形式识别,这个注解可以告诉编译器这个返回对象不是view
@RestController注解 相当于@Controller + @ResponseBody
也就是说这个代码也可以这么写
package com.example.demo;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@RestController @RequestMapping("/user") public class UserController {@RequestMapping("sayhi")public Object Sayhi(){return "hi!SpringMVC";} }
@RequestMapping注解和@GETMapping
除了上面的注意事项以外,
@RequestMapping支持多种请求 像我们常见的Get,Post,Put.....都支持,我们通过控制它的参数"method"来指定它只可以用某种请求访问)
(记得把"/user"的参数加上) method后面加上这么一个参数(RequestMethod.是默认的后面加请求类型)如果我们指定它只可以Post访问..那就这么写
还有一种写法 就是@GETMapping("")这种写法(指定Post就是@POSTMapping) 等效于@RequestMapping(value="",mathod="")
@GETMapping只需要写一个value参数即可
但是注意@RequestMapping可以给类注释,方法注释 @GETMapping只能给方法注释
传递(获取)单个参数
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(String name){System.out.println("传递的参数"+name);} }
用postman构建一个Post请求
![]()
(os:在我输入这个key-value的时候 url自己拓展了)
运行结果
![]()
你可能会想(反正我是想了)这也没用啥方法,也没用啥注解,咋就直接接收了呢,Servelet又用这个API又用那个依赖的.....
就在这里 方法名自定义(反正访问的路由也是上面注释的) Srting name 只要保证这个变量名和请求里面的key一致就可以
传递(获取)多个参数
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import java.util.Date;@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(String name,int age){System.out.println("name="+name);System.out.println("age="+age);} }
构建请求
和单个参数的传递是一致的不过是这个方法输入了多个参数而已
参数映射(重命名)
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import java.util.Date;@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(@RequestParam("myname")String name,@RequestParam("myage")int age){System.out.println("name="+name);System.out.println("age="+age);} }
就是在方法参数前面加一个@RequestParam注解就可以 里面放上你想改成的名字就可以了
有一点需要注意 如果不加这个注解 程序没有接收到对应参数会返回 null 不会报错
如果加了 这个参数就变成了必传参数 没接收到就会报错
@RequestParame("myname",requird=false)
加一个requird参数 就不会变成必传参数
传递(获取)对象
先自己构建一个对象
package com.example.demo;import lombok.Data;@Data public class Student {String name;int age;@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';} }
@Data相当于给了一个Getter(对象的传递都需要写Getter) 没有会报错
@Override不强制 是我为了打印方便重写的
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import java.util.Date;@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(Student student){System.out.println(student);} }
构建请求
定义一个类就相当于单个参数传递中的 变量名和key的名称一致 不过这里需要的是类中的属性和请求中的key一致
传递(获取)form表单
package com.example.demo;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*;import java.util.Date;@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(@RequestBody Student student){System.out.println(student);} }
要在参数前面加@RequestBody 否则接收不到
@RequestBody: 作用: 主要用来接收 前端传递给后端 的 json字符串中的数据的 (请求体中的数据的)
获取URL中的参数
@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi/{name}/{age}")@ResponseBodypublic void get(@PathVariable String name, @PathVariable int age){System.out.println("name="+name);System.out.println("age="+age);} }
构建请求
这个/{}里面的参数要和方法中参数名一致
这个/{}就代表着和url中的数据对应
还有每个参数前要加@PathVariable
代表着这个参数接收的是路径值
获取文件
@Controller @RequestMapping(value="/user") public class UserController {@RequestMapping("/file")@ResponseBodypublic String File(@RequestPart("myfile") MultipartFile file) throws IOException {file.transferTo(new File("img.png"));return "success";}}
用@RequestPart注释 MultipartFile对象
这两个要一致
获取Cookie/Header
Cookie
@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(@CookieValue("bug") String cookie){System.out.println(cookie);} }
用@CookieValue注解即可 注意后面的参数要和Value中的前缀对应
Header
@Controller @RequestMapping(value="/user",method = RequestMethod.POST) public class UserController {@PostMapping("/sayhi")@ResponseBodypublic void get(@RequestHeader("header") String header){System.out.println(header);} }
![]()
就区别就是Header用@RequestHeader注解
然后后面的参数和KEY对应
返回html静态页面
@Controller @RequestMapping("/user") public class UserController {@RequestMapping("/get")public Object Return(){return "index.html";} }
其实这些@RequestMapping注解都可以省略了
反正也只能这么访问,直接一个/文件名
返回JSON对象
@Controller @RequestMapping("/user") @ResponseBody public class UserController {@RequestMapping("/get")public HashMap<String,Integer> getJson(){HashMap<String,Integer> map = new HashMap<>();map.put("张三",18);map.put("李四",19);return map;} }
tips:@RestController == @Controller+@ResponseBody
请求转发&请求重定向
@Controller @RequestMapping(value="/user") public class UserController {@RequestMapping("/forward")public String index1(){//请求转发return "forward:/index.html";}@RequestMapping("/redirect")public String index3(){//请求重定向return "redirect:/index.html";} }
注意:这里没用@ResponseBody 因为这里返回的是View 否则它会返回字符串
转发和重定向的区别就是:
转发
重定向
他俩的结果都是
但是重定向的URL变成了
![]()
相关文章:

SpringMVC的基础知识
创建SpringMVC项目 SpringMVC项目其实和SpingBoot项目差不多,就多引入了一个SpringWeb项目而已拉 可以看这篇博客,创建的就是一个SpringMVC项目--创建项目の博客 SpringMVC是啥 Spring是啥相信大家都了解 啥是MVC呢?MVC是Model View Controller的缩写 我们分开看这三个词Model…...

OpenPCDet系列 | 4.2 DataAugmentor点云数据增强模块解析
文章目录 DataAugmentor模块解析1. gt_sampling2. random_world_flip3. random_world_rotation4. random_world_scaling5. limit_period DataAugmentor模块解析 在pointpillars算法中,具体的数据增强方法配置是在yaml中的DATA_CONFIG.DATA_AUGMENTOR进行配置&#…...

精准测试之过程与实践 | 京东云技术团队
作者:京东工业 宛煜昕 一、怎样的技术 •百度百科: 精准测试是一套计算机测试辅助分析系统。 精准测试的核心组件包含的软件测试示波器、用例和代码的双向追溯、智能回归测试用例选取、覆盖率分析、缺陷定位、测试用例聚类分析、测试用例自动生成系统…...
类ChatGPT逐行代码解读(1/2):从零实现Transformer、ChatGLM-6B
前言 最近一直在做类ChatGPT项目的部署 微调,关注比较多的是两个:一个LLaMA,一个ChatGLM,会发现有不少模型是基于这两个模型去做微调的,说到微调,那具体怎么微调呢,因此又详细了解了一下微调代…...

车道线检测
前言 目前,车道线检测技术已经相当成熟,主要应用在自动驾驶、智能交通等领域。下面列举一些当下最流行的车道线检测方法: 基于图像处理的车道线检测方法。该方法是通过图像处理技术从摄像头传回的图像中提取车道线信息的一种方法,…...

云渲染靠谱吗,使用云渲染会不会被盗作品?
云渲染靠谱吗、安全吗?如果使用 云渲染会不会被盗作品......Renderbus瑞云渲染作为一个正经的云渲染平台,也时不时会收到这类疑问,首先,瑞云渲染是肯定靠谱的,各位可以放心使用。另外小编也将在本篇教你如何辨别云渲染平台是否安全…...

什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C
什么是FPGA?关于FPGA基础知识 一起来了解FPGA lattice 深力科 MachXO3系列 LCMXO3LF-9400C-5BG256C FPGA基础知识:FPGA是英文Field-Programmable Gate Array的缩写,即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器…...

有什么好用的云渲染?
在CG制作流程中,离线渲染一直是必要且耗时的环节。你的场景越复杂,渲染出现问题的可能性就越大,尤其是当你独自工作,没有人给你建议的时候,灯光、模型、场景任何一个环节渲染时出现问题都可能让你焦头烂额,…...

什么是医学影像PACS系统?PACS系统功能有哪些?作用有哪些?对接哪些设备?业务流程是什么?
一、什么是医学影像PACS系统 PACS:为Picture Archive and CommunicationSystem的缩写,是图象归档和通讯系统。PACS系统应用在医院影像科室的系统,主要的任务就是把日常产生的各种医学影像(包括核磁,CT,超声…...

分布式缓存:什么是它以及为什么需要它?
前言 随着网络的快速发展,分布式应用变得越来越普遍。这种类型的应用程序需要访问多个组件和服务,而这些组件可能分散在不同的物理位置上。在这种情况下,由于网络通信的高延迟和低带宽,性能问题变得尤为明显。为解决这一问题&…...

MySQL基础(二十二)逻辑架构
1.逻辑架构剖析 1.1 第1层:连接层 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码不对&#…...

《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》
一、背景 Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。 …...

vue+elementui+nodejs机票航空飞机航班查询与推荐
语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode )本系统主要是为旅客提供更为便利的机票预定方式,同时提高民航的预定机票的工作效率。通过网络平台实现信息化和网络化&am…...

将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器?
我已经将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器? 即使将ssh公钥添加到服务器的授权密钥中,您也可能无法通过SSH登录到服务器,这有几个原因: 1.服务器的authorized_keys文件的权限不正确…...

LeetCode——子串能表示从 1 到 N 数字的二进制串
1016. 子串能表示从 1 到 N 数字的二进制串 - 力扣(Leetcode) 目录 一、题目 二、题目解读 三、代码 一、题目 给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 &…...

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案
接上篇,以短视频优质项目为例,火山引擎DataLeap平台治理团队会去对每天发布的这种挂购物车车短视频打上标签,识别这些短视频它是优质的还是低质的,以及具体原因。一个视频经过这个模型识别之后,会给到奖惩中心去做相应…...

MySQL笔记-多表查询
本文标签 : 多表查询 事务四大特性 并发事务问题 事务隔离级别 文章目录 目录 文章目录 一、多表查询 1.多表关系 2.多表查询概念 3.多表查询的分类 4.内连接 5.外连接 6.自连接 7.联合查询 8.子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 9.多表查询案例练习 二…...

如何用100天时间,让CSDN的粉丝数从0狂飙到10000
2022年10月7日,正式开通了CSDN账号。但因为工作忙的原因,一直没有时间写博客文章,也没有投入精力在CSDN上。理所当然的,我的粉丝数量很稳定,一直保持着0的记录。 2023年春节假期过后,有点空闲时间了&#x…...

各种同质图神经网络模型的理论和节点表征学习任务的集合包rgb_experiment
诸神缄默不语-个人CSDN博文目录 最近更新时间:2023.5.10 最早更新时间:2023.5.10 本文仅考虑同质图setting下的模型。 对于异质图场景,可以参考我写的另一篇博文:异质图神经网络(持续更新ing…) node2ve…...

【C++进阶之路】类和对象(中)
文章目录 前言六大默认成员函数 一.构造函数性质默认构造函数构造函数(需要传参) 二.析构函数性质默认析构函数练习 三.拷贝构造函数基本性质:形参必须是引用默认拷贝构造浅拷贝深拷贝自定义类型 四.赋值运算符重载函数基本特征全局的运算符重载函数局部的运算符重载…...

AIMD 为什么收敛(tcp reno/cubic 为什么好)
TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图:…...

医院智能导诊系统,医院导航解决方案
随着现代医院规模不断扩大,功能区域越来越细化,面对复杂的楼宇结构,集中的就诊人流,患者在就诊中经常会面临找不到目的地的困境,就诊体验变差。针对这个问题,一些面积和规模都比较大的医院,已经…...

【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

在滴滴和字节跳动划水4年,过于真实了...
先简单交代一下吧,沅哥是某不知名211的本硕,18年毕业加入滴滴,之后跳槽到了头条,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家公司&am…...

tensorflow GPU训练环境布置
tensorflow GPU训练环境布置 一、显卡驱动安装1.1 如何处理**Failed to initialize NVML: Driver/library version mismatch的问题**1.2 卸载旧的版本1.3 驱动安装 1.3.1 利用apt 安装1.3.2 手动安装 二、安装CUDA2.1 确定CUDA版本2.2 下载文件1. 找匹配版本2. 选合适的平台 2…...

理解和使用Java中的枚举
枚举是一种特殊的数据类型,用于定义一组具名的常量。Java中的枚举类型可以包含多个枚举常量,每个常量都具有唯一的名称和值。本文将详细介绍Java中的枚举,包括为什么要使用枚举、枚举的好处、如何定义和使用枚举等。 为什么要使用枚举&#…...

C++和Java:哪种语言更适合你
C和Java:哪种语言更适合你 一、引言1 背景介绍2 问题阐述3 目的和意义 二、C与Java的介绍1 C的特点和优缺点2 Java的特点和优缺点3 两种语言的比较4 选择C的理由4.1 适合底层开发的特点4.2高效的编译器和运行速度4.3 自由且灵活的语言风格4.4 良好的内存管理能力 5 …...

FE_Vue学习笔记 框架的执行流程详解
1 分析脚手架结构 (1)CLI就是 command line interface 的缩写。Vue CLI官网:Vue CLI (2)安装过程: (PS: 提前安装过node.js了,没有安装的可以打开这个:Downl…...

KingbaseES V8R6 等待事件之LWLock Buffer_IO
等待事件含义 当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件。其目的是将同一页读取到共享缓冲区中。 每个共享缓冲区都有一个与LWLock:BufferIO等待事件相关联的I/O锁,每次都必须在共…...

桂院导航小程序 静态项目 二次开发教程
Gitee代码仓库:桂院导航小程序 先 假装 大伙都成功安装了静态项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了,有提到 我的学校 的文字都改成你自己的就行 1. 全局 app.json…...