Spring Boot 中使用 Spring MVC基础

Spring MVC基础

  • 一、控制器 controller
    • 1.定制控制器的方法
      • (1)接收请求
      • (2)接收请求参数
      • (3)返回值
  • 二、模型 Modle
  • 三、视图 View
  • 四、总结


  • Spring MVC 是非常著名的 Web 应用框架,现在的大多数 Web 项目都采用 Spring MVC。它与 Spring 有着紧密的关系。是 Spring 框架中的模块,专注 Web 应用,能够使用 Spring 提供的强大功能,IOC、AOP等。
  • Spring MVC 框架底层是基于 Servlct 技术。遵循 Servlet 规范,Web 组件 Servlet 、Filter、Listener在 Spring MVC 中都能使用。同时 Spring MVC 也是基于 MVC 架构模式的,职责分离,每个组件只负责自己的功能,组件解耦。
  • Spring Boot 的自动配置按约定编程极大简化,提高了 Web 应用的开发效率。

一、控制器 controller

  • 控制器是一种由 Spring 管理的 Bean 对象,赋予角色是“控制器”。作用是处理请求,接收浏览器发送过来的参数,将数据或视图应答给浏览器或者客户端 App等
  • 创建一个控制器对象:创建普通 Java 类,其中定义 public 方法。类上注解 @Controller或者@RestController。
    • @Controller和@RestController注解的区别:

      • @RestController包含了@Controller的功能,同时加入了@ResponseBody的注解。
      • 表示当前控制器类中的方法,都会默认加入@ResponseBody的功能。方法的返回值是数据可以通过 HttpServletResponse 输出给浏览器。
      @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Controller
      @ResponseBody
      public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
      }
      
    • @Controller注解有@Component的功能,控制器类对象是Spring容器管理的。

      @Target({ElementType.TYPE})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      @Component
      public @interface Controller {@AliasFor(annotation = Component.class)String value() default "";
      }
      

1.定制控制器的方法

  • Controller 类中的方法处理对应 URI 的请求,一个(或多个)URI 请求交给一个方法处理。就是一个普通的方法,方法有参数,返回值。方法上面加入@RequestMapping,说明这个 URI 由这个方法处理。
    在这里插入图片描述

(1)接收请求

  • @RequestMapping:用于将 Web 请求映射到控制器类的方法。此方法处理请求。可用作在类上或方法上。在类上和方法上同时使用。重要的属性如下:
    • Value:别名 path 表示请求的 URI,在类和方法上同时使用 value,方法上的继承类上的 value。
    • method:请求方式,支持 GET、POST、HEAD、OPTIONS、PUT、PATCH、DELETE、TRACE。
      • 值为:RequestMethod[] method(),RquestMethod 是 enum 类型。
  • 快捷注解:
    • @GetMapping: 表示 get 请求方式的@RequestMapping
    • @PostMapping:表示 post 请求方式的@RequestMapping
    • @PutMapping:表示 put 请求方式的@RequestMapping
    • @DeleteMapping: 表示 delete 请求方式的@RequestMapping
  • Spring MVC 支持多种策略,匹配请求路径到控制器方法。AntPathMatcher、PathPatternParser。Spring Boot3默认使用的是 PathPatterParser 策略。
  • 可以通过 spring.mvc.pathmatch.matching-strategy 配置项来设置匹配的策略。
  • PathPatternParser 中有关URI的定义:
    • 通配符:
      • ?:一个字符
      • *:0个或多个字符。在一段路径中匹配字符。(不能匹配 /)
      • **:匹配0个或多个路径段。(相当于所有)
      • 正则表达式:支持正则表达式
    • RESTFul 的支持路径变量
      • {变量名}
      • {myname:[a-z]+}:正则匹配 a-z 的多个字符,路径变量名称”myname“。结合@PathVariable(“myname”)使用。
      • {*myname}:匹配多个路径一直到 URI 结尾。
        在这里插入图片描述
        • 注意:@GetMapping(“/user/{*id}/{*data}”)是无效的,{*XXX}后面不能再有匹配规则了。
      • 当不使用通配符的时候,那么就是一个URI对应一个请求,实际项目中一般都是这样的。
        在这里插入图片描述

