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 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
比特币:固若金汤的数字堡垒与它的四道防线
第一道防线:机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”(Hashing)就是一种军事级的加密术(SHA-256),能将信函内容(交易细节…...
若依项目部署--传统架构--未完待续
若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加,传统开发模式存在效率低,重复劳动多等问题。若依项目通过整合主流技术框架&…...
学习 Hooks【Plan - June - Week 2】
一、React API React 提供了丰富的核心 API,用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素,JSX 会被编译成该函数…...

百度上搜的图 挺形象的




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








