【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里写上对应的名称 (注解规定的那个名称)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop——Yarn基础架构

Hadoop——Yarn基础架构 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Apache Hadoop生态系统中的一个子项目&#xff0c;它是用于集群资源管理的框架&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&…

Mac 利用Homebrew安装JDK

一、安装JDK17 1.安装openjdk17 2.把homebrew安装的openjdk17软链接到系统目录&#xff1a; brew install openjdk17 sudo ln -sfn $(brew --prefix)/opt/openjdk17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk 一、检查是否安装成功 在Termina…

基于SSM的列车订票管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的列车订票管理系统3拥有两种角色&#xff1b;管理员、用户 管理员&#xff1a;用户管理、车票管理、购票指南管理、系统管理等 用户&#xff1a;发布帖子、登录注册、购票等 1.…

Spring Boot 整合 Mockito:提升Java单元测试的高效实践

引言 在Java开发领域&#xff0c;Spring Boot因其便捷的配置和强大的功能而受到广泛欢迎&#xff0c;而Mockito作为一款成熟的单元测试模拟框架&#xff0c;则在提高测试质量、确保代码模块间解耦方面扮演着至关重要的角色。本文将详细介绍如何在Spring Boot项目中整合Mockito&…

千锤百炼算法系列之动态规划

题外话 这段时间,我必须把算法弄明白 这篇直接讲解动态规划所有细节! 前面那篇 千锤百炼之每日算法(一)-CSDN博客 也有关于动态规划的讲解,也非常详细 很简单,我成尊不就是了?!!! 正题 动态规划 这里我们主要是让大家明白什么是动态规划,怎么用动态规划解题 我就不用…

手动给docusaurus添加一个搜索

新版博客用docusaurus重构已经有些日子了&#xff0c;根据docusaurus的文档上也申请了Algolia,想一劳永逸的解决博客的搜索问题。但是流水有意&#xff0c;落花无情。 algolia总是不给我回复&#xff0c;我只能对着algolia的申请页面仰天长叹。 正常情况的申请 按照docusaur…

社区论坛小圈子小程序源码系统:自定义小程序管理社区圈子软件圈子系统系统开发-做社区圈子丨圈子论坛社区交友系统开源版小程序源码丨

简述 移动互联网的快速发展&#xff0c;微信小程序作为一种新型的应用形态&#xff0c;已经深入到人们的生活中。特别是对于社区论坛类应用&#xff0c;小程序版本可以更好地满足用户快速、便捷获取信息的需求。下面给大家分享一款社区论坛小圈子小程序源码系统。 在这个信息…

跨境电商MercadoLibre(美客多)平台预约号操作流程自动化系统

目录 一、前置配置准备 1. 安装Chrome插件 2. 添加预约配置 二、开始使用 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#xff0c;它可以帮助…

2024华中杯数学建模挑战赛选题建议及各题思路来啦!

大家好呀&#xff0c;华中杯数学建模开始了&#xff0c;来说一下初步的选题建议吧&#xff1a; 首先定下主基调&#xff0c; 本次华中杯推荐选择C题目。难度方面A&#xff1e;B&#xff1e;C&#xff0c;A是优化类题目&#xff0c;难度较高&#xff0c;建议参考23国赛A优秀论…

STM32G431RBT6移植FreeRTOS

引言&#xff1a; 本文专门为参加了蓝桥杯嵌入式赛道的同学准备&#xff0c; 大家可能会有这样一个问题&#xff0c; 比完赛之后&#xff0c; 对于像继续使用STM32G431RBT6学习FreeRTOS的&#xff0c; 发现网上的教程使用的板子基本上都是F1和F4的&#xff0c; 其实呢&#xff…

《八》QSplitter拆分器以及QDockWidget窗口详解

QSplitter简介 QSplitter拆分器允许用户通过拖动子部件之间的边界来控制它们的大小。 单个拆分器可以控制任意数量的小部件。QSplitter的典型用法是创建几个小部件&#xff0c;并使用insertWidget()或addWidget()添加它们。 常用方法 默认情况下&#xff0c;QSplitter会动态…

甘特图是什么?如何利用其优化项目管理流程?

甘特图是项目管理软件中十分常见的功能&#xff0c;可以说每一个项目经理都要学会使用甘特图才能更好的交付项目。什么是甘特图&#xff1f;甘特图用来做什么&#xff1f;简单来说一种将项目任务与时间关系直观表示的图表&#xff0c;直观地展示了任务进度和持续时间。 一、甘特…

【k8s】:kubectl 命令设置简写启用自动补全功能

【k8s】&#xff1a;kubectl 命令设置简写&启用自动补全功能 1、设置kubectl命令简写2、启用kubectl自动补全功能 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#…

【话题】程序员如何搞副业,简单探讨下

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景前提条件打造私域广结朋友平台 技能转化为价值1. 副业途径2. 如何开展3. 未来趋势与建议4. 挑战与策略5. 规划与发展 文章推荐 背景 程序员不仅拥有将抽象概念转化…

极海APM32F003F6U7通过AEC-Q100车规级可靠性认证

行车安全是汽车行业考虑的第一要义&#xff0c;因此汽车电子MCU的可靠性尤为重要&#xff0c;极海APM32F003F6U7车规级MCU遵循AEC-Q100质量标准&#xff0c;确保汽车电子元器件在极端环境下的可靠性和稳定性&#xff0c;并顺利通过了AEC-Q100车规级可靠性认证。 关于AEC-Q100 …

Vitis HLS 学习笔记--ap_int.h / ap_fixed.h(2)-深度探究

目录 1. 前文回顾 1.1 简单背后的复杂 1.2 复杂性的来源 2. 关键代码 2.1 功能概述 2.2 关系梳理 2.3 理解构造函数二 2.4 理解HLS_CONSTEXPR 2.5 理解const volatile 3. 探究ap_int<8> c&#xff1b;经历了什么 4. 在调试中查看 1. 前文回顾 在《Vitis HLS…

基于springboot实现厨艺交流平台系统项目【项目源码+论文说明】

基于SpringBoot实现厨艺交流平台系统演示 摘要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时…

[算法] 动态规划

对这个算法的原有印象就是非常难理解&#xff0c;而且怎么都感觉这个算法名称有些误导&#xff1b;或者是要引申着看&#xff1f;因为里面的动态是怎么个动态&#xff1f; 这里的动态是指每一次的计算结果会影响下一次&#xff0c;或者再次的运算效率&#xff0c;也就是说下一次…

瀑布流组件(vue2)

文档连接&#xff1a;clz 加载状态、行数 可以自行控制&#xff0c;目前只支持vue2 实现效果&#xff1a;

华为手机无法弹出wifi上网认证页面处理

华为手机无法弹出wifi上网认证页面 连wifi后跳到上图界面卡住&#xff0c;不跳转到单位的上网认证界面。 打开手机的设置应用&#xff0c;点击上面的WLAN选项。 点击上面的更多WLAN设置选项。 关闭WLAN安全检测就可以正常弹出上网认证界面&#xff0c; 正常弹出上网认证界面&a…