(2)接收请求参数

  • 用户在浏览器中点击按钮,会发送一个请求给服务器,其中包含让服务器程序需要做什么的参数。这些参数发送给控制器方法。控制器方法的形参列表接收请求参数。
  • 解析参数需要的值,SpringMVC 中专门有一个接口来干这个事,这个接口就是:(处理器方法参数解析器)HandlerMethodArgumentResolver,就是解析请求得到 Controller 方法的参数的值。
  • 控制器方法参数类型看官方文档 ====> https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/arguments.html
  • 常见的接收请求参数的方法:
    • ① 请求参数与形参一一对应,适用于简单类型。比如 String、int、double等。适用于参数个数比较少的情况。

      • 前端传递过来的参数都是字符串类型的。类型的转化是由 SpringMVC 框架来完成的,如果类型转化失败会报错的。
        在这里插入图片描述
    • ② 对象类型,控制器方法参数是对象,请求的多个参数名与属性名相对应。
      在这里插入图片描述

    • ③ @RequestParam 注解,把请求中的指定名称的参数传递给控制器中的形参赋值。(将查询参数,form 表单数据解析到方法参数,解析 multipart 文件上传)。

      • @RequestParam 注解的 value 属性值没有对应的参数值则会直接报 400 错误,因为 required 属性默认为 true ,如果加上 required=false ,没对应上则不会报错,而是获取值为 null 。
      // @RequestParam 注解源码
      @Target({ElementType.PARAMETER})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface RequestParam {@AliasFor("name")String value() default "";  //请求参数中的名称@AliasFor("value")String name() default "";boolean required() default true;  //请求参数中是否必须提供此参数String defaultValue() default "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
      }
      

      在这里插入图片描述

    • ④ HttpServletRequest 使用 request 对象就收参数,request.getParameter(“XXX”)获取对应的值,原始的 JavaWeb 中的方式。
      在这里插入图片描述

    • ⑤ RequestBody注解,接收前端传递的Json格式参数。(接收请求体中的 json 数据)。
      在这里插入图片描述

    • ⑥ @RequestHeader,从请求 header 中获取某些值。
      在这里插入图片描述

    • ⑦ 数组参数接收多个值。
      在这里插入图片描述

(3)返回值

  • ① 不使用 @ResponseBody的 String 返回值,返回的是一个页面视图。
    在这里插入图片描述
  • ② 使用 @ResponseBody的 String 返回值,返回的是一个字符串。
    在这里插入图片描述
  • ③ ModelAndView 返回值,返回的是一个视图其中包含数据。(最后数据都是放到 Request 中的)
    在这里插入图片描述
  • ④ 返回自定义的对像,默认的返回格式是json字符串(有jackson工具)
    在这里插入图片描述
  • ⑤ 返回 Map,默认的返回格式是json字符串(有jackson工具)
    在这里插入图片描述
  • ⑥ ResponseEntity:包含数据和自定义的HttpStatus Code。(默认转为json格式的字符串)
    在这里插入图片描述

二、模型 Modle

  • 在许多实际项目需求中,后台要从控制层直接返回前端所需要的数据,这时 Model 大家族就派上用场了。
  • Model Spring MVC 中的 ”M“,是用来传输数据的。从控制层直接返回数据给前端。内置的 JSP,模板技术能够展现 Model 中存储的数据。
  • Model 可以是承载数据的,也可以是处理具体业务的类,这些都是指 Spring MVC 中的Model。

三、视图 View

  • Spring MVC 中的 View(视图)用于展示数据的,视图技术的使用是可插拔的。无论选择使用 thymleaf、jsp 还是其他技术,classpath 有 jar 就能使用视图了。开发者主要就是更改配置。SpringBoot3 不推荐使用 FreeMarker、JSP 这些了。建议使用 Thymeleaf。
  • org.springframework.web.servlet.View 视图的接口,实现此类的都是视图类,视图类作为 Bean 被 Spring 管理。当然这些都不需要开发者编写代码。
  • Spring MVC 的 View(视图)与控制器方法的返回值有关。
  • @ResponseBody,@RestController 适合前后端分离项目
    • String:表示返回一个字符串。
    • Object//map:如果有 Jackson 库,将其转为 Json 字符串。
  • spring.thymeleaf.prefix = classpath:/templates/ =====> thymeleaf 页面视图默认存放的位置。
  • spring.thtmeleaf.suffix = .html ===⇒ thymeleaf 页面视图默认的后缀名。

