【Spring框架全系列】初识Spring MVC(上)

news2025/1/9 0:39:20

🌃哈喽,大家好,我是小浪。接着上篇博客,我们学习了springboot配置日志文件,到此,那么springboot的内容也更新的差不多了,由于是初学阶段,所以不学习那么深入,那么我们学习框架都知道SSM,当前我们已经学习完毕springboot了,那么今天就来学习第二个S,Spring MVC;📬📬

📲目录

一、什么是SpringMVC?

二、为什么要学习Spring MVC?

三、我们需要学习的内容

一、连接的功能

二、获取参数;

 四、后端参数重命名

五、传递JSON对象


一、什么是SpringMVC?

📡1、构建在Servlet(API)之上的;

⏱️2、是一个web框架;

🧭3、来自于Spring web MVC模块;

🔦定义:MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分为模型、视图和控制器三个基本部分;
如下图所示:
7538f6b645b3476b9cc7e3cd8e881e38.png

📻Model(模型)是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

📠View(视图)是应⽤程序中处理数据显示的部分。通常视图是依据模型数据创建的。

☎️Controller(控制器)是应⽤程序中处理⽤户交互的部分。通常控制器负责从视图读取数据,
控制⽤户输⼊,并向模型发送数据。
🕰总结:MVC 是⼀种思想,⽽ Spring MVC 是对 MVC 思想的具体实现。

二、为什么要学习Spring MVC?

🔭因为现在绝⼤部分的 Java 项⽬都是基于 Spring 或 Spring Boot的,⽽ Spring 的核⼼就是 Spring MVC。也就是说 Spring MVC 是 Spring 框架的核⼼模块,⽽ Spring Boot 是 Spring 的脚⼿架,因此我们可以推断出,现在市⾯上绝⼤部分的 Java 项⽬约等于 Spring MVC 项⽬,足以体现需要学习Spring MVC的必要;
这里需要注意:Spring MVC其实就是Spring web,还记得我们之前创建springboot项目的时候勾选的依赖了嘛;
9350e411b2b44aaa8ef23bdac42b0ebb.png

三、我们需要学习的内容

一、连接的功能

1、首先还是我们先学习如何创建一个Spring MVC项目;

那么博主这里演示的是通过springboot项目添加spring web依赖,来创建一个Spring MVC项目,其实在之前咱们的SpringBoot项目已经演示过了,只不过前几篇博客写的是springboot的知识;

创建的方法可以参考这篇博客:如何创建一个SpringBoot项目。

只不过我们在创建新项目的时候勾选Spring web依赖即可,如上图所示;

2、选取一个合适的目录,来创建一个新的Spring NVC项目,完成之后界面如下:

72c54b679cf04c189243a1e0f52b7d24.png

3、删除多余的文件目录;

76bb20e34c7c45168b8d2ea05b5ea50e.png

4、鼠标右键此项目,点击红色箭头指向,完成项目的初始化;

c181e2c4ca3544a587e4b2cbb96b4342.png

勾选maven,点击OK;

08649e8e6f464f0895a86601205828e0.png

5、观察下面两个文件变成蓝色说明初始化完成;

e08ca533dceb40b7b9107125c009fad4.png

6、在demo包下新建一个类TestController:

c38a9f088fdd40239be4734269d621ef.png

代码:

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@RequestMapping("/user")//url路由注册
@ResponseBody // 告诉程序要返回的是数据而不是页面
@Controller // 让框架启动的时候加载当前类,别人才能访问
public class TestController {

    @RequestMapping("/hi")
    public String sayHi(){
        return "hi,Spring MVC";
    }
}

7、运行启动类DemoApplication,然后在浏览器访问对应的url地址;

a8b58969910e4a34a4f4875dfb4b4712.png

我们发现,可以正常访问,这里需要注意代码中的那几个注解,缺一不可,注意理解每个注解的作用,最好能达到记忆的效果;

这里说明一下,我们可以使用这个注解@RestController代替@ResponseBody 和 @Controller,能够达到一样的效果,非常的方便;

路由映射:所谓的路由映射指的是,当⽤户访问⼀个 url 时,将⽤户的请求对应到程序中某个类
的某个方法的过程就叫路由映射;

