【Spring实战——构建Spring Web应用程序】1.9接受请求的输入

news2024/11/26 10:23:11

程序员小猿开发交流,希望一起共同进步。

  1. 有些Web应用是只读的。人们只能通过浏览器在站点上闲逛,阅读服务器发送到浏览器中的内容。
  2. 这并不是一成不变。众多的Web应用允许用户参与进去,将数据发送回服务器。如果没有这项能力的话,那Web将完全是另一番景象。
  3. Spring MVC允许以多种方式将客户端中的数据传送到控制器的处理器方法中,包括: file
  4. 你将会看到如何编写控制器处理这些不同机制的输入。
  5. 作为开始,我 们先看一下如何处理带有查询参数的请求,这也是客户端往服务器端 发送数据时,最简单和最直接的方式。

    5.3.1 处理查询参数

    分页的Spittle列表

背景

file

现状

目前的SpittleController只能展示最新的Spittle,无法向前翻页查看之前的Spittle历史记录。 为了让用户能够查看某一页的Spittle历史记录,需要提供一种方式让用户传递参数,以确定要展示哪些Spittle集合。
实现分页功能的方法 file 为了实现这个功能,我们将程序清单5. 10中的spittles ()方法替换 为使用before和count参数的新spittles ()方法。 测试 我们首先添加 一个测试,这个测试反映了新spittles ()方法的功能。 第一个测试,传入max和count
程序清单5.11 用来测试分页Spittle 列表的新方法 file 这个测试方法与程序清单5.9中的测试方法关键区别在于它针对“/spittles”发送GET请求,同时还传入了max和count参数。它测试了这些参数存在时的处理器方法.
而另一个测试方法则测试了没有这些参数时的情景。这两个测试就绪后,我们就能确保不管控制器发生什么样的变化,它都能够处理这两种类型的请求。 第二个测试,对无参数和没有参数情况 file 在SpittleController中的处理器方法需要同时处理有参数和没有参数的情况。因此,我们需要对其进行修改,使其能够接受参数。 第三个测试,请求参数不存在设置默认值
同时,如果这些参数在请求中不存在,我们将使用默认值Long.MAX_VALUE和20。为了实现这一目标,我们可以使用@RequestParam注解的defaultValue属性。 file 如果没有指定max参数,它将默认为Long类型的最大值。由于查询参数都是String类型的,所以defaultValue属性需要一个String类型的值。 因此,我们可以将Long.MAX_VALUE转换为一个名为MAX_LONG_AS_STRING的String类型常量。 file 尽管defaultValue属性给定的是String类型的值,但是当绑定到方法的max参数时,它会转换为Long类型。 如果请求中没有count参数的话,count参数的默认值将会设置为20。 请求中的查询参数是往控制器中传递信息的常用手段。另外一种方式也很流行,尤其是在构建面向资源的控制器时,这种方式就是将传递参数作为请求路径的一部分。 让我们看一下如何将路径变量作为请求路径的一部分,从而实现信息的输入。

5.3.2 通过路径参数接受输入

假设我们的应用程序需要根据给定的ID来展现某一个Spittle记录。

方案一:编写处理器方法,使用@RequestParam注解

让它接受ID作为查询参数: file 处理器请求方式: 如"/spittles/show?spittle_id=12345"
优点:虽然这种方式可以正常工作,但从面向资源的角度来看,并不理想。
面向资源的理想情况:理想情况,要识别的资源(Spittle)应该通过URL路径进行进行标识,而不是通过查询参数。
URL路径:"/spittles/12345" 或"/spittles/show?spittle_id=12345"
URL路径标识资源的优势:通过URL路径来标识资源能更好地识别要查询的资源。
查询参数的方式:带有参数的操作,本质是通过HTTP发起的RPC。
将需求转换为测试:既然已经以面向资源的控制器作为目标,我们可以将这个需求转换为一个测试。
程序清单5.12展示了一个新的测试方法,它会断言SpittleController中对面向资源请求的处理。 程序清单5.12 测试对某个Spittle 的请求,其中ID要在路径变量中 指定 file

