SpringMVC及注解介绍(一)

news2024/11/26 5:30:08

目录

1.什么是 Spring MVC?

2.创建一个SpringMVC项目

3.MVC定义

4.MVC和SpringMVC的关系

5.如何学SpringMVC

6.SpringMVC注解介绍

1.@RequestMapping

2.@ResponseBody

3.@RestController = @Controller + @ResponseBody

4.更换五大注解

5.@RequestMapping 是 post 还是 get 请求?

6.@GetMapping(设置请求方法)

 7.获取参数

7.1通过对象获取参数

7.2参数重命名@RequestParam

7.3指定接受数据格式

7.3.1@RequestBody将接收到的json数据格式转化为字符串

7.3.2@PathVariable 从url中拿数据(参数必传)


1.什么是 Spring MVC?

Spring Web MVC 是基于Servlet API 构建的原始 Web框架, 从一开始就包含在Spring框架中
及Spring是一个很大的框架, 而SpringMVC只是属于Spring体系中的一个Web模块
所以我们在学习Spring的时候需要通过main方法去访问Bean方法,因为没有引入Web模块,想通过浏览器输入url来访问方法是不可行的

2.创建一个SpringMVC项目

1.创建一个SpringBoot项目

2.删除不必要的文件

3.添加所需要的依赖 

3.MVC定义

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

4.MVC和SpringMVC的关系

MVC是一种思想,SpringMVC是对MVC思想的一种具体实现

就等于DI是IoC的一种具体实现一样

总的来说:SpringMVC是一个实现了MVC模式,并继承了ServletAPI的Web框架,当用户在浏览器输入url后,SpringMVC就可以感知到用户的请求

SpringMVC是一切项目的基础

5.如何学SpringMVC

简单来说我们只需要掌握三个功能

  • 连接的功能:将⽤户(浏览器)和 Java 程序连接起来,也就是访问⼀个地址能够调⽤到我们的Spring 程序。
  • 获取参数的功能:⽤户访问的时候会带⼀些参数,在程序中要想办法获取到参数
  • 输出数据的功能:执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤户

6.SpringMVC注解介绍

1.@RequestMapping

RequestMapping是用来实现url映射的也就是浏览器连接程序的作⽤。

@RequestMapping既可以用来修饰类也可以用来修饰方法,用户访问的url地址就是类+方法

@RequestMapping还需要和五大注解一起使用,将这个类交给spring去管理,这样项目启动的时候,才会被扫描到

接下来要实现的功能是访问地址:http://localhost:8080/user/hi,能打印信息
1.创建⼀个 UserController 类,添加以下代码

 

 结果如下:

 

由上面的结果截图可以看到,我们返回的是一个html页面数据,这就是以前的MVC,它返回的是一个视图,但现在的项目都是前后端分离项目,所以我们返回的都是数据

2.@ResponseBody

使用ResponseBody注解来告诉前端我们返回的是数据而不是视图

那么现在我们直接返回数据会发生什么呢?

结果如下: 

 

 可以看到,index.html并不会以页面的形式返回,而是直接显示了文件名

当然现在我们有一个更方便的注解

3.@RestController = @Controller + @ResponseBody

上面的程序可以简化

但是用这个注解之后,当前类所有方法的返回对象都是数据而不能是视图 

4.更换五大注解

上面我们使用的注解是@Controller,那么我们换成其他的是否还能正常运行出来呢?

我们来试一下@Component

 结果如下: 

可以看到url访问不了了,如果我们将五大注解都试一遍的话就会发现只有@Controller能访问得了

那么这是什么原因呢?

因为在MVC项目中,url只能通过@Controller来设置

5.@RequestMapping 是 post 还是 get 请求?

使用postman去测试

 

 

  

我们可以发现,@RequestMapping可以接受get,post以及其他的所有请求,那么如果我们只想让他支持get或post请求呢?

6.@GetMapping(设置请求方法)

我们可以在@RequestMapping后面添加支持的方法

也可以直接在方法上面加上注解@GetMapping

这样post方法就访问不到了 

 7.获取参数

之前servlet项目获取参数的方式就是通过request.getParameter来获取参数值

 

可以看到通过这样的方式还是可以拿到数据 ,说明在每个方法中都内置了request,response两个参数,那么有没有更简单的方式呢?

其实,在springMVC项目中,我们直接去拿参数也是可以的,就像这样

可以看到同样是获取成功了,但是这么写有一个 默认规定就是参数名要与url中的一致,不一致就拿不到了

那么这样可以拿多个参数吗?

我们来测试一下 

可以看到同样是成功获取到了 ,并且他还将我们的类型转换成功了

