【Spring】Spring Web MVC基础入门~(含大量例子)

 8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:什么是Spring Web MVC

1:Servlet

2:总结

二:MVC

1:定义

2:解释

3:Spring MVC和MVC的关系

三:Spring MVC

1:SpringBoot 和 SpringMVC之间的关系

四:实践

1:建立连接

2:@RequestMapping注解介绍

(1)既可以修饰类也可以修饰方法

(2)既支持get也支持post请求

3:RequestController注解

4:传递参数

(1)参数使用包装类型

(2)传参顺序不影响结果

5:传递对象

6:Requestparam

(1)后端参数映射

(2)更改为非必要传参

7:传递数组

8:传递集合

9:传递JSON数据

(1)传递失败

(2)RequestBody

10:JSON字符串和Java对象的转换

(1)第三方工具

(2)Person类

(3)ObjectMapper类


一:什么是Spring Web MVC

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring
MVC".

1:Servlet

Servlet 是⼀种实现动态⻚⾯的技术. 准确来讲Servlet是⼀套 Java Web 开发的规范Servlet 规范的,产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等

2:总结

从上述定义我们可以得出⼀个信息: Spring Web MVC 是⼀个 Web 框架.
下⾯咱们简称之为: Spring MVC

二:MVC

1:定义

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型、视图和控制器三个基本部分

2:解释

View(视图) 指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.
Model(模型) 是应⽤程序的主体部分,⽤来处理程序中数据逻辑的部分.
Controller(控制器)可以理解为⼀个分发器,⽤来决定对于视图发来的请求,需要⽤哪⼀个模型
来处理,以及处理完后需要跳回到哪⼀个视图。即⽤来连接视图和模型

3:Spring MVC和MVC的关系

三:Spring MVC

MVC 是⼀种架构设计模式, 也⼀种思想, ⽽ Spring MVC 是对 MVC 思想的具体实现. 除此之外, Spring MVC还是⼀个Web框架

1:SpringBoot 和 SpringMVC之间的关系

Spring Boot 只是实现Spring MVC的其中⼀种⽅式⽽已.
Spring Boot 可以添加很多依赖, 借助这些依赖实现不同的功能. Spring Boot 通过添加Spring Web
MVC框架, 来实现web功能
总结来说,Spring MVC 是⼀个实现了 MVC 模式的 Web 框架

四:实践

1:建立连接

在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射 ,也就是浏览器连接程序的作⽤
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@RestController
public class UserController {
// 路由器规则注册@RequestMapping("/sayHi")public String sayHi(){return "hello,Spring MVC";}
}
接下来访问: http://127.0.0.1:8080/sayHi , 就可以看到程序返回的数据了

2:@RequestMapping注解介绍

@RequestMapping 是 Spring Web MVC 应⽤程序中最常被⽤到的注解之⼀,它是⽤来注册接⼝的
路由映射的.
表⽰服务收到请求时, 路径为 /sayHi 的请求就会调⽤ sayHi 这个⽅法的代码.
路由映射: 当⽤⼾访问⼀个 URL 时, 将⽤⼾的请求对应到程序中某个类的某个⽅法的过程就叫路由映射

(1)既可以修饰类也可以修饰方法

(2)既支持get也支持post请求

@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello byte";}@RequestMapping("/r0")public String say1(){return "hello byte";}@RequestMapping("/r1")public String r1(String name){return name;}@RequestMapping("/r2")public int r2(int age){return age;}@RequestMapping("/r3")public String r3(Integer age){return "接收到的参数为:"+age;}
}

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action = "/request/hello" method="get"><input type="submit" value="发送请求">
</form></body>
</html>

(3)括号中的地址前可加/也可不加,最好加上

3:RequestController注解

⼀个项⽬中, 会有很多类, 每个类可能有很多的⽅法

Spring会对所有的类进⾏扫描, 如果类加了注解@RestController, Spring才会去看这个类⾥⾯的⽅法有没有加 @RequestMapping 这个注解, 当然他的作⽤不⽌这⼀点, 咱们先⽤, 后⾯再详细讲