一、@RequestMapping 是 post 还是 get 请求?

1、首先@RequestMapping肯定是get请求,因为我们通过浏览器来访问,可以在浏览器页面查看网页源代码来观察到;F12查看网页源代码,点击all;

87cde83b7da6415dbd61f1d3a32d8ff3.png

我们借助postman来验证 @RequestMapping是否为post方法;首先复制我们的url地址,放到postman里面,选择post请求,点击send;

13c46410a23a4cbf978c62fd168f8019.png

由此得出结论@RequestMapping即支持get请求,又支持post请求;

我们可以显示的指定 @RequestMapping 支持的请求方法,如下所示,这两种写法的意思一样;
@RequestMapping(value = "/hi",method = RequestMethod.GET)
@GetMapping("/hi")

或者指定@RequestMapping 支持post请求方法;

    @PostMapping("/hi")
    @RequestMapping(value = "/hi",method = RequestMethod.POST)

当指定为post请求的时候,我们再次通过postman设置为get请求看能否访问到;

036ae36e6a7a494e8f95cb19639673d1.png

我们发现报错了,说明显示指定请求生效了;

二、获取参数;

1、我们可以在原先的函数sayH中提供一个参数name,用来举例;

a9577b61d06f4314accc236b63e4a57e.png

2、运行启动类,在浏览器url地址里面输入:http://localhost:8080/user/hi?name=zhangsan

db5a0696753a483585a73d1a6fe795fa.png

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

注意在Spring MVC中传递参数一一定要传包装类型,而不是基础类型;

在TestController下新建一个方法;

    @RequestMapping("/can")
    public String sayHi2(int id){
        return "id="+id;
    }

浏览器url中访问:

23031c721c1c4bf79c8a44cc9d930bcb.png

我们发现直接会报一个500回来,为什么呢?我们把传递参数的类型换成包装类试一下;

    @RequestMapping("/can")
    public String sayHi2(Integer id){
        return "id="+id;
    }

运行结果:

7e213f123db04fec957c03bab5a87031.png

当需要一个基础类型,但又忘记传递的时候,使用基础类型会报错,使用包装类型不会,只是值为null;

如何进行热部署?

1、File -> settilngs ->找到红色箭头指向的框,勾选后面那个,点击OK;

9c3c6d9df52d45a6b0c88a47bebe342c.png

2、开启热部署,点击搜索,输入registry,点击第一个;

a6a2810fe3d54a86a927a88537f319cd.png

3、老版本ide(2021之前)的走这一步,新版本不用;

acea0087b53d4e188f974cb86fe0b24a.png

idea2021之后的版本:

e24f4ace4e844149b4ca8bd14ba7c374.png

到这一步,springboot热部署就已经完成了;那么idea热部署的本质是重启spring boot项目,一般会有3s左右的延迟;

三、传递对象;

1、在demo包下新建一个类User;

c230e397ab954cf3831ff90ce72eddea.png

User类代码:

package com.example.demo.controller;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private int age;
}
TestController中新增方法ShowUser;
    @GetMapping("/show-user")
    public String ShowUser(User user){
        return user.toString();
    }

浏览器输入url地址,传递相应参数(前端实现)http://localhost:8080/user/show-user?id=1&name=zhangsan&age=20

12a9b035c95a4383aaf3ee23e0f0fad8.png

 四、后端参数重命名

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不⼀致,⽐如前端传递了⼀个t 给后端,⽽后端⼜是以 starttime 字段来接收的,这样就会出现参数接收不到的情况,如果出现 这种情况,我们就可以使⽤ @RequestParam 来重命名前后端的参数值。
比如现在是原始的代码:
    @GetMapping("/show-time")
    public String showtime(String t1,String t2){
        return "开始时间"+t1 +" 结束时间"+t2;
    }

看起来非常的丑,那么我们可以使用@RequestParam 来重命名前后端的参数值:

    @GetMapping("/show-time")
    public String showtime(@RequestParam("t1") String starttime,@RequestParam("t2") 
            String endtime){
        return "开始时间"+starttime +" 结束时间"+endtime;
    }

