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++进阶之路】类和对象(中)
文章目录 前言六大默认成员函数 一.构造函数性质默认构造函数构造函数(需要传参) 二.析构函数性质默认析构函数练习 三.拷贝构造函数基本性质:形参必须是引用默认拷贝构造浅拷贝深拷贝自定义类型 四.赋值运算符重载函数基本特征全局的运算符重载函数局部的运算符重载…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

百度上搜的图 挺形象的




就在这里 方法名自定义(反正访问的路由也是上面注释的) 