测试结果:因为没有为这个请求实现处理器方法,所以请求会失败。

方案二:使用@RequestMapping占位符

但是,我们可以通过为SpittleController添加新的方法来修正这个失败的测试。 对代码进行改造。

  1. 路径变量的实现:到目前为止,我们编写的控制器中的所有方法都映射到静态定义好的路径上(通过@RequestMapping)。但是,为了使测试通过,我们需要在@RequestMapping路径中包含变量部分,这部分代表了Spittle的ID。
  2. 占位符的使用:为了实现路径变量,Spring MVC允许在@RequestMapping路径中添加占位符,占位符的名称要用大括号("{"和"}")括起来。路径中的其他部分要与所处理的请求完全匹配,但是占位符部分可以是任意的值。 file 下面的处理器方法使用了占位符,将Spittle ID作为路径的一部 分: file 通过程序清单5.12中的路径,可以看到控制器可以处理针对“/spittles/12345”的请求。

    方案三:使用@PathVariable注解

file 功能:添加@PathVariable注解,无论占位符是什么,都会传递到处理器方法中的spittleId参数中。 示例说明:例如,如果向"/spittles/54321"发送GET请求,将把"54321"作为spittleId的值传递进来。 参数名与占位符的对应:由于方法的参数名与占位符的名称相同,因此可以省略@PathVariable中的value属性。 file

  1. @PathVariable注解的默认行为:如果在@PathVariable注解中没有指定value属性,它会假设占位符的名称与方法的参数名相同。这样可以使代码更简洁,因为不需要重复写占位符的名称。
  2. 重命名参数的注意事项:但需要注意的是,如果想要重命名参数,必须同时修改占位符的名称,使它们匹配。
  3. spittle()方法的功能: file

这个视图并没有什么特别之处,它的屏幕截图如图5.4所示。

图5 .4 在浏览器中展现一个spittle 如果传递请求中少量的数据,那查询参数和路径变量是很合适的。但 通常我们还需要传递很多的数据 (也许是表单提交的数据) ,那查询 参数显得有些笨拙和受限了。下面让我们来看一下如何编写控制器方 法来处理表单提交。

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

利用CloudCompare进行点云过滤去噪(统计滤波)

使用的数据为苹果树点云,原数据共3,459,230个点,大小为105 MB,文件格式为ply。 按如下操作进行统计滤波: 由于树点云较密,所以邻近点设置了邻近点为50,执行后,结果点数变为3,139,034。 效果图…

测试老鸟整理,Postman加密接口测试-Rsa/Aes对参数加密(详细总结)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 一些问题 postma…

「Verilog学习笔记」位拆分与运算

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 1、寄存器的位是可以分开单独运算的,并不是一个输入就一定是一个数据,在很多情况下,一个输入既包括数据又包括地址等其他有效信息 2、需…

Android 分享图片和文案

一、业务描述 大多数App的需求中,有分享功能,点击唤起系统的分享栏,然后分享内容,例如指定文案,链接,图片等等。 二、实现逻辑 1.拿到要分享图片和内容 2.图片拿到缓存里,用于分享 3.使用F…

Tomcat 9.0.x 源码编译

文章目录 一、克隆源码二、构建 Maven1)在项目根目录中新建 pom.xml 文件2)然后 Add Maven Projects 三、在目录中增加 home 目录四、增加启动配置五、其它问题1)控制台乱码解决 2)启动后访问 localhost:8080 报错解决 一、克隆源…

SpringBoot + 微信支付 --- 内网穿透ngrok(安装、使用) 及 支付通知-->接收支付通知和返回应答

目录 Native 下单1、内网穿透 ngrok1-1:注册下载2-2:使用方式3-3:测试 2、支付通知--接收支付通知和返回应答完整需求介绍:2-1、需求1:应答测试2-2、应答的代码:2-3、结果:测试:应答…

vscode配置环境变量

首先点击下面这个链接。 sMinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 然后选择Files这个选项 向下移选择下载这个文件 解压完成之后,找到这个文件的bin目录复制路径后,添加到环境变量中 依次点击后打开cmd&#xff0…