浏览器输入url地址,同时传参数t1,t2;

http://localhost:8080/user/show-time?t1=2023.5.1&t2=2023.5.11

b6b37f7b39674ef59ce5d92d06d9c725.png

要注意,使用这个注解@RequestParam的时候,必须要传递参数,否则会报错;

a2cd14d402e341c38216a0f4e10ad364.png

当然我们可以通过设置 @RequestParam 中的 required=false 来避免不传递时报错;

    @GetMapping("/show-time")
    public String showtime(@RequestParam(value = "t1",required = false) String starttime,
                           @RequestParam(value = "t2",required = false) String endtime){
        return "开始时间"+starttime +"| 结束时间"+endtime;
    }

五、传递JSON对象

1、在postman里面设置以下操作;
a2a9be6d71c643a3ba4e5f18c100c6da.png

2、TestController类下代码:

    @PostMapping("/show-json-user")
    public String showJson(@RequestBody User user){
        return user.toString();
    }

3、在postman中进行测试;http://localhost:8080/user/showJson

faf2f19bfb4a497c98268d0c8fe5e8bc.png

📬📬OK,那么今天的Spring MVC学习内容就到这里啦,下篇博客我们继续来肝Spring MVC剩下的内容,感谢阅读,点个订阅,以便于及时收到更新的信息哈!📝💡💡

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

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

相关文章

数据结构:单链表增、删、查、改的实现

