Spring MVC(一)

1. Spring MVC是什么?

搞清楚Spring MVC之前先搞清楚MVC是什么?MVC是一种架构设计模式,也就是一种思想,M是Model,V是View,C是Controller。他们之间的关系举一个例子来介绍。比如去饭店吃饭,一进去有服务员接待,这个服务员就是View,点菜之后,服务员把点的菜发给前厅,前厅就是Controller,前厅再根据菜的种类给不同的厨房下达做菜的命令,厨房就是Model。

Spring MVC还是一个web框架,所以Spring MVC可以看作是一个实现了MVC模式的web框架。

Spring MVC的全称是Spring Web MVC。

上篇文章介绍了创建一个Spring Boot项目可以使用idea创建或者使用网页来创建,而Spring MVC可以在创建Spring Boot项目时选择Spring Web框架,来实现web功能,此时就变成了一个Spring MVC项目。下图使用的是网页版创建Spring Boot项目,用Spring Boot项目创建Spring MVC只是其中一种创建Spring MVC的方式,其他创建方式比较复杂,在此不做介绍。https://start.aliyun.com/

Spring MVC是一个web框架,那么当用户输入url的时候Spring MVC项目需要能识别到用户的请求并给用户返回相应的响应。学习Spring MVC主要在学习如何通过浏览器和用户进行交互。

主要要学习的分为以下三个方面:

1. 建立连接:把用户(浏览器)与java程序连接起来,也就是访问一个地址时能调用到Spring程序

2.请求:用户在操作过程中会发起请求,请求过程中会携带一些参数,在程序中要想办法获取到这些参数,所以这一步主要是在获取参数。

3.响应:处理完用户的请求后把对应的响应返回给用户

2. 创建项目+建立连接

创建项目的方式在前面已做介绍,在此不再赘述。

把下载好的zip解压后用idea打开解压好的文件,此时就可以开始编写了。

创建了一个UserController类,接下来先介绍一下@RestController这个注解。一个项目中有很多类,Spring一直在扫描项目中的所有类,那Spring怎么知道哪个方法需要被执行呢?加上这个注解后Sping才去看类的内部有没有@RequestMapping这个注解,那@RequestMapping这个注解的作用又是什么呢?它的作用是路由映射:当输入一个网址时,把这个url请求对应到某个类的某个方法的过程。@RestController这个注解的作用还有很多后面再做介绍。