高性能三防工业平板电脑 防摔防爆电容屏工控平板

HT1000是一款高性能工业三防平板,10.1英寸超清大屏,厚度仅14.9mm,超薄机身,可轻松插入袋中,方便携带,搭载8核2.0GHz高性能CPU,行业领先的Android 11.0,设备性能大幅提升,…

通过使用Amazon Neptune来预测电影类型初体验

文章目录 福利来袭Amazon Neptune什么是图数据库为什么要使用图数据库什么是Amazon NeptuneNeptune 的特点 快速入门环境搭建notebook 图神经网络快速构建加载数据配置端点Gremlin 查询清理 删除环境S3 存储桶删除 福利来袭 前几天有小伙伴在群里灵魂发问:双11到来…

245:vue+openlayers 利用canvas绘制边线纹路

第245个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayers项目中利用canvas绘制边线纹路。思路就是将stroke渲染通过canvas设定的pattern模式。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共170行)专…

大语言模型研究进展综述

1、历史 自20世纪50年代图灵测试被提出以来,研究人员一直在探索和开发能够理解并掌握语言的人工智能技术。 作为重要的研究方向之一,语言模型得到了学术界的广泛研究,从早期的统计语言模型和神经语言模型开始,发展到基于Transform…

EasyHttp框架的使用

项目的集成 // JitPack 远程仓库:https://jitpack.io maven { url https://jitpack.io } // 网络请求框架:https://github.com/getActivity/EasyHttp implementation com.github.getActivity:EasyHttp:12.5 // OkHttp 框架:https://github.c…

ssm+vue的疫情高校师生外出请假管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频: ssmvue的疫情高校师生外出请假管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller)三…

2023版Pycharm关闭一直显示closing project,正在关闭项目

点击 帮助 下的 查找操作 英文版为 Help 下的 Find Action 输入 Registry 禁用 ide.await.scope.completion 即可 PS:按 Ctrl F 输入可以快速检索

快速实现一个企业级域名 SSL 证书有效期监控巡检系统

Why 现在对于企业来说,HTTPS 已经不是可选项,已经成为一个必选项。HTTPS 协议采用 SSL 协议,采用公开密钥的技术,提供了一套 TCP/IP 传输层数据加密的机制。SSL 证书是一种遵守 SSL 协议的服务器数字证书,一般是由权威…

《golang设计模式》第三部分·行为型模式-04-迭代器模式(Iterator)

文章目录 1. 概念1.1 角色1.2 类图 2. 代码示例2.1 需求2.2 代码2.3 类图 1. 概念 迭代器(Iterator)能够在不暴露聚合体内部表示的情况下,向客户端提供遍历聚合元素的方法。 1.1 角色 InterfaceAggregate(抽象聚合)…

图像切分:将一张长图片切分为指定长宽的多张图片

1.需求 比如有一张很长的图片其大小为宽度779,高度为122552,那我想把图片切分为779乘以1280的格式。 步骤如下: 使用图像处理库(如PIL或OpenCV)加载原始图片。确定子图片的宽度和高度。计算原始图片的宽度和高度&am…

6、Python控制流:if语句、for循环、while循环、循环控制语句

文章目录 Python控制流:if语句、for循环、while循环、循环控制语句if语句示例:for循环示例:while循环示例:循环控制语句示例:最佳实践Python控制流:if语句、for循环、while循环、循环控制语句 控制流是编程中的基础概念,它允许我们根据不同的条件执行不同的代码块,或者…

day3作业

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <io…

哈尔滨招聘网站哪个好

哈尔滨招聘网站 吉鹿力招聘网 比较好&#xff0c;我们都知道在现代社会中&#xff0c;互联网已经成为了人们获取信息的主要渠道之一。在寻找工作方面也不例外。吉鹿力招聘网是哈尔滨找工作的求职招聘网站。 登录 吉鹿力招聘网 “注册账号”&#xff0c;然后输入个人基本信息&a…