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

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...