在这里使用回环地址127.0.0.1来练习。回环地址可以想象成是一条网线,发送端和接收端都是自己,所以访问这个url的时候其实就是把请求发给了自己,代码处理响应后把响应又发回给自己。此时输入url:127.0.0.1:8080/sayHi,看到页面上显示内容就是我们代码中写的内容(路由映射的地址和方法名不用必须相同

@RequestMapping注解可以修饰类也可以修饰方法,访问路径是类路径加方法路径。@RequestMapping url的路径加不加 “/” 都可以,没加的话Spring程序启动时会自动补上

 

3. @RequestMapping支持Post请求和Get请求 

浏览器发送的请求都是post请求,所以@RequestMapping一定支持Get请求。Post请求需要通过form表单构造请求,也就是需要编写前端代码,作为一个Java程序猿也就是后端程序猿我们的前端代码编写能力不高,后端只负责编写后端的业务逻辑。那这个时候引入了一个软件Postman

url:https://www.postman.com/downloads/

后端代码中指定使用Post请求

Postman选择请求方式为post,并输入url就得到了响应,由此看到@RequestMapping是支持Post请求的。

 form-data主要是用来提交文件/图片,x-www-form-urlencoded form表单, 对应 Content-Type: application/x-www-from-urlencoded,raw支持图中这五种文本提交方式。binary是二进制类型,比如图片流

4. 传递单个参数 

继续使用Post请求

 此时传错了参数类型发现报了400错误

 如果传入的参数为空,如果还是继续使用引用数据类型int那么就会500报错.

此时把int改为包装类型Integer发现获取到的参数是null,所以对于可能存在参数为空的场景时最好使用包装类型 。


5. 传递多个参数 

 由此可见传递传递多个参数的时候url中的参数传递顺序没有强制要求必须按顺序,前后端进行参数匹配的时候是按照参数名称进行匹配的。

6. 传递对象

有的时候需要提交很多次的数据,此时就可以构造出一个对象,变成直接传入对象传入参数

public class Person {public String name;public Integer id;public Integer password;@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", id=" + id +", password=" + password +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getPassword() {return password;}public void setPassword(Integer password) {this.password = password;}
}

 7. 传递数组

传递一个数组:请求参数名与形参参数名相同并且请求参数为多个,后端定义数组类型形参就可以接收参数。

 8. 传递JSON类型

JSON可以理解为JavaScript对象表示法,跟JavaScript没有关系,只是语法类似。

注意:@RequestBody是必须要加的

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

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

相关文章

文件操作:Xml转Excel

1 添加依赖 Spire.Xls.jar <dependency><groupId>e-iceblue</groupId><artifactId>spire.xls</artifactId><version>5.3.3</version></dependency>2 代码使用 package cctd.controller;import com.spire.xls.FileFormat; im…

C语言中的 printf( ) 与 scanf( )

时隔多日&#xff0c;小编我又回来咯小编相信之前的博客能够给大家带来不少的收获。在我们之前的文章中&#xff0c;许多代码块的例子都用到了printf( ) 与 scanf( )这两个函数&#xff0c;大家都知道他们需要声明头文件之后才能使用&#xff0c;那这两个函数是什么呢&#xff…

Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块 前言 在 Yocto 项目的开发过程中&#xff0c;特别是在进行 BSP&#xff08;Board Support Package&#xff09;开发时&#xff0c;经常需要调整特定软件包的版本&#xff0c;修改内核、设备树以及内核模块。然而&#xff0c;每次…

算法每日双题精讲——双指针(移动零,复写零)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

数据库的使用02:SQLServer的连接字符串、备份、还原、SQL监视相关设置

目录 一、连接字符串 【本地连接字符串】 【远程连接字符串】 二、备份 三、还原 &#xff08;1&#xff09;还原数据库-bak、btn文件 &#xff08;2&#xff09;附加数据库mdf文件 四、SQL监视器的使用 一、连接字符串 【本地连接字符串】 server DESKTOP-FTH2P3S; Da…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…

【笔记】LLC电路工作频点选择 2-2 开关管与滤波压力

LLC谐振变换器稳态工作波形分析 - 知乎&#xff0c;上面这篇文的结论相较MPS那篇文章的结论更严格。我们分析一下它的频点选择为什么会更窄&#xff1a; 1. LLC电路模型 电流滞后的特性就是电路呈感性注意这里也是开关管ZVS开通。 2.工作循环的波形 iLm的波形&#xff0c;最终…

mysql数据同步到sql server

准备工作 下载安装sql server express 2019 现在安装SSMS(连接数据库GUI) 安装ssms for mysql 需要注意的是在上面的步骤中首先需要根据指导安装mysql ODBC 设置express sa用户密码登录 --change password for login user "sa"Security > Logins > sa (rig…

【SpringMVC】——Cookie和Session机制

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;实践 1&#xff1a;获取URL中的参数 &#xff08;1&#xff09;PathVariable 2&…

B2119 删除单词后缀

B2119 删除单词后缀 #include <iostream> using namespace std; # include <string.h> #include <ctype.h> #include <algorithm> #include <string.h> int main(){ string word; cin>>word; if(word.size()> 2 && word.…

AlohaKit:一组.NET MAUI绘制的开源控件

前言 今天大姚给大家分享一组.NET MAUI绘制的开源、免费&#xff08;MIT License&#xff09;UI控件库&#xff1a;AlohaKit。 MAUI介绍 .NET MAUI是一个开源、免费&#xff08;MIT License&#xff09;的跨平台框架&#xff08;支持Android、iOS、macOS 和 Windows多平台运…

漫谈分布式唯一ID

文章目录 本系列前言UUIDDB自增主键Redis incr命令号段模式雪花算法 本系列 漫谈分布式唯一ID&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf分布式唯一ID生成&#xff08;三&#xff09;&#xff1a;uid-generator分布式唯一ID生成…

C语言:文件操作2(又一万字?)

关于文件操作这章内容&#xff0c;因为知道内容较多所以我分两篇发了&#xff0c;但是还是没料到第二篇还是这么多&#xff0c;达到了一万多字&#xff01;&#xff01;&#xff01;作者本人真的将知识点进行了超级详解分析并且举了很多例子来帮助读者理解&#xff0c;本文章较…

STM32标准库-待机模式

1.1 STM32待机模式简介 STM32单片机具有低功耗模式&#xff0c;包括睡眠、停止和待机三种。 运行状态下&#xff0c;HCLK为CPU提供时钟。HCLK由AHB预分频器分频后直接输出得到。 低功耗模式选择需考虑电源消耗、启动时间和唤醒源。 睡眠模式停CPU不停外设时钟&#xff1b; 停止…

C++内存分区

内存分区 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 全局区&#xff1a;存放全局变量和静态变量以及常量&#xff08;不包括局部常量&#xff09; 栈区&#xff1a;由编译器自动分配释…

大数据面试题--kafka夺命连环问

1、kafka消息发送的流程&#xff1f; 在消息发送过程中涉及到两个线程&#xff1a;一个是 main 线程和一个 sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给双端队列&#xff0c;sender 线程不断从双端队列 RecordAccumulator 中拉取…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

LeetCode:485.最大连续1的个数——简单题简单做

目录 题目——485.最大连续1的个数 题目分析&#xff1a; 图解如下&#xff1a; 代码如下 题目——485.最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解…

如何在Android中自定义property

在Android中创建自定义的属性&#xff08;Android property&#xff09;通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤&#xff1a; 1. 定义属性 在Android中&#xff0c;属性是以“属性名称属性值”形式定义的键值对…

web——sqliabs靶场——第二关

今天来搞第二关&#xff0c;来看看是什么咸蛋 1.判断是否存在sql注入漏洞 输入1 存在sql注入&#xff0c;报错语句为 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 0,1 …