【Spring】Spring MVC入门

Spring MVC入门

一、什么是Spring Web MVC?

1.1 MVC定义

MVC是Model View Controller的缩写,是一种软件架构的设计模式,将软件系统分为模型、视图、控制器三个部分。

示意图如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到,Controller作为一个==“粘合剂”==处于Model和View之间,充当传话筒。

就好比:

在饭店顾客将想吃的饭菜报给前台,前台将这个请求报给后厨,后厨选择对应的菜谱进行制作,完成之后前台再将饭菜反馈给前台,前台将饭菜端到顾客面前。

在这个例子中:

顾客 -> View

前台 -> Controller

后厨 -> Model


1.2 什么是Spring Web MVC?

简单来说,MVC是一种架构设计模式,Spring Web MVC 是对于这种思想的一种实现

Spring: 是一种框架,便于进行开发

Web: 网页开发

MVC:架构设计模式

  1. Spring Web MVC 一般简称为 SpringMVC。
  2. Spring MVC就是一种网页开发的框架,这种框架的设计架构是MVC。

示意图:

在这里插入图片描述

可以看到相比于MVC的示意图只是添加了一个浏览器。

那么饭店的那个例子就是:

顾客去吃饭,将想吃的饭菜报给传菜员,传菜员报给前厅,前厅报给后厨,后厨制作,反馈给前厅,传菜员将饭菜端过去。


二、 学习Spring MVC

2.1 如何使用?

由上图可以知道,打开MVC大门的是浏览器,所以需要让我们的Java代码和浏览器建立连接。

流程:

  1. 建立连接:代码和浏览器建立连接。

  2. 请求:用户使用浏览器发送请求,要在代码中获得这个请求。

    具体说就是获取参数这个动作。

  3. 响应:MVC这一套下来以后会有一个具体的响应,所以需要让这个响应返回给用户。

    获取到用户请求后,需要在代码部分对于请求进行分析,分析完成后的响应需要通过连接返回给用户。

2.2 建立连接

建立路由映射的注解是:@RequestMapping("路径名称")

有了这个路径,就可以打通代码和浏览器之间的连接,使得代码可以通过这个 url 对浏览器建立连接。

但是光有这个路径还不够:

代码:

package com.example.springmvcdemo;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/request")public class RequestController {@RequestMapping("/hello")public String sayHello() {return "hello, Spring MVC";}
}

结果:

在这里插入图片描述

会报404的错误,使得资源不存在。

原因在于没有加上@RestController的注解,这并不会使得Spring认为这个程序是一个想要与浏览器建立连接的程序,Spring不回扫描这个程序所带的路径:“/request/hello”,只有加上这个注解,Spring才会扫描这个路径,这样资源才能够找得到。


@RestController解释:

  1. 这个注解是@Controller@Responsebody的组合,成为组合注解。

  2. @controller是控制器注解,表明这个类是一个控制器

  3. @Responsebody表示将方法的结果直接写入HTTP响应

    如果返回值是字符串,则将在网页上直接显示该字符串

代码:

package com.example.springmvcdemo;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/request")
@RestController
public class RequestController {@RequestMapping("/hello")public String sayHello() {return "hello, Spring MVC";}
}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


2.3 总结

  1. 建立路由映射时使用的注解是:@RequestMapping

  2. 必须让需要与浏览器建立连接的代码成为控制器类才能交由Spring进行扫描,使用的注解是@RestController

  3. @RequestMapping注解可以使用在类和方法上,访问的路径是:类路径(如果有)+方法路径

  4. 在使用@RequestMapping注解时,可以在路径前面加上斜杠,也可以不加(Spring会自动帮忙加上)

    建议加上斜杠 “/”

  5. 可以指定方式接收响应

    代码:

        // 指定使用GET@RequestMapping(value = "/hello", method = RequestMethod.GET)public String sayHello() {return "hello, Spring MVC";}
    
  6. @RequestMapping同时支持GET和POST请求

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


三、 传递参数

3.1 传递单个参数

代码:

    @RequestMapping("/r1")public String r1(String para) {return "接收到参数:" + para;}@RequestMapping("/r2")public String r2(Integer para) {return "r2接收到参数:" + para;}@RequestMapping("/r3")public String r1(int para) {return "r3接收到参数:" + para;}

结果(成功):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结果(失败):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


总结:

