Spring MVC框架学习

news2024/12/24 9:25:37

前言:本篇博客将从三个方面来写我们要学习SpringMVC的什么:

  1. 连接:当用户在游览器中输入一个url之后,能将这个url请求映射到自己写的程序,也就是访问一个地址时,能够连接到门自己写的服务器.         
  2. 获取参数:用户访问时如果带一些参数,我该怎样获取.
  3. 返回数据:执行业务代码之后,将结果返回给用户(前端).   

学习SpringMVC,我们就要先搞定这三点,至于业务代码,那就看各自的需求了.                                                                                        

目录

1. 什么是Spring MVC

2.实现前端与后端的连接(交互)

2.1 @RequestMapping注解

3.获取前端传过来的参数

3.1 获取简单的基本类型参数

3.2 获取对象

3.3 获取表单参数

3.4 获取JSON对象参数

3.5 获取文件并上传

3.5 获取 Cookie 

3.6 设置Session并读取

 3.7 获取Header

3.8 重命名前端参数

4.返回响应结果


1. 什么是Spring MVC

Spring MVC 全称Spring Web MVC,Spring Web MVC 又被简称为SpringMVC或SpringWeb.SpringMVC是基于Servlet API构建的一个Web框架.

MVC是一种思想,是Model View Controller的缩写,译为模型,视图,控制器.它是软件工程中的一种软件架构模式,Spring MVC就是实现了MVC思想的一个具体框架.MVC它们之间的关系如下:

Spring/SpringBoot/Spring MVC有什么区别?

Spring是一个框架,是一个包含了众多工具的IoC容器,其核心思想就是IoC;而 SpringBoot 就是为了Spring的创建而诞生的,就是为了快速去开发Spring框架.而它的底层就是依赖的Spring.它给Spring自动添加了很多依赖,可以理解为SpringBoot是依赖Spring框架来管理对象的依赖的.它更方便我们去开发一个Spring项目;而SpringMVC是Spring中一个专门面向Web开发的框架,它是基于Spring的.可以理解为它使用了Spring框架,基于MVC模式一种Web框架.

Spring和SpringMVC你可以理解为全能干细胞和分化后的细胞.Spring是原生的一种框架,有无限种可能,可以开发各种java项目.而Spring MVC是基于Spring,被特化为一种专注于MVC模式的Web框架.

知道了什么是SpringMVC之后,我们现在就来学习前面提到的三点:连接.获取参数,返回数据.

2.实现前端与后端的连接(交互)

我们先来创建一个SpringMVC项目,之后的讲解也都是基于这个项目的.

其实在创建Spring Boot项目时勾选中Spring Web的第三方框架支持,这样就是SpringMVC项目了.如下:

这样我们就有了一个SpringMVC的项目. 

然后现在有这么一个情景:当我访问地址 http://localhost:8080/user/hi 时,页面上能打印"Hello World!"这行字符串.

很显然,如果要完成这么一个任务,我肯定要将这个 url 映射到我后端的代码,也就是说要与后端连接起来.连接起来之后才能去完成一些任务.怎么实现呢,我们来看.

我们创建一个 UserController 类,实现用户与程序的连接,具体实现代码如下:

如图所示,建立起和前端的连接需要用到@RequestMapping这个注解.

注意:在此种情况下,@Controller和@ResponseBody这两个注解必须要加上.加上@Controller注解后该类才会在启动时被加载到容器中;因为Spring默认是返回一个页面,而加上@ResponseBody就是告诉Spring,该类返回的是一个数据,而不是一个面.@ResponseBody这个注解可以加载类上,也可以加在方法上.另外,@Controller和@ResponseBody这两个注解可以用一个@RestController注解来代替.

2.1 @RequestMapping注解

  • @RequestMapping 是Spring Web应用程序中最常被用到的注解之一,它是用来注册接口的路由映射的.

路由映射:当用户访问一个url时,将用户的请求对应到程序中的某个类的某个方法的过程就叫路由映射.

  • 与Servlet不同,Servlet的路由注解只能用来修饰类,而@RequestMapping可以修饰类,也可以修饰方法,还可以同时修饰.如上图代码所示,既修饰了类也修饰了方法.
  • @RequestMapping 既能接受post请求也能接受get请求.

如果想只接受Get请求或只接受Post请求,可以按照以下这种写法:

也可以使用注解@GetMapping@PostMapping去专门指定一种请求.

总结:要想实现前端与后端的连接,主要是靠@RequestMapping,@GetMapping或@PostMapping注解来实现的.