4:传递参数

(1)参数使用包装类型

对于包装类型, 如果不传对应参数,Spring 接收到的数据则为null
所以企业开发中,对于参数可能为空的数据,建议使⽤包装类型

(2)传参顺序不影响结果

当有多个参数时,前后端进⾏参数匹配时,是以参数的名称进⾏匹配的,因此参数的位置是不影响后端获取参数的结果

5:传递对象

package com.example.springbootmvc;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-11-04* Time: 21:25*/
@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String say(){return "hello byte";}@RequestMapping("/r0")public String say1(){return "hello byte";}@RequestMapping("/r1")public String r1(String name){return name;}@RequestMapping("/r2")public int r2(int age){return age;}@RequestMapping("/r3")public String r3(Integer age){return "接收到的参数为:"+age;}@RequestMapping("/m1")public Object method1(Person p){return p.toString();}
}
@RequestMapping("/m1")public Object method1(Person p){return p.toString();}

可以看到, 后端程序正确拿到了Person对象⾥各个属性的值

Spring 会根据参数名称⾃动绑定到对象的各个属性上, 如果某个属性未传递, 则赋值为null(基本类型则赋值为默认初识值, ⽐如int类型的属性, 会被赋值为0)

6:Requestparam

(1)后端参数映射

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个
time 给后端,⽽后端是使⽤ createtime 字段来接收的,这样就会出现参数接收不到的情况,如果出现
这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值
@RequestMapping("r4")public Object r4(@RequestParam("time") String createtime){return "接受到参数createtime:" + createtime;}

可以得出结论:
1. 使⽤ @RequestParam 进⾏参数重命名时, 请求参数只能和 @RequestParam 声明的名称⼀
致, 才能进⾏参数绑定和赋值.
2. 使⽤ @RequestParam 进⾏参数重命名时, 参数就变成了必传参数

(2)更改为非必要传参

源码

可以看到 required 的默认值为true, 表⽰含义就是: 该注解修饰的参数默认为必传
既然如此, 我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错,
具体实现如下

7:传递数组

@RequestMapping("/r5")public String r5(String[] arrayParam){return Arrays.toString(arrayParam);}

8:传递集合

@RequestMapping("/r6")public String r6(@RequestParam List<String> listParam){return "size:"+listParam.size()+"   "+"listParam:"+listParam;}

9:传递JSON数据

JSON:JavaScript Object Notation 【JavaScript 对象表⽰法】
JSON就是⼀种数据格式, 有⾃⼰的格式和语法, 使⽤⽂本表⽰⼀个对象或数组的信息, 因此
JSON本质是字符串. 主要负责在不同的语⾔中数据传递和交换.
JSON的语法:
1. 数据在 键值对 (Key/Value)
2. 数据由逗号 , 分隔
3. 对象⽤ {} 表⽰
4. 数组⽤ [] 表⽰
5. 值可以为对象, 也可以为数组, 数组中可以包含多个对象

(1)传递失败

@RequestMapping("/r7")public Object r7(Person p){return p.toString();}

可以看到我们用postman发送json请求,服务器并没有收到我们想要的值为什么呢?

因为一个json对象是不能分割的所以左边的这种发送方式不可行

(2)RequestBody

加上RequesstBody注解后,才能读取HTTP中body中的json数据

 @RequestMapping("/r8")public Object r8(@RequestBody Person p){return p.toString();}

10:JSON字符串和Java对象的转换

(1)第三方工具

(2)Person类

在json字符串转换为Java对象的时候,要先进行类加载,我们尽量把无参的构造方法也写入类中,避免后续,传参时,找不到对应的构造方法