从以上实验结果可知:

  1. 传递参数时,形参尽量使用包装类。如果是基本类型,必须传参(除了Boolean类型)。

    包装类是一个引用,可以为空

    基本类型是一个值,不能为空,但是有默认值的概念(int的默认值是0,bool的默认值是false)

  2. 传参的时候名称不对则传参不成功。

  3. 传参的时候会发生类型强制转化,所以如果形参和传递参数的类型不一致,那么会发生类型转化异常。

    在浏览器传递参数都是以字符串的形式进行传递,浏览器并不负责类型解析的工作,但是在传递到程序一端的时候,就会对于这个参数进行类型转化,所以会发生异常。


3.2 传递多个参数

代码:

    @RequestMapping("/r4")public String r4(String para1, Integer para2) {return "r4接收到参数1:" + para1 + " 参数2:"+para2;}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. 传递多个参数会按序传递。
  2. 传递的时候是按照名称进行匹配的,所以浏览器在进行传参的时候可以不按照代码的参数顺序进行传参。
  3. 传递的时候,基本类型和包装类型的规则同传递单个参数的情况

3.3 传递对象

在可以一次传递多个参数的基础上,演化为可以传递对象,因为如果每次增加参数的时候都去在参数部分增加,那会让代码冗长不易读,而且修改代码的工程量大,所以需要有一个对象就将所要传递的参数进行封装。

代码:

    @RequestMapping("/r5")public String r5(Person para) {return "r5接收到对象:" + para.toString();}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. 在传递对象的时候,会按照名称进行寻找传递的参数。
  2. 包装类和基本类型的传递规则同上。
  3. 总而言之,与传递多个参数保持一致。

3.4 后端参数重命名(从URL中获取参数)

使用@RequestPram注解。

代码:

    @RequestMapping("/r6")public String r6(@RequestParam("intPara") Integer para) {return "r6接收到参数:" + para;}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. @RequestParam注解并不适用于类,只能对于单个、多个参数(每个参数都需要再写一遍@RequestParam)进行使用

  2. 使用时,是从URL中拿到参数,所以注解当中的名称应当和浏览器一方的名称相同。

  3. 在传递参数时,如果是必传,可以在注解中加上 required=true(此项在实现中默认是true,所以默认加上这个注解之后就是必传)

    代码:

        @RequestMapping("/r6")public String r6(@RequestParam(value = "intPara", required = true) Integer para) {return "r6接收到参数:" + para;}

    结果:

    image-20240418155459641

    可以看到即使是包装类,在加上required=true这个条件之后也会发生错误。


3.5 传递数组

代码:

    @RequestMapping("/r7")public String r7(String[] para) {return "r7接收到数组:" + Arrays.toString(para);}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传


3.6 传递集合-@RequestParam

代码:

    @RequestMapping("/r8")public String r8(@RequestParam List<String> para) {return "r8接收到集合:" + para;}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. 传递集合时需要加上@RequestParam注解。

    传递数组不需要加是因为Spring会自动将参数解析到数组中,但是集合不能解析,所以需要加上这个注解进行解析

  2. 其余与传递数组相同。

3.7 传递JSON数据-@RequestBody

代码:

    @RequestMapping("/r9")public String r9(@RequestBody Person para) {return "r9接收到JSON:" + para;}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. 需要加上 @RequestBody注解

  2. 在使用postman传递参数的时候需要使用Body选项,选择json进行传递

  3. JSON语法:

    1. 对象使用 {}

    2. 数组使用 []

    3. 数据表示为 键:值

      值也可以是数组

    4. 数据之间使用 , 进行分隔

  4. JSON的优点:

    1. 简单易用

      使用键值对的形式表示非常清晰

    2. 跨平台

    3. 轻量级

    4. 易于扩展

    5. 安全性

      JSON是纯文本格式, 不包含可执行代码, 所以恶意代码注入也不会执行


## 3.8 从URL占位符中获取参数-@PathVariable

代码:

    @RequestMapping("/r10/{para1}/{para2}/{para3}")public String r10(@PathVariable Integer para1,@PathVariable String para2,@PathVariable("para3") String userName) {return "r10接收到参数1:" + para1 + " 参数2:" + para2 +" 参数3:" + userName;}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. 需要使用 @PathVariable注解

    字面意思, 就是在路径中的变量

  2. 可以在注解中对于参数进行重新命名, 注解中的名字是作为URL的占位名字.

    @PathVariable(“para3”) String userName中的para3就是重新命的名,所以:

    占位符是para3而不是userName