3.获取前端传过来的参数

要知道,SpringMVC是基于Servlet API构建的一个Web框架,所以它获取参数是可以和Servlet相同的的.对于SpringMVC,其内部默认内置隐藏了两个参数,一个是HttpSevletRequest对象,一个是HttpSevletResponse对象.如果你想用的这两个对象,可以在路由映射的方法的参数中直接声明这两个对象即可.如以下代码:

启动服务器,游览器访问 localhost:8080/user/hi?name=张三 ,结果如下:

但是作为更高级的SpringMVC框架来说,更简单的获取参数的方法,接下来我将介绍在SpringMVC中常见的几种获取参数的方法.

3.1 获取简单的基本类型参数

如图,我只需要路由映射的方法的参数列表中声明参数类型即可,这样就可以接收前端传递过来的参数啦.启动服务器,访问localhost:8080/user/get1 ,结果如下:

为什么age的类型要用Integer而不是int?

首先说明一下,这里是可以用int,但是我们不能确定前端一定会给后端传递一个int型的参数,也就是说前端可能什么都不传,为了防止空指针异常,我们这里使用int的包装类Integer.

如果前端要传入多个参数的话,后端这边要接收的话,只需要在路由映射的方法的参数列表中一一声明即可,比如这样:

 

3.2 获取对象

上面说到,如果获取多个参数的话,可以在方法的参数列表中一一声明即可.那如果前端传过来几十上百个参数呢,还是一一列举吗?这种方式肯定也行的通,但是非常麻烦,而且不利于后期维护.所以面对这种情况,我们通常将前端要传递的参数封装成一个类,我们只需要维护这个类的属性即可.

比如前端要传递给后端一个学生的信息(编号,姓名,年龄...),那我后端怎么来接收呢,可以将其一一写在参数列表里面,但是太麻烦.这里我们将其封装成一个Student,代码如下:

 

然后在路由映射的方法的参数列表中写上Student这一个类型的参数就行了,如下 :

 

启动服务器,访问localhost:8080/user/get2?age=45&name=张三&id=1,结果如下:

 

3.3 获取表单参数

如果现在有一个表单页面,如下:

表单源代码如下:

 

 现在我将在表单的用户栏上填写"张三",密码栏上填写"123",点击提交,将数据发送给后端,后端要怎么来接收呢?

因为表单数据比较少,只有两条,所以我可以直接在后端中声明两个参数来接收即可.代码如下:

运行结果如下:

 

很显然,用这种方法是可以获取到表单的参数的.

但是如果遇到表单参数比较多的呢,还是一一声明吗,肯定也可以,只不过太麻烦,所以我们通常用另外一种获取表单参数的方法来解决表单参数比较多的情况----将需要接收的参数用一个类封装起来.

比如前端通过表单数据传递给后端一个用户的信息(姓名,密码...),然后我就可以在后端将这些属性用一个User类给封装起来,如果以后前端有什么其他属性要修改啥的,我后端就只需要维护那个User类里面的属性就行了.代码如下:

如果前端通过表单传递这些信息过来的话,我后端的参数就只需要写User类型即可,代码如下:

 启动服务器,访问localhost:8080/login.html ,页面如下:

点击提交,结果如下:

 

这样就说明我们后端通过封装对象这个方法成功获取到了前端通过表单传递过来的数据.

3.4 获取JSON对象参数

我现在通过Postman向后端传递一个JSON类型的参数,如下:

 则后端可以这样来接收这个JSON对象,代码如下:

注意看,参数列表中除了有参数以外,还有一个@RequestBody注解,在这里,这个注解的作用就是告诉后端,参数的获取应该到http请求的body里面去找,因为JSON对象就是在http请求的body里面.如果不加这个注解,后端将拿不到JSON对象.

另外还需要注意,后端这边对于JSON参数的接收,只能用一个对象来接收,因为JSON的出现一定是以对象的形式出现的,而不会以单个属性出现.

3.5 获取文件并上传

后端对于文件的接收是怎样的呢?又是怎样保存文件的呢?直接看以下代码的实现:

我们现在来验证一下.用postman给后端发以下请求:

 点击Send后,看收到的返回信息:

 

显然,不出意料的得到了自己想要的结果.我们再来看一下文件是否真的上传到了指定位置:

因此,文件的获取和保存就成功了. 

3.5 获取 Cookie 

获取Cookie的方法不止一种,这里只讲一种简洁的获取Cookie的方式--使用@CookieValue注解,代码如下:

接着我们来验证一下这段代码是否真的获取能获取到前端的Cookie. 

在谷歌游览器上构造以下Cookie:

然后访问localhost:8080/user/get5,结果如下:

 

验证成功!

3.6 设置Session并读取

设置Session:

 

获取Session:

先访问localhost:8080/user/setsession来设置一个session,然后访问localhost/user/getsesion,结果如下:

 

 3.7 获取Header

使用@RequestHeader注解就行,在参数中声明需要获取的某一个即可:

游览器访问localhost:8080/user/header,可得到以下结果:

3.8 重命名前端参数

按照上面讲的,如果前端传递了一个name给后端,而后端用username来接收的话,会出现后端参数接收不到的情况,比如以下代码:

 

如果前端这样访问:localhost:8080/user/getname?name=张三,很显然肯定是访问不到的.但是在日常的开发中,有时会有前后端都坚持自己的参数命名,而作为一个后端人员,我必须拿到前端数据,但是我又不想使用前端规定的参数名称,这时我就可以使用 @RequestParam 注解来重命名前端的参数值.如以下代码:

 

 现在通过 localhost:8080/user/getname?name=张三 就可以访问到了.结果如下:

补充:使用@RequestParam注解还可以对参数设置是否必须接收到,代码如下:

4.返回响应结果

返回数据给前端就很简单,直接return就行,我上面写的那些代码里面都有返回数据的,可以仔细看一下.

这里要补充几点:

      (1).如果返回的是一个HashMap的话,会自动被转化为JSON格式的.

(2).如果要返回一个静态页面的话,就不用加@ResponseBody.这样返回的话就是一个页面的地址,比如以下代码:

访问 localhost:8080/test/index ,可得到如下结果:

 

   (3).return 不仅可以返回一个页面,还可以实现跳转,跳转的方式有两种:

  • forword:请求转发
  • redirect:请求重定向 

以下是这两种方式的使用:


关于SpringMVC的学习就到这了,看完这篇博客,文章开篇说的那三点知道了吗,如何与前端连接,如何接收参数以及如何返回结果.是不是发现越是高级的框架越简单呢,因为很多它已经帮我们内置好了,我们可以直接使用注解来实现.好啦好啦,就先到这了,拜拜~~~

 

 

 

 

 

 

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

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

相关文章

NVM实现一台电脑对node的多版本管理。

一、NVM:Node Version Management; 下载地址:Releases coreybutler/nvm-windows GitHubA node.js version management utility for Windows. Ironically written in Go. - Releases coreybutler/nvm-windowshttps://github.com/coreybutl…

JavaScript寒假系统学习之数组(一)

JavaScript寒假系统学习之数组(一)一、数组1.1 什么是数组1.2 数组创建的2种方式1.2.1 利用new创建数组1.2.2 利用数组字面量创建数组1.3 访问数组元素1.4 遍历数组1.5 数组实战训练1.5.1 计算数组的和以及平均值1.5.2 求数组中的最大值1.5.3 数组转化为…

使用Qemu在Windows上模拟arm平台并安装debian10 arm系统(cd镜像) 安装记录

参考:使用Qemu在Windows上模拟arm平台并安装国产化操作系统_viyon_blog的博客-CSDN博客_qemu windows 镜像:debian-10.12.0-arm64-xfce-CD-1.iso 环境:qemu虚拟机,宿主机win10,amd64 QEMU_EFI.fd: (298条消息) qemu虚拟机的bi…

N皇后问题-leetcode51-java回溯解+详细优化过程

说明:问题描述来源leetcode 一、问题描述: 51. N 皇后 难度困难1592 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之…

实验八、直接耦合多级放大电路的调试

一、题目 两级直接耦合放大电路的调试。 二、仿真电路 图1(a)所示电路为两级直接耦合放大电路,第一级为双端输入、单端输出差分放大电路,第二级为共射放大电路。 由于在分立元件中很难找到在任何温度下均具有完全相同特性的两只晶体管,因而…

Active Directory 基础 —— 如何理解group的类型

因为创建一个跨域的组,重新温习了一下最基本的AD知识,所谓温故而知新,把温习的结果整理了一下。AD里面的group类型从范围来说分为global, universal 和 local domain, 从类型来分分为security和distribution。后面的类型理解很容易,security就是纯粹用来权限访问的,而dist…

Java实现FIFO、LRU、LFU、OPT四页面置换算法

