Spring Boot 中使用 Spring MVC基础

news2024/11/24 17:21:25

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.coloradmin.cn/o/1421904.html

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

相关文章

无需 Root 卸载手机预装软件,精简过的老年机又行了

基础准备 准备目标手机、USB 数据线、以及一台电脑。手机 USB 连接电脑,开发者选项中打开 USB 调试。(开发者选项默认隐藏,需要在关于手机中多次点击版本号才能调出)。 安装手机驱动,下载安装 ADB 工具包。 开始操作…

Excel得到JSON串

很多时候业务都需要做一种从Excel读取或者导入数据的功能,这在cs程序比较简单,在BS程序上如果封装不好的话那么写起来还是很费劲的,这次封装Excel读取操作。 先看使用 对,你没有看错,就是这么简单。 封装 基础设计…

TensorFlow2实战-系列教程11:RNN文本分类3

🧡💛💚TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 6、构建训练数据 所有的输入样本必须都是相同shape(文本长度,…

Prometheus基于pod部署

1、kube-api的自动发现:Prometheus的容器化部署(生产中都是pod部署) 2、部署export (1)创建目录 (2)创建命名空间 (3)部署node-export ①9100端口被占用,停…

useEffect的第二个参数

目录 1、第一个参数: 2、第二个参数: 2.1 不传值:无限循环 2.2 空数组作为依赖:执行一次 2.3 基本类型作为依赖:无限循环 2.4 引用类型 2.4.1 数组作为依赖:无限循环 2.4.2 函数作为依赖&#…

添加了gateway之后远程调用失败

前端提示500,后端提示[400 ] during [GET] to [http://userservice/user/1] 原因是这个,因为在请求地址写了两个参数,实际上只传了一个参数 解决方案:加上(required false)并重启所有相关服务

Redis(十)SpringBoot集成Redis

文章目录 连接单机mvnYMLController.javaRedisConfig.java 连接集群YML问题复现 RedisTemplate方式 连接单机 mvn <!--Redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</art…

Qt应用开发(安卓篇)——调用ioctl、socket等C函数

一、前言 在 Qt for Android 中没办法像在嵌入式linux中一样直接使用 ioctl 等底层函数&#xff0c;这是因为因为 Android 平台的安全性和权限限制。 在 Android 中&#xff0c;访问设备硬件和系统资源需要特定的权限&#xff0c;并且需要通过 Android 系统提供的 API 来进行。…

Java链表(2)

&#x1f435;本篇文章将对双向链表进行讲解&#xff0c;模拟实现双向链表的常用方法 一、什么是双向链表 双向链表在指针域上相较于单链表&#xff0c;每一个节点多了一个指向前驱节点的引用prev以及多了指向最后一个节点的引用last&#xff1a; 二、双向链表的模拟实现 首先…

深度学习:机器智能的革命性突破与未来挑战

深度学习&#xff1a;机器智能的革命性突破与未来挑战 深度学习是人工智能领域的一个重要分支&#xff0c;它利用神经网络模拟人类大脑的学习过程&#xff0c;通过大量数据训练模型&#xff0c;使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来&#xff0c;深度学…

忍不了,客户让我在一个接口里兼容多种业务逻辑

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 老猫的设计模式专栏已经偷偷发车了。 不甘愿做crud boy&#xff1f;看了好几遍的设计模式还记不住&#xff1f;那就不要刻意记了&#xff0c;跟上老猫的步伐&#xff0c;在一个个有趣的职场故事中领悟设计…

一文掌握SpringBoot注解之@Component 知识文集(8)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

山体滑坡在线安全监测预警系统(解决方案)

在近年来&#xff0c;随着全球气候变化的影响&#xff0c;山体滑坡等自然灾害频发&#xff0c;给人们的生命财产安全带来了严重威胁。为了有效预防和减少山体滑坡带来的危害&#xff0c;许多地方开始在山上安装山体滑坡在线安全监测预警系统&#xff08;解决方案&#xff09;。…

【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及的知识点 图论 深度优先搜索 状态压缩 树 LeetCode1617. 统计子树中城市之间最大距离 给你 n 个城市&#xff0c;编号为从 1 到 n 。同时给你一个大小为 n-1 的数组 edges &#xff0c;其中 edges[i] …

在 Linux 中挂载新硬盘动态使用

目录 一&#xff1a;添加硬盘并且格式化 二&#xff1a;创建逻辑卷 三&#xff1a;挂载卷到目录 在 Linux 中挂载新硬盘并进行格式化的操作可以按照以下步骤进行&#xff1a; 一&#xff1a;添加硬盘并且格式化 查看现有分区状态和服务器安装的硬盘状态&#xff1a; df -…

开源项目TARZAN-NAV | 基于springboot的现代化导航网站系统

TARZAN-NAV 导航网站 一个基于 Spring Boot、MyBatis-Plus、h2database、ehcache、Docker、websocket等技术栈实现的导航网站系统&#xff0c;采用主流的互联网技术架构、全新的UI设计、支持一键源码部署&#xff0c;拥有完整的仪表板、导航管理&#xff0c;用户管理、评论管理…

操作筛选器的 1 个应用实例:自动启用事务

前言 在数据库操作过程中&#xff0c;有一个概念是绕不开的&#xff0c;那就是事务。 事务能够确保一系列数据库操作要么全部成功提交&#xff0c;要么全部失败回滚&#xff0c;保证数据的一致性和完整性。 在 Asp.Net Core Web API 中&#xff0c;我们可以使用操作筛选器给…

uni-app小程序自定义导航栏

最近在开发一个uni-app小程序&#xff0c;用到了自定义导航栏&#xff0c;在这里记录一下实现过程&#xff1a; page.json 在对应页面路由的style中设置入"navigationStyle": "custom"取消原生导航栏&#xff0c;自定义导航栏 {"path": "…

C++ //练习 3.8 分别用while循环和传统的for循环重写第一题的程序,你觉得哪种形式更好呢?为什么?

C Primer&#xff08;第5版&#xff09; 练习 3.8 练习 3.8 分别用while循环和传统的for循环重写第一题的程序&#xff0c;你觉得哪种形式更好呢&#xff1f;为什么? 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********…

[晓理紫]每日论文分享(有源码或项目地址、中文摘要)--强化学习、模仿学习、机器人

专属领域论文订阅 VX 关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为300名读者提供订阅主题论文服务,只需VX关注公号并回复{邮箱+论文主题}(…