四、总结

  • SpringMVC 处理请求都是围绕着控制器的方法的。
    • public 方法。
    • 方法名称自定义。
    • 方法的形参表示接收的请求参数。
      • 逐一按名称对应接收参数。String name, Integer age。
      • 使用自定义对象,接收多个参数。User(name ,age, sex)。
      • 接收json,使用@RequestBody注解,加上自定义对象。(也可以接收请求体中的json数据)
      • 使用Reader、InputStream作为参数,读取Post请求体中的内容。
      • 使用HttpServletRequest作为参数,调用getParameter()方法接收参数。
      • 数组参数Integer[] id。
      • @RequestParam
      • @RequestHeader
    • 控制器方法的返回值,表示给请求方的相应。响应内容。
      • String,表示视图页面(xxxx.html …),没有使用@ResonseBody。
      • ModelAndView:是数据和视图的结合体,包含了数据和视图。
      • 自定义对象:默认将自定义对象转为json格式,输出给浏览器。
      • ResponseEntity:包含数据和自定义的HttpStatus Code。
      • Map:默认将key和Value转为json字符串。

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

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

相关文章

【C++】类和对象之构造函数、析构函数、拷贝构造函数(二)

前言:在上一篇我们对于C中类和对象有了一个初步的了解,今天我们将进一步的学习,今天我们目标是对构造函数、析构函数、拷贝构造函数进行一个初步学习在后面也会进一步的学习,一起加油呐! 💖 博主CSDN主页:卫…

幻兽帕鲁服务器多少钱——幻兽帕鲁服务器价格介绍

2024年幻兽帕鲁服务器价格表更新,阿里云、腾讯云和华为云Palworld服务器报价大全,4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元,阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表,多配置报价: 幻兽帕鲁…

Windows Service 2008虚拟机安装mysql service 5.7并实现远程连接

安装前必读 mysql好像在5.7.20版本之后的绿色压缩包版解压都没有my.ini或者my-default.ini配置文件了,需要自己添加配置。 也没有data数据库文件夹,data文件夹不能自己新建,需要命令initialize初始化建立。 my-default.ini文件存不存在不重要…

JavaWeb学习|Session

学习材料声明 所有知识点都来自互联网,进行总结和梳理,侵权必删。 引用来源:尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版 Session 1、Session 就一个接口(HttpSession)。 2、Session 就是会话。它是用来…

[ESP32]在Thonny IDE中,如何將MicroPython firmware燒錄到ESP32開發板中?

[ESP32 I MicroPython] Flash Firmware by Thonny(4.1.4) IDE 正常安裝流程,可參考上述影片。然而,本篇文章主要是紀錄安裝過程遇到的bug, 供未來查詢用,也一併供有需要的同好參考。 問題:安裝後,Thonny互動介面顯示一堆亂碼和co…

【lesson26】学习MySQL事务前的基础知识

文章目录 CURD不加控制,会有什么问题?CURD满足什么属性,能解决上述问题?什么是事务?为什么会出现事务事务的版本支持 CURD不加控制,会有什么问题? CURD满足什么属性,能解决上述问题&…

文本生成高清、连贯视频,谷歌推出时空扩散模型

谷歌研究人员推出了创新性文本生成视频模型——Lumiere。 与传统模型不同的是,Lumiere采用了一种时空扩散(Space-time)U-Net架构,可以在单次推理中生成整个视频的所有时间段,能明显增强生成视频的动作连贯性&#xff…

挑选合适的板式家具生产线:满足加工需求的要素解析

板式家具生产线是现代家具制造业中不可或缺的重要工具。然而,选择一条适合自身加工需求的板式家具生产线并不容易,需要考虑多方面因素。本文将深入探讨如何挑选合适的板式家具生产线,从而让读者更好地理解生产线的特点和选择要点。 一、需求分…