1.概念 链表是一种 物理存储结构上非连续 、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表 中的 指针链接 次序实现的 。 2.形式 我们使用链表一般都是创建一个结构体。 typedef int SLTDataType; typedef struct SListNode {SLTDataType data;struct SListN…

USB2.0 HUB的MTT与STT

HUB:集线器 以前呀,我也不清楚MTT与STT的区别,记得有一次选型的时候,很懵逼,结果还是按照以前同事的方案去选了,到后面想起来才抽空整明白了。 所以今天就来说下USB HUB里面的MTT与STT,并在文…

【GO】31. websocket实现

一. 引入gin、gorilla websocket包 go get github.com/gin-gonic/gin go get github.com/gorilla/websocket 二. 服务端代码 package mainimport ("bytes""fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log&…

从字节出来的测试总监,让我们用这份《测试用例规范》,再也没加班过。

经常看到无论是刚入职场的新人,还是工作了一段时间的老人,都会对编写测试用例感到困扰?例如: 固然,编写一份好的测试用例需要:充分的需求分析能力 理论及经验加持,作为测试职场摸爬打滚的老人&…

RobotStudio教程:ABB机器人TCP路径轨迹跟踪功能介绍与使用方法

目录 功能介绍 机器人工作站创建 TCP路径轨迹全局跟踪 基于事件管理器的TCP路径轨迹局部跟踪 基于Smart组件的TCP路径轨迹局部跟踪 仿真运行 功能介绍 干涉检查是虚拟仿真工作中非常重要的一个步骤,尤其是机器人工具与工件、工装夹具之间的碰撞干涉&#xff…

Java高阶数据结构 图的最短路径问题

图的最短路径问题! 文章目录 Java高阶数据结构 & 图的最短路径问题1. Dijkstra算法【单源最短路径】1.1 Dijkstra算法证明1.2 Dijkstra算法代码实现1.3 堆优化的Dijkstra算法1.4 堆优化Dijkstra算法代码实现 2. Bellman-Ford算法【单源最短路径】2.1 BF算法证明…

常见的基础模块电路,你都能看懂吗?

文章开始前,先来考考大家~ 下面的五副电路图,你能看懂几个? 目录 01.电源电路 02.运算放大器电路 03.信号产生电路 04.信号处理电路 05.传感器及其应用电路 06.显示电路 TDA2030电路图 34063电路图 555电路 TDA2030电路图 三极管分立元…

音视频八股文(11)-- ffmpeg 音频重采样

1重采样 1.1 什么是重采样 所谓的重采样,就是改变⾳频的采样率、sample format、声道数等参数,使之按照我们期望的参数输出。 1.2 为什么要重采样 为什么要重采样?当然是原有的⾳频参数不满⾜我们的需求,⽐如在FFmpeg解码⾳频…

从头开始学习Python接口自动化测试:编写测试用例,执行测试以及生成测试报告

Python接口自动化测试详解 随着Web服务和移动应用不断增多,以及对API和微服务的需求不断增加,API已成为现代应用程序中必不可少的组件。自动化测试框架可以大大简化API测试的过程,并确保其正确性和稳定性。Python是一种非常流行的编程语言&a…

洛谷B2100 同行列对角线的格

同行列对角线的格 题目描述 输入三个自然数 N N N, i i i, j j j( 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n, 1 ≤ j ≤ n 1 \le j \le n 1≤j≤n),输出在一个 N N N \times N NN 格的棋盘中(行…

西门子1200PLC如何在威纶通HMI上进行时间显示

先生成定时器DB,然后在引脚绑定变量,在西门子PLC中,DINT和TIME之间可以隐含转化。 第一种方法:触摸屏元件设置成DINT类型 数值元件资料格式为32-bit Signed,对应PLC中即为DINT类型。小数点以下没有位数。这是我们测试…

Android RecyclerView实现侧滑删除,附 Demo

距上次写博客有半年多了,回忆起来都觉得不可思议,中间也想憋俩大招,总是被耽误,这俩月忙完之后,终于空下来了,恰好新项目我和UI俩人商量一下,用MD来实现app。中间有个需求是RecyclerView中侧滑显…

ch06-Pytorch的正则化与归一化

ch06-Pytorch的正则化与归一化 0.引言1.weight decay 和 dropout1.1.Regularization1.2.Dropout 2.Normalization2.1.Batch Normalization2.2.Batch Normalization in PyTorch2.2.1.nn.BatchNorm1d()2.2.2.nn.BatchNorm2d()2.2.3.nn.BatchNorm3d() 2.3.其他常见的Normalization…

java servlet jsp 农产品价格信息搜集系统 python开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 农产品价格信息搜集系统 python是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助 系统采用 serlvetdaobean 模式开发 利用python 进行网站爬取 ,系统具有完整的源代码和数据库,系统主要采用B/S模式开…

Redis常见命令有哪些?怎么使用?

一、概述: 在了解Redis命令之前,我们要先了解Redis的数据结构,Redis是NoSQL数据库,采用了json存储模式,比MySQL等关系数据库更易于扩展,拥有丰富的数据类型,分基本类型与特殊类型。基本类型包括…

【Linux】网络---->套接字编程(TCP)

套接字编程TCP TCP的编程流程TCP的接口TCP的代码(单线程、多进程、多线程代码)单线程多进程多线程 TCP的编程流程 TCP的编程流程:大致可以分为五个过程,分别是准备过程、连接建立过程、获取新连接过程、消息收发过程和断开过程。 …

【youcans的深度学习 07】PyTorch入门教程:张量的基本操作 2

欢迎关注『youcans的深度学习』系列,持续更新中… 【youcans的深度学习 01】安装环境之 miniconda 【youcans的深度学习 02】PyTorch CPU版本安装与环境配置 【youcans的深度学习 03】PyTorch CPU版本安装与环境配置 【youcans的深度学习 04】PyTorch入门教程&#…

面向对象程序设计概述

🧑‍💻CSDN主页:夏志121的主页 📋专栏地址:Java核心技术专栏 目录 一、类 二、对象 三、识别类 四、类之间的关系 面向对象程序设计(Object-Oriented Programming,OOP)是当今的主流程序设计范型&#x…

线段树详解

目录 线段树的概念 线段树的实现 线段树的存储 需要4n大小的数组 线段树的区间是确定的 线段树的难点在于lazy操作 代码样例 线段树的概念 线段树(Segment Tree)是一种平衡二叉树,用于解决区间查询问题。它将一个区间划分成若干个子区…

Android 车载值不值得入手学?

前言 随着智能车的不断普及和智能化程度的提高,车载系统也在逐步升级和演进,越来越多的汽车厂商开始推出采用Android系统的车载设备,这为Android车载开发提供了广泛的市场需求。 其次,随着人工智能技术的发展和应用,…