package com.example.springbootmvc;import com.fasterxml.jackson.databind.ObjectMapper;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-11-06* Time: 17:59*/
public class Person {private String name;private int age;private int password;public Person(){}public Person(String name, int age, int password) {this.name = name;this.age = age;this.password = password;}public String getName() {return name;}public int getAge() {return age;}public int getPassword() {return password;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public void setPassword(int password) {this.password = password;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", password=" + password +'}';}}

(3)ObjectMapper类

.readValue   字符串转对象

.writeValueAsString()   对象转字符串

package com.example.springbootmvc;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.validation.ObjectError;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-11-07* Time: 12:23*/
public class JSONTest {public static void main(String[] args) throws JsonProcessingException {//调用ObjectMapper中的两个方法才能实现Json字符串和java对象的转换ObjectMapper objectMapper = new ObjectMapper();//格式化JSON字符串String jsonStr = "{\"name\":\"zhangsan\",\"age\":15,\"password\":666}";//JSON字符串转化为java对象,先加载Person类在,解析字符串Person p = objectMapper.readValue(jsonStr,Person.class);System.out.println(p.toString());//java对象转化为Json字符串String s = objectMapper.writeValueAsString(p);System.out.println(s);}}

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

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

相关文章

有向图的完全可达性(有向图搜索全路径的问题) C#DFs

在考察输入输出方面我觉得是道难题了 第一次遇见邻接表的数据结构该怎么声明 卡码网105 在力扣没找见完全相同的题 感觉需要多练习多复习这种类型的题 105. 有向图的完全可达性 题目描述 给定一个有向图&#xff0c;包含 N 个节点&#xff0c;节点编号分别为 1&…

登陆页面渗透测试常见的20种思路与总结

【渗透测试】16个实用谷歌浏览器插件分享 飞雪网络安全人才培养计划&#xff0c;绝对零区&#xff0c;公益教学&#xff01; 思路总结 1、之前是否已经留过后门&#xff0c;是&#xff0c;直接getshell&#xff0c;否&#xff0c;进行测试 2、SQL注入&万能密码&#xf…

qt QWebSocketServer详解

1、概述 QWebSocketServer 是 Qt 框架中用于处理 WebSocket 服务器端的类。它允许开发者创建 WebSocket 服务器&#xff0c;接受客户端的连接&#xff0c;并与之进行双向通信。WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;它使得客户端和服务器之间的数…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

中小跨境卖家如何选择物流?

跨境物流作为电商交易的核心环节&#xff0c;其复杂性和多变性对卖家来说不言而喻。本文将为您详细解析跨境物流的七大流程、常见物流测评以及推荐的工具&#xff0c;帮助您在激烈的市场竞争中把握物流优势&#xff0c;提升业务效率和客户满意度。 跨境物流七大流程 1. 启运国出…

6大国有银行软开的薪资待遇清单

牛客上刷到一条关于计算机专业值得去的银行软开清单,其中对 6 大国有银行软开的薪资待遇分析我觉得很有必要同步给大家看一看。 截图信息来自牛客的漫长白日梦 其中邮储软开是最值得推荐的(offer 投票没输过),二线城市转正后第一个完整年的收入在 30 万左右,一线城市更高…

我们来学mysql -- EXPLAIN之ID(原理篇)

EXPLAIN之ID 题记ID 题记 2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0c;就是优化器&#xff08;幕僚&#xff09;选…

蓝桥杯-网络安全比赛题目-遗漏的压缩包

小蓝同学给你发来了他自己开发的网站链接&#xff0c; 他说他故意留下了一个压缩包文件&#xff0c;里面有网站的源代码&#xff0c; 他想考验一下你的网络安全技能。 &#xff08;点击“下发赛题”后&#xff0c;你将得到一个http链接。如果该链接自动跳转到https&#xff0c;…

新疆高校大数据实验室案例分享

高校大数据实验室建设&#xff0c;企业可以提供技术支持、实训平台和项目案例&#xff0c;高校则提供科研和教学资源&#xff0c;实现产学研一体化。不仅有利于大数据技术的应用和人才培养也有利于区域发展。 泰迪与新疆合作的院校包括新疆大学、昌吉学院等 新疆大…

关于Flutter空安全升级方案整理

前言 Flutter 从 2.0 版本开始支持空安全&#xff08;Null Safety&#xff09;。dart 版本为&#xff1a; environment:sdk: ">2.12.0 < 3.0.0"升级到空安全后&#xff0c;由于语法的变动&#xff0c;基本上整个工程&#xff0c;代码都爆红&#xff0c;这对项…

干货 | 2024年数据要素白皮书(免费下载)

导读&#xff1a;白皮书在对比分析国际数据领域发展现状的基础上&#xff0c;围绕数据要素市场化配置改革这一主线&#xff0c;从数据高质量供给、数据创新应用、体制机制建设、产业探索方向四大方面展现了数据要素发展过程中&#xff0c;各类主体的新作为、新成效&#xff0c;…

RTT 内核基础学习

RT-Thread 内核介绍 内核是操作系统的核心&#xff0c;负责管理系统的线程、线程间通信、系统时钟、中断以及内存等。 内核位于硬件层之上&#xff0c;内核部分包括内核库、实时内核实现。 内核库是为了保证内核能够独立运行的一套小型的类似C库的函数实现子集。 这部分根据编…

六通道CAN集线器(协议型)

一、功能概述 SG_CanHub_600 是一款具有六路通道的工业级智能 CAN 数字隔离中继集线器。 SG_CanHub_600 能够实现信号再生、延长通信距离、提高总线负载能力、匹配不同速 率 CAN 网络&#xff0c;同时强大的 ID过滤功能可以极大降低 CAN 总线负荷&#xff0c;并具有故障指…

Web应用性能测试工具 - httpstat

在数字化时代&#xff0c;网站的性能直接影响用户体验和业务成功。你是否曾经在浏览网页时&#xff0c;遇到加载缓慢的困扰&#xff1f;在这个快速变化的互联网环境中&#xff0c;如何快速诊断和优化Web应用的性能呢&#xff1f;今天&#xff0c;我们将探讨一个强大的工具——h…

【Linux】从零开始使用多路转接IO --- 理解EPOLL的 LT水平触发模式 与 ET边缘触发模式

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 EPOLL优缺点2 EPOLL工作模式 1 EPOLL优缺点 poll 的优点(和 select 的缺点对应) 接口使用方便&#xff1a;虽然拆分成了三个函数&#xff0c;…

kafka+zookeeper的搭建

kafka从2.8版本开始&#xff0c;就可以不用配置zookeeper了&#xff0c;但是也可以继续配置。我目前使用的kafka版本是kafka_2.12-3.0.0.tgz&#xff0c;其中前面的2.12表示是使用该版本的scala语言进行编写的&#xff0c;而后面的3.00才是kafka当前的版本。 通过百度网盘分享…

基础数据结构——队列(链表实现)

队列的性质 先进先出&#xff08;FIFO - First In First Out&#xff09;&#xff1a;最先加入队列的元素最先被移出后进后出&#xff08;后来的元素排在队尾&#xff09;只允许在队尾插入元素&#xff0c;在队首删除元素具有先来先服务的特点 链表实现队列 和之前创建链表相…

git原理与上传

言&#xff1a; git是一个软件&#xff0c;gitee/github是一个网站&#xff0c;这里有什么联系吗&#xff1f;我们身为一个程序员不可能不知道github&#xff0c;但是毕竟这是外国的网站&#xff0c;我们不翻墙的情况下&#xff0c;是无法访问的(或者就是太慢了&#xff0c;或…

亚信安全新一代WAF:抵御勒索攻击的坚固防线

近年来&#xff0c;勒索攻击已成为黑客的主要攻击手段。新型勒索攻击事件层出不穷&#xff0c;勒索攻击形势愈发严峻&#xff0c;已经对全球制造、金融、能源、医疗、政府组织等关键领域造成严重危害。如今&#xff0c;勒索攻击手段日趋成熟、攻击目标愈发明确&#xff0c;模式…

Selenium 高频面试题及答案

在求职面试中&#xff0c;Selenium的相关知识已经成为自动化测试工程师们无法避开的热门考点。想要脱颖而出&#xff0c;提前了解Selenium的高频面试题及其答案显得尤为重要。这篇文章将带你快速掌握Selenium的核心考点和解答&#xff0c;帮助你在面试中应对自如&#xff01; …