如果我们传参错误,那么就会报错了

我们刚才使用的是int的包装类Integer,如果我们使用int修饰参数会发生什么呢?

我们来测试一下

 

可以看到如果不传参,就会报错,并且和之前r的报错信息不一样(Integer不传参输出就是空,不会报错),status=500表示是服务器内部的错误 ,这是为什么呢?因为int基本数据类型不能为空,所以在项目开发中,我们通常使用包装类Integer

我们发现当前这样写,有一个比较严重的问题,代码耦合性太高了,如果参数非常多的话,我们难道还要一个一个写吗?

7.1通过对象获取参数

解决办法就是将他包装成一个对象

此时我们重新使用对象获取参数 

 

 可以看到使用对象成功获取到了参数,url传递的参数和对象内的属性对应,如果有一个属性没有传递参数,那么就为null,这就是使用包装类的好处,不会报错,

如果我们多传了参数,传递了对象中没有的属性,那么也不会报错,只是不会显示出来罢了

此时我们如果需要加参数,那么我们只需要在对象中添加属性就可以了,这样是不是方便了许多呢 ,比如添加一个参数昵称nickname

此时只需要在Student类中添加一个属性nickname

我们再去访问:

可以看到添加成功了 

并且通过对象传递参数还有另外一种好处,就是不论前端是通过哪种方式传递的(form表单,浏览器,或者ajax等方式),后端都能接收到,所以我们不必关心前端是如何传递参数的,只要能传过来就好了

我们可以使用postman测试一下前端传递参数能否成功

 可以看到同样是成功传递了

我们刚才提到,使用对象传递参数的一大前提就是对象的属性必须和前端传递的参数名一致,这样才可以成功接收,但是如果我不想用前端传递过来的参数名称呢?有没有什么别的方法?

7.2参数重命名@RequestParam

使用@RequestParam("username") String name  此时就可以将前端username传递过来的参数值赋值给name了

 

后端也是成功拿到了数据并返回了 ,此时若是前端使用name传递数据的话,就会报错了

 我们查看日志发现,username是必传参数

 我们去看看@RequestParam的源码

 查看@RequestParam的源码发现,他默认就是必传参数,此时我们只需要将required改为false将其修改为非必传参数即可

我们在重新访问 

此时就不会报错了,因为username不是必传参数了,但是后端还是拿不到数据,因为name已经重命名前端只能通过username传递了

7.3指定接受数据格式

此时如果我们使用json传递数据那么返回的是什么呢?

 

 可以看到返回的数据为空,这是为什么呢?

我们使用fiddler抓包去查看

 好像后端并没有解析出来我们使用json传递的数据

 所以我们需要使用一个注解,@RequestBody将接收到的json数据格式转化为字符串

7.3.1@RequestBody将接收到的json数据格式转化为字符串

 使用postman测试:

发现spring成功将json数据接收并转化为字符串格式并且转化成对象返回

那么使用@RequestBody注解后还能接受字符串传参吗?

使用postman测试:

我们发现报错了,所以使用@RequestBody后就只能接受json格式的数据了

那么如果我们想接受url中传递的数据呢?

7.3.2@PathVariable 从url中拿数据(参数必传)

使用postman进行测试:

可以看到后端也是成功拿到了数据并返回

也可以对其进行重命名

 可以看到同样是成功获取到了数据

 

 

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

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

相关文章

整车总线系列——FlexRay 五

整车总线系列——FlexRay 五 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能…

【NumPy 简单入门学习】

NumPy 简单入门学习 提示:仅记录需要记忆的知识点和不易理解的知识点 文章目录 NumPy 简单入门学习前言一、创建数组二、多维数组切片1.切片的多种形式2.数组的数学运算3.布尔屏蔽4.Where 函数 总结 前言 提示:这里可以添加本文要记录的大概内容&#x…

【问题记录】Ubuntu 22.04 环境下,打开 VS Code 老是访问密钥环该怎么解决?

目录 环境 问题情况 解决方法 环境 VMware Workstation 16 Pro (版本:16.1.2 build-17966106)ubuntu-22.04.2-desktop-amd64 问题情况 在Ubuntu下,每次运行 VS Code时,老是提示要输入密钥密码来解锁保存在密钥环&am…

POSTGRESQL 子事务的问题与注意事项

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…

使用conda pack进行环境迁移

起因 起因是训练服务器为了安全期间,限制不能联网。而且想连接A100显卡的训练服务器必须通过堡垒机方可连接(即目标服务器既不能联网,也与本机不在同一个网段) 安装工具 首先,使用 conda env list 查看所有环境&…