3. 9 上传文件-@RequestPart

代码:

    @RequestMapping("/r11")public String r11(@RequestPart("file") MultipartFile file) throws IOException {// 获取文件名称String fileName = file.getOriginalFilename();// 上传文件到指定路径file.transferTo(new File("D://" + file.getOriginalFilename()));return "接收到的文件名称为:"+ fileName;}

结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结:

  1. 需要使用 @RequestPart注解
  2. 不能上传过大的文件
    @RequestMapping("/r11")public String r11(@RequestPart("file") MultipartFile file) throws IOException {// 获取文件名称String fileName = file.getOriginalFilename();// 上传文件到指定路径file.transferTo(new File("D://" + file.getOriginalFilename()));return "接收到的文件名称为:"+ fileName;}

结果:

[外链图片转存中…(img-zWR4a7oE-1713446966779)]

[外链图片转存中…(img-g9Q5EwFH-1713446966779)]

总结:

  1. 需要使用 @RequestPart注解
  2. 不能上传过大的文件
  3. 需要在传文件的时候在key里写上对应的名称 (注解规定的那个名称)

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

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

相关文章

Go 单元测试之mock接口测试

文章目录 一、gomock 工具介绍二、安装三、使用3.1 指定三个参数3.2 使用命令为接口生成 mock 实现3.3 使用make 命令封装处理mock 四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩&#xff08;stub&#xff09;参数 六、总结6.1 测试用例定义6.2 设计测试用…

linux环境下创建网口聚合实例

Linux的网口聚合&#xff08;网口绑定、bonding&#xff09;技术是一种通过多个网络接口聚合来提供网络冗余和/或增加网络带宽的方法&#xff0c;为提供网络稳定性、带宽、性能非常有利工具&#xff0c;常见的网口聚合可以支持不同工作模式 mode0 (balance-rr)&#xff1a;轮询…

详细分析Mysql常用函数(附Demo)

目录 前言1. 聚合函数2. 字符串函数3. 日期函数4. 条件函数5. 数值函数6. 类型转换函数 前言 由于实战中经常运用&#xff0c;索性来一个总结文 创建一个名为 employees 的表&#xff0c;包含以下字段&#xff1a; employee_id&#xff1a;员工ID&#xff0c;整数类型 first…

Linux的图形资源及指令

一、火车 1.切换到超级用户 su 2.下载资源 yum install -y sl 3.输入指令 sl&#xff0c;得到火车图形 如果没有得到该图形&#xff0c;就将2处改为yum install -y epel-release。 二、Linux的logo 1.在超级用户模式下下载资源 yum install -y linux_logo 2.输…

Eureka删除失效服务

方式一&#xff1a; curl -X DELETE http://主节点IP:1200/eureka/apps/LY-SM-BPM-EXPANSION-SVC/6dc2f49bca12:ly-sm-bpm-expansion-svc:6932 如果方式一过一会还会出现的话&#xff0c;采用 方式二&#xff1a; curl -X PUT http://主节点IP:1200/eureka/apps/LY-SM-BPM-…

物联网(iot)深度解析——FMEA软件

物联网即IoT&#xff0c;是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器、激光扫描器等各种装置与技术&#xff0c;实时采集任何需要监控、连接、互动的物体或过程&#xff0c;采集其声、光、热、电、力学、化学、生物、位置等各种需要的信息&#xff0c;通过…

C语言——字符函数与字符串函数

正文开始&#xff1a;在编程过程中&#xff0c;我们经常要处理字符和字符串&#xff0c;为了方便操作字符和字符串&#xff0c;C语⾔标准库中提供了 一系列库函数&#xff0c;接下来我们就学习⼀下这些函数。 1. 字符分类函数 C语⾔中有⼀系列的函数是专门做字符分类的&#…

android远程更新下载apk

最近业务有涉及到&#xff0c;奈何是个app代码小白&#xff0c;遂记录一下 一&#xff1a;AndroidManifest.xml文件配置 application标签里面加上 android:networkSecurityConfig"xml/network_config" <!-- app下载更新配置--> <uses-permission andr…

【Qt 学习笔记】Qt常用控件 | 显示类控件Progress Bar的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件Progress Bar的使用及说明 文章编号&#xff…

iOS NSFileManager获取设备硬盘剩余可用容量不准确问题

方法1. 通用 NSFileManager attributesOfFileSystemForPath: error: 方法2. available(iOS 11.0) NSURL resourceValuesForKeys: error: 发现问题&#xff1a;方法1获取到的剩余值并不准确&#xff0c;测得使用剩余值远小于实际的手机存储容量剩余。所以使用方法2优先。下面代…

网络防火墙技术知多少?了解如何保护您的网络安全

在当前以网络为核心的世界中&#xff0c;网络安全成为了至关重要的议题。网络防火墙是一种常见的保护网络安全的技术&#xff0c;用于监控和控制网络流量&#xff0c;阻止未经授权的访问和恶意活动。今天德迅云安全就带您了解下防火墙的一些相关功能和类型。 防火墙的五个功能…

完全卸载清理干净xcode

1、删除主磁盘的&#xff1a;资源库(Library)/ Preferences/com.apple.dt.Xcode.plist 2、删除用户下的&#xff1a;/Users/administrator/Library/Preferences/com.apple.dt.xcodebuild.plist 3、删除用户下的&#xff1a;/Users/administrator/Library/Preferences/com.app…

find和grep查找搜索命令常用的一些使用方式

目录 find和grep查找搜索命令常用的一些使用方式 一、find命令 二、grep命令 find和grep查找搜索命令常用的一些使用方式 一、find命令 我们知道在Windows系统中想要搜索查找文件&#xff0c;一般需要满足两个条件&#xff1a; 1、知道在哪些目录中查找 2、知道查找的内容&…

(助力国赛)数学建模可视化!!!含代码1(折线图、地图(点)、地图(线)、地图(多边形)、地图(密度)、环形图、环形柱状图、局部放大图)

众所周知&#xff0c;数学建模的过程中&#xff0c;将复杂的数据和模型结果通过可视化图形呈现出来&#xff0c;不仅能够帮助我们更深入地理解问题&#xff0c;还能够有效地向评委展示我们的研究成果。   今天&#xff0c;作者将与大家分享8种强大的数学建模可视化图形及其在…

.Net RabbitMQ(消息队列)

文章目录 一.RabbitMQ 介绍以及工作模式1.RabbitMQ的介绍&#xff1a;2.RabbitMQ的工作模式&#xff1a; 二.RabbitMQ安装1.安装Erlang语言环境2.安装RabbitMQ 三.在.Net中使用RabbitMQ1.HelloWorld模式2.工作队列模式3.发布订阅模式4.Routing路由模式和Topics通配符模式 一.Ra…

使用Python工具库SnowNLP对评论数据标注(二)

这一次用pandas处理csv文件 comments.csv import pandas as pd from snownlp import SnowNLPdf pd.read_csv("C:\\Users\\zhour\\Documents\\comments.csv")#{a: [1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}是个字典 emotions[] for txt in df[sentence]:s SnowNLP(…

Kali Linux扩容(使用图形化界面)

因为今天在拉取vulhub中的镜像的时候报错空间不够&#xff0c;因为最开始只给了20GB的空间&#xff0c;所以现在需要扩容了&#xff0c;结合了一下网上的找到了简便的解决方法 1.首先虚拟机设置->磁盘->扩展 小插曲&#xff1a;在对虚拟机磁盘进行扩容以后&#xff0c;…

【数学建模】建筑工地开工问题

题目&#xff1a; 某公司有 6 6 6个建筑工地要开工&#xff0c;每个工地的位置(用平面坐标 ( a , b ) (a,b) (a,b)表示&#xff0c;距离单位: k m km km)及水泥日用量 d ( 单位 : t ) d(单位:t) d(单位:t)由下表给出&#xff0c;目前有两个临时料场位于 P ( 5 , 1 ) &#xff0…

linux启动minicom、u-boot的常用命令、网络命令tftp、nfs/根文件系统、u-boot的bootargs环境变量

linux启动minicom sudo minicom -con进入minicom界面&#xff1a; 打开单片机 在打开之后&#xff0c;我们通过 printenv查看环境配置 在修改配置之前&#xff0c;我们最好先将环境初始化一下&#xff0c;初始化代码为 nand erase.chipu-boot的常用命令 尽管u-boot是一个…

element-ui组件封装技巧

element-ui组件封装技巧 1. 封装内外嵌套的组件 如breadcrumb和breadcrumb-item&#xff0c;这时需要把绑定到breadcrumb上的参数透传给子组件&#xff0c;于是可以 provide() {return {elBreadcrumb: this}; },子组件内&#xff1a; inject: [elBreadcrumb],访问的时候&am…