题目要求 采用多道程序思想设计一个程序,模拟页存储管理地址变换的过程,可采用FIFO、LRU、LFU、OPT四页面置换算法。基本要求如下: 需要建立访问页表线程、访问快表线程、缺页中断处理线程、访问内存线程等,协同这些线程模拟完成…

JDK17升级之路:JCE cannot authenticate the provider BC问题

问题的产生 报错代码运行环境 JDK:Oracle JDK17 CentOS7.8 这个问题刚拿到比较棘手。原因是本地windows是OK的,centos上是不成功的,报了下面的错误: Caused by: java.lang.SecurityException: JCE cannot authenticate the provi…

论文阅读 DeepGCNs: Can GCNs Go as Deep as CNNs?

DeepGCNs: Can GCNs Go as Deep as CNNs?绪论1、介绍2、相关工作3、方法3.1、图神经网络的表针学习3.2、图神经网络的残差结构3.3、图神经网络的密集连接3.4、图神经网络的扩张性聚集绪论 CNN很强,但不能正确解决非欧几里得数据的问题,图卷积网络&…

YOLO-V5 系列算法和代码解析(五)—— 损失函数

文章目录基本简介调试准备损失函数基本简介 损失函数是神经网络的重要组成部分,用于评估网络的预测值和真实值的差异度。根据偏差的大小,反向调整网络的训练参数,迭代优化使得损失尽量小,也就得到最优的网络参数。 调试准备 debu…

Go-学生教务管理系统【无界面 / 离线版】(一)

【Go】学生教务管理系统(无界面 / 离线版)(一)Ⅰ. 程序说明一、博客日期二、引言Ⅱ. 版权声明Ⅲ. 开发环境一、开发配置二、开发工具Ⅳ. 效果演示一、工程结构(一)目录结构(二)目录说…

【Ctfer训练计划】——(六)

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

Springboot启动之自定义run方法

前言 之前分析的Springboot启动过程的源码分析中给自己留了一个扩展作业:执行自定义的run方法,此方法在B.7、调用运行器简单分析过,今天咱们就自定义一个Run方法试试。 一、实现自定义的run方法 由于java中的接口可以多实现,所以…

IOS----TangramKit 布局框架

文章目录系统结构CocoaPods安装举例下面一个应用场景:布局线性布局TGLinearLayout相对布局TGRelativeLayout框架布局TGFrameLayout表格布局TGTableLayout流式布局TGFlowLayout浮动布局TGFloatLayout路径布局MyPathLayoutgithub: https://github.com/youngsoft/TangramKit/blob…

day32【代码随想录】回溯之N皇后、N皇后||、解数独、有效的数独

文章目录前言一、N皇后(力扣51)二、N皇后||(力扣52)三、解数独(力扣37)四、有效的数独(力扣36)前言 1、N皇后、 2、N皇后||、 3、解数独、 4、有效的数独 一、N皇后(力扣…

材料表征仪器:慢正电子束谱仪最全知识讲解

1 引言 21世纪科学的发展将是微观与宏观的相互渗透与密切结合。凝聚态物理、材料科学等的研究,将由现在的宏观统计方法(包括宏观量子统计)深入发展到物质的原子层次物性研究,微观粒子(颗粒、孔隙)的量子效…

求最大公约数,求阶乘,求n个n相乘的末两位数(Python)

问题 AN: 41.求最大公约数 题目描述 对于求两个正整数m&#xff0c;n的最大公约数可以用do-while实现 输入 输入两个正整数m&#xff0c;n 输出 最大公约数 样例输入 1 2 样例输出 1 a,b map(int,input().split()) if a<b:a,b b,a#python很方便的交换操作 #适应判断不带…

MySQL复制技术方案——异步复制配置

为MySQL服务器配置复制非常简单。但由于场景不同&#xff0c;基本的步骤还是有所差异。最基本的场景是新安装的主库和备库&#xff0c;总的来说分为以下几步∶ 1. 配置复制 为MySQL服务器配置复制非常简单。但由于场景不同&#xff0c;基本的步骤还是有所差异。最基本的场景是…

HTML5 Canvas

文章目录HTML5 Canvas概述Canvas元素使用绘制直线画2条直线用直线画三角形用直线画矩形绘制矩形描边矩形填充矩形混合使用rect()清空矩形区域清空画布绘制多边形画箭头画正三角形绘制圆形HTML5 Canvas 概述 HTML5新增了一个Canvas元素&#xff0c;我们常说的Canvas技术&#…

【LeetCode】填充每个节点的下一个右侧节点指针 [M](二叉树遍历)

116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 一、题目 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node { int val; Node *left; Node *…