Data与Java8中的LocalDate相互转换

一、前言 Date这个类在java.util包中,始于jdk1.0。后来在jdk1.8时,针对日期类进行了一个大的更新,专门新建了java.time包,新的日期类LocalDateTime就在这个包中。 日常工作中,很容易碰到旧日期类Date,与新…

回归预测 | MATLAB实现TCN-GRU时间卷积门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-GRU时间卷积门控循环单元多…

C语言数据在内存中的存储

目录 前言 本期内容介绍 一、数据类型的介绍 1.1类型的意义: 1.2C语言中是否有字符串类型? 1.3类型的基本归类 整型家族: 浮点型(实型)家族: 构造(自定义)类型:…

通过 CSS 的样式实现语音发送动效类似声音震动的效果

实现效果&#xff1a;一般用于发送语音的时候&#xff0c;出现动画效果 //模版部分 <view class"musical-scale"><view class"scale"><view class"em" v-for"(item,index) in 15" :key"index"></view…

记录这这段时间发生的事情。

当做后端的时候总是被骂做前很丑。成为一个UI设计师与后端工程师才会更加完美。 尝试着做一个主页面。 创建了一个主页面 的表格index。 收录了希望发送到主页的&#xff0c;的帖子。 并且&#xff0c;可以填写是否可以。 一个看起来不错的主页。 标题设计的左右框。 这种框…

自动化运维——Ansible学习(四)——roles角色

目录 一、roles概述 二、角色的使用 1.角色(roles)&#xff1a;角色集合 2.roles建议存放位置 3.调用角色的方法 (1)调用角色方法1 (2)调用角色方法2 4.完整的角色架构 5.roles playbook tags使用 三、Ansible Roles目录编排 四、roles目录 (一)roles目录结构 …

剑指offer简单题01-10

01 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param numbers int整型一维数组 * return int整型*/public int duplicate (int[] numbers) {// write code hereint…

【计算机视觉|人脸识别】 facenet-pytorch 项目中文说明文档

下文搬运自GitHub&#xff0c;很多超链接都是相对路径所以点不了&#xff0c;属正常现象。点击查看原文档。转载请注明出处。 原作者暂时并未对我的提交做出回应&#xff0c;这里同步提交到CSDN&#xff0c;点击查看项目源码 使用 Pytorch 进行人脸识别 Click here to return …

git 和adb

一、git 1、git的作用 git是一个版本控制系统&#xff0c;是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 我的理解就是代码管理器&#xff1a; 第一点你可将代码备份到git仓上&#xff1b; 第二点可记录的你修改记录&#xff1b; 第三点…

Vue中TodoLists案例_删除

与上一篇Vue中TodoList案例_勾选有三个文件变化了 App.vue&#xff1a;添加了一个deleteTodo根据id删除方法&#xff0c;传递给儿子组件MyList <template><div id"root"><div class"todo-container"><div class"todo-wrap"…

Android ObjectBox数据库的使用与详解

一、介绍 Room数据库 之前我已介绍了jetpack组件的数据库&#xff1a;Room&#xff0c;有小伙伴需要了解Room数据库可以查看这个地址&#xff1a;Android JetPack组件之Room数据库的集成与详解_android room数据库_蜗牛、Z的博客-CSDN博客 数据库的性能对设备来说很重要&#…

【雕爷学编程】Arduino动手做(168)---ATTINY85迷你USB开发板

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【Spring MVC学习】连接 接收请求参数 响应返回参数

目录 前言&#xff1a;认识Spring MVC &#x1f337;1、什么是MVC&#xff1f; 一、建立连接&#xff08;5个注解&#xff09; &#x1f337;1、RequestMapping注解:注册接⼝的路由映射&#xff08;默认返回页面&#xff09; &#x1f337;2、ResponseBody注解&#xff1a…

从简单线性回归到TensorFlow深度学习

大家好&#xff0c;人工智能近年来变得越来越流行&#xff0c;学习人工智能的需求也随之增加&#xff0c;尤其是许多IT专业人士希望利用机器学习的强大功能&#xff0c;但面临不小的挑战&#xff0c;尤其是在理论和数学上。 步骤1&#xff1a;线性回归 线性回归是一种统计学中…

Centos7:http/PhP升级

系列文章目录 RHCE第0章&#xff1a;RHCE开始前的准备 RHCE第1章&#xff1a;Web服务器&#xff08;上&#xff09; RHCE第1章&#xff1a;Web服务器&#xff08;下&#xff09; RHCE第2章&#xff1a;DNS服务 RHCE第3章&#xff1a;DHCP服务器 RHCE第4章&#xff1a;Firewall…