nginx+nginx-rtmp-module+ffmpeg进行局域网推流rtmp\m3u8

局域网推流的简单方式 这里以ubuntu为例 一、先下载安装包 nginx、nginx-rtmp-module,再一起安装 # 下载nginx # 这里我安装的是 nginx-1.10.3 版本 cd /usr/software wget http://nginx.org/download/nginx-1.25.0.tar.gz tar -zxvf nginx-1.25.0.tar.gz# 下载ng…

Prometheus---图形化界面grafana(二进制)

前言 Prometheus是一个开源的监控以及报警系统。整合zabbix的功能,系统,网络,设备。 proetheus可以兼容网络,设备。容器的监控。告警系统。因为他和k8s是一个项目基金开发的产品,天生匹配k8s的原生系统。容器化和云原…

详解OpenHarmony各部分文件在XR806上的编译顺序

大家好,今天我们来谈一谈编程时一个很有趣的话题——编译顺序。我知道,一提到编译可能大家会感到有点儿头疼,但请放心,我不会让大家头疼的。我们要明白,在开始写代码之前,了解整个程序的编译路径是十分有必…

Linux进程间通信(IPC)机制之一:共享内存

🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:Nonsense—Sabrina Carpenter 0:50━━━━━━️💟──────── 2:43 🔄 ◀️ ⏸ ▶️ …

智能小程序事件系统——SJS响应事件实现方案

背景信息 如有频繁用户交互,在小程序上表现是比较卡顿的。例如,页面有 2 个元素 A 和 B,用户在 A 上做 touchmove 手势,要求 B 也跟随移动,movable-view 就是一个典型的例子。一次 touchmove 事件的响应过程为&#x…

可以举一反三的动态规划问题(最短编辑问题)

给定两个字符串 A 和 B,现在要将 A经过若干操作变为 B,可进行的操作有: 删除–将字符串 A 中的某个字符删除。插入–在字符串 A 的某个位置插入某个字符。替换–将字符串 A 中的某个字符替换为另一个字符。 现在请你求出,将 A 变…

第9章 安全漏洞、威胁和对策(9.1-9.2)

9.1 共担责任(shared responsibility) 共担责任是安全设计的原则,表明任何机构都不是孤立运行的。 相反,它们与世界有着千丝万缕的联系。我们使用相同的基本技术,遵循相同的通信协议规范,在同一个互联网上漫游,共用操…

Shell脚本——免交互

目录 一、Here Document免交互 1、免交互概述 2、语法格式 2.1示例:免交互方式实现对行数的统计,将要统计的内容置于标记EOF之间,直接将内容传给wc-l来统计 3、变量设定 ①变量图换成实际值 ②整行内容作为变量并输出结果 ③使输出内…

基于深度学习的鸟类识别系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 卷积神经网络基础 4.2 GoogLeNet模型 4.3 鸟类识别系统 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ............................…

STM32 IIC电量计LTC2944

1 描述 LTC2944 可在便携式产品应用中测量电池充电状态、电池电压、电池电流及其自身温度。宽输入电压范围允许使用高达 60V 的多节电池。精密库仑反向积分电流通过电池正极端子与负载或充电器之间的检测电阻器。 电压、电流和温度由内部 14 位无延迟 ΔΣ™ ADC 测量。测量结…

Linux:理解信号量以及内核中的三种通信方式

文章目录 共享内存的通信速度消息队列msggetmsgsndmsgrcvmsgctl 信号量semgetsemctl 内核看待ipc资源单独设计的模块ipc资源的维护 理解信号量总结 本篇主要是基于共享内存,延伸出对于消息队列和信号量,再从内核的角度去看这三个模块实现进程间通信 共享…

【教学类-44-04】20240130 print dashed(虚线字体)制作的数字描字帖

作品展示:背景需求: 制作绿色数字的数字描字帖 选用字体:print dashed(虚线字体) 【教学类-44-03】20240111阿拉伯数字字帖的字体(三)——德彪钢笔行书(实线字体)和pri…