【SpringMVC】参数传递与用户请求和响应
目录
一、Postman 工具使用
1.1 Postman安装
1.2 Postman的使用
1.2.1 创建WorkSpace工作空间
1.2.2 创建请求
二、参数传递
2.1 添加 Slf4j 依赖
2.2 普通传参
知识点1:@RequestMapping
知识点2:@RequestParam
2.3 路径传参
知识点3:@PathVariable
2.4 Json数据传参
知识点4:@RequestBody
三、响应
3.1 响应Json数据
3.2 跳转页面响应数据
3.3 ModelAndView 响应
四、页面跳转
4.1 转发(地址栏不变)
4.2 重定向(地址栏改变)
4.3 跳其它的controller
一、Postman 工具使用
在这之前先了解一下Postman工具,Postman是一款流行的API开发和测试工具,它提供了一个用户友好的界面,用于发送HTTP请求并查看响应。它可以帮助开发人员在开发和测试API时更加高效和方便。
我们在编写web程序的时候需要频繁的进行数据测试,发送的是GET请求可以直接使用浏览器,如果要求发送的是post请求,我们就得准备页面在页面上准备form表单,测试起来比较麻烦。所以我们就需要借助一些第三方工具,如Postman、Eolink...
1.1 Postman安装
Postman官方下载地址 https://www.postman.com/downloads/
双击自动安装,首次进入需要我们注册登入也可以选择跳过,如需要测试还得要登入一手。可以点可以按照提示进行注册,如下界面是我登入后的主界面。
1.2 Postman的使用
1.2.1 创建WorkSpace工作空间
创建新的工作空间并设置工作空间的名字:
1.2.2 创建请求
选择刚创建的工作空间并添加一个请求:
注意: 第一次请求需要创建一个新的目录,后面就不需要创建新目录,直接保存到已经创建好的目录即可。
二、参数传递
上一篇我们已经完成了入门案例相关的知识学习,我们知道SpringMVC是web层的框架,主要的作用是接收请求、接收数据、响应结果,所以这一章节是学习SpringMVC的重点内容。
2.1 添加 Slf4j 依赖
<log4j2.version>2.9.1</log4j2.version>
<log4j2.disruptor.version>3.2.0</log4j2.disruptor.version>
<slf4j.version>1.7.13</slf4j.version><!--4.log日志相关依赖--><!-- log4j2日志相关依赖 -->
<!-- log配置:Log4j2 + Slf4j -->
<!-- slf4j核心包-->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version>
</dependency>
<dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version><scope>runtime</scope>
</dependency><!--核心log4j2jar包-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j2.version}</version>
</dependency>
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j2.version}</version>
</dependency>
<!--用于与slf4j保持桥接-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j2.version}</version><scope>runtime</scope>
</dependency><!--需要使用log4j2的AsyncLogger需要包含disruptor-->
<dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>${log4j2.disruptor.version}</version>
</dependency>
在上篇文章的pom.xml配置文件中换掉log4j的依赖,在实际开发中通常会使用日志文件将数据信息进行保存。而 Slf4j(Simple Logging Facade for Java)是一个简单的Java日志门面框架,它提供了一种通用的日志接口,使开发人员能够在应用程序中使用不同的日志实现,而无需修改代码。Slf4j的目标是为Java应用程序提供一种简单、灵活和可扩展的日志解决方案。
2.2 普通传参
编写paramController类
package com.ycxw.web;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-09-05 16:34*/
@Slf4j
@Controller
@RequestMapping("/param")
public class ParamController {@RequestMapping("/hello1")public String toHello1(Integer bid,String bname){log.info("基础类型+String传参:bid:{},bname:{}",bid,bname);return "index";}
}
知识点1:@RequestMapping
@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
- @Slf4j注解表示该类使用Slf4j日志框架进行日志记录。
- @Controller注解表示这是一个控制器类,用于处理HTTP请求。该类的请求映射路径为"/param"。
- 在该类中,定义了一个名为ParamController的控制器类。它包含了一个名为toHello1的方法,该方法使用@RequestMapping注解来指定处理的URL路径为"/hello1"。该方法接受两个参数,一个是基本类型的整数bid,另一个是字符串类型的bname。
- 在方法体内,使用log.info方法记录了一条日志信息。这条日志信息包含了两个参数bid和bname的值,使用{}占位符来表示参数的位置。
- 最后,该方法返回了一个字符串"index",表示要渲染的视图名称。
- 普通参数:url地址传参,地址参数名与形参变量名相同,定义形参即可接收参数。
打印结果:
注意:如果形参与地址参数名不一致会导致接收数据失败:
解决方案: 使用@RequestParam注解
知识点2:@RequestParam
@RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上
参数 | 说明 |
---|---|
value | 请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。 |
required | 该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。 |
defaultValue | 参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}" |
@RequestMapping("/hello2")public String toHello2(@RequestParam(required = false) Integer bid,@RequestParam(value = "bhahaha") String bname) {log.info("基础类型+String传参:bid:{},bname:{}", bid, bname);return "index";}
这时利用@RequestParam注解设置前台传参名字,就可以用bhahaha传值成功。
2.3 路径传参
知识点3:@PathVariable
如果我要通过id进行删除某一项可以用PathVariable注释,示例:
@RequestMapping("/hello3/{bid}")public String toHello3(@PathVariable("bid") Integer bid) {log.info("使用@PathVariable注解传递参数:{}", bid);return "index";}
运行结果:
2.4 Json数据传参
在实际开发中运用最多的就是通过Json数据进行传输,在本篇就没有演示对象、数组、以及集合传输,其传输方式与上普通传参略微有异。
SpringMVC默认使用的是jackson来处理json的转换,所以需要在pom.xml添加jackson依赖
<jackson.version>2.9.3</jackson.version><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency>
知识点4:@RequestBody
@RequestBody 注解用于将HTTP请求的请求体内容绑定到方法的参数上。它告诉Spring MVC框架将请求体的内容转换为指定的参数类型,并将其传递给方法进行处理。
使用@RequestBody注解的参数可以是任何Java对象类型,包括自定义的POJO(Plain Old Java Object)类。Spring MVC会自动根据请求体的内容类型,使用适当的转换器将请求体的内容转换为指定的参数类型。
- json对象({key1:value1,key2:value2,…})
请求和数据的发送:
{"bid": 1,"bname": "斗破苍穹","price": 9.9
}
后端接收数据:
@RequestMapping("/hello5")@ResponseBodypublic String toHello5(@RequestBody Book book) {System.out.println(book);return "index";}
- json对象数组([{key1:value1,…},{key2:value2,…}])
请求和数据的发送:
[{"bid": 1,"bname": "斗破苍穹","price": 9.9
},
{"bid": 2,"bname": "斗破苍穹","price": 10.9
}
]
后端接收数据:
@RequestMapping("/hello6")@ResponseBodypublic String toHello6(@RequestBody List<Book> books) {System.out.println(books);return "index";}
@RequestBody与@RequestParam区别
区别:
- @RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】
- @RequestBody用于接收json数据【application/json】
应用:
- 后期开发中,发送json格式数据为主,@RequestBody应用较广
- 如果发送非json格式数据,选用@RequestParam接收请求参数
三、响应
3.1 响应Json数据
1. 创建控制器:ReturnController类
package com.ycxw.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author 云村小威* @site blog.csdn.net/Justw320* @create 2023-09-06 22:18*/
@Controller
@RequestMapping("/rs")
public class ReturnController {}
2. 编写响应数据
@ResponseBody //响应Json数据@RequestMapping("/return1")public Map<String, Object> return1(HttpServletResponse response){Map<String,Object> maps = new HashMap<>();maps.put("code",200);maps.put("msg","响应成功");return maps;}
3. 测试:
3.2 跳转页面响应数据
1. 编写响应的jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
昵称:${name}
又爱又恨:${hobby}
</body>
</html>
2. 编写响应的数据
@RequestMapping("/return2")public String return2(Model model, HttpServletRequest request){//填充模型数据model.addAttribute("name","云村小威");request.setAttribute("hobby","编程");//逻辑视图名return "index";}
3. 测试:
3.3 ModelAndView 响应
- ModelAndView是一个在Java Spring框架中使用的类,用于将数据模型和视图信息一起传递给前端页面。它是一种将数据和视图结合在一起的方式,方便开发人员在后端控制器中处理数据并将其传递给前端页面进行展示。
- 在ModelAndView中,"Model"表示数据模型,它是一个存储数据的对象,可以在后端控制器中设置数据,并将其传递给前端页面。开发人员可以使用键值对的方式将数据存储在模型中,然后在前端页面中使用这些数据进行展示或处理。
- 而"View"表示视图,它是前端页面的表示。在ModelAndView中,开发人员可以设置要展示的视图的名称或路径,以便在请求处理完成后,将数据模型传递给相应的视图进行渲染和展示。
- 通过使用ModelAndView,开发人员可以将数据和视图信息封装在一起,方便地传递给前端页面,实现数据的动态展示和交互。这种方式使得后端控制器和前端页面之间的数据传递更加灵活和方便。
@RequestMapping("/return3")public ModelAndView return3(){ModelAndView mv = new ModelAndView();//填充模型数据mv.addObject("name","云村小威");mv.addObject("hobby","编程");//逻辑视图名mv.setViewName("index");return mv;}
测试:
四、页面跳转
转发(forward:path)和重定向(redirect:path)这两种跳转方式将会绕开视图解析器的前缀和后缀;还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始。
4.1 转发(地址栏不变)
@RequestMapping("/helloPage1")public String toHelloPage1(){System.out.println("helloPage1...");return "forward:return1";}
它相当于“request.getRequestDispatcher("url").forward(request,response)”。使用转发,既可以转发到jsp, 也可以转发到其他的控制器方法。
4.2 重定向(地址栏改变)
@RequestMapping("/helloPage2")public String toHelloPage2(){System.out.println("helloPage2...");return "redirect:return1";}
它相当于“response.sendRedirect(url)”, 也可以转发到其他的控制器方法。
4.3 跳其它的controller
/*转发*/@RequestMapping("/helloPage3")public String toHelloPage3(){System.out.println("helloPage3...");return "forward:/param/hello1";}/*重定向*/@RequestMapping("/helloPage4")public String toHelloPage4(){System.out.println("helloPage4...");return "redirect:/param/hello1";}
测试重定向:redirect:/param/hello1
如果是在同一controller中则不用使用 "/" 从根目录开始,而如果是在不同的controller则一定要从根目录开始。
相关文章:

【SpringMVC】参数传递与用户请求和响应
目录 一、Postman 工具使用 1.1 Postman安装 1.2 Postman的使用 1.2.1 创建WorkSpace工作空间 1.2.2 创建请求 二、参数传递 2.1 添加 Slf4j 依赖 2.2 普通传参 知识点1:RequestMapping 知识点2:RequestParam 2.3 路径传参 知识点3࿱…...

Android图形-Hardware Composer HAL
目录 一、引言 二、概览 三、实现HWC 3.1 为什么是HWC? 3.2 HWC的支持需求 3.3 HWC的实现思路 3.4 HWC的基元 3.5 HIDL接口 3.6 函数指针 3.7 图层和屏幕句柄 3.8 屏幕合成操作 3.9 多个屏幕 3.10 虚拟屏幕合成 3.10.1 模式 3.10.2 输出格式 3.11 同…...
P1093 [NOIP2007 普及组] 奖学金
题目描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 5 5 5 名学生发奖学金。期末,每个学生都有 3 3 3 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排…...

C#模拟PLC设备运行
涉及:控件数据绑定,动画效果 using System; using System.Windows.Forms;namespace PLCUI {public partial class MainForm : Form{ public MainForm(){InitializeComponent();}private void MainForm_Load(object sender, EventArgs e){// 方式2&#x…...
LeetCode 每日一题 2023/8/28-2023/9/3
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 8/28 57. 插入区间8/29 823. 带因子的二叉树8/30 1654. 到家的最少跳跃次数8/31 1761. 一个图中连通三元组的最小度数9/1 2240. 买钢笔和铅笔的方案数9/2 2511. 最多可以摧…...

Python Tkinter Multiple Windows 教程
一、说明 在这个Python Tkinter教程中,我们将学习如何在Python Tkinter中创建多个窗口,我们还将介绍与多个窗口相关的不同示例。而且,我们将介绍这些主题。 Python Tkinter multiple windows使用多个窗口的 Python Tkinter 用户注册Python Tk…...

【Arduino24】8*8点阵实验
硬件准备 8*8点阵:1个 旋钮电位器:1个 面包板:1块 杜邦线:若干 硬件连线 软件程序 //定义引脚 #define xKnob_pin A0 //x轴旋钮的引脚 #define yKnob_pin A1 //y轴旋钮的引脚 const int row_pin[8] { 6, 11, 10, 3, 17, 4…...

2023年09月数据库流行度最新排名
点击查看最新数据库流行度最新排名(每月更新) 2023年09月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…...

jenkins快速跑通helloworld任务
jenkins新建helloworld示例 左上角“新建任务” 输入名称,选择第一个创建: 可以选择众多执行脚本,这里选择shell: 随后弹出一个窗口,将下面脚本填入: #!/bin/bashecho start... for i in {1..10}doecho $i…...
win10中安装ros
参考: Windows 10上安装ROS noetic平台_windows ros noetic_高精度计算机视觉的博客-CSDN博客...

问道管理:光刻胶概念再度活跃,广信材料两连板,蓝英装备等涨停
光刻胶概念6日盘中再度活泼,截至发稿,扬帆新材、广信资料、蓝英配备“20cm”涨停,盛剑环境亦涨停,高盟新材涨超9%,同益股份、容大感光涨超5%。 值得注意的是,广信资料已连续两个交易日涨停。公司近来在成绩…...

InstructPix2Pix(CVPR2023)-图像编辑论文解读
文章目录 1.摘要2.背景3.算法3.1 生成多模态训练集3.1.1生成指令及成对caption3.1.2 依据成对的caption生成成对的图像 3.2 InstructPix2Pix 4.实验结果4.1基线比较4.2消融实验 5.结论 论文: 《InstructPix2Pix: Learning to Follow Image Editing Instructions》 …...

基于神经网络结合紫外差分光谱的二氧化硫浓度定量预测
基于神经网络结合紫外差分光谱的二氧化硫浓度定量预测 前言一、代码运行1. 解压数据2. 导包3. 读取数据4. 构建网络5. 设置优化器6. 模型训练7. 可视化loss8. 模型验证 二、结果展示三、总结作者简介 前言 二氧化硫(SO2)是一种常见的环境污染物ÿ…...

一个新工具 nolyfill
名字的意思, 我自己的理解 no(po)lyfill 正如它的名字, 不要再用补丁了, 当然这里说的是过时的补丁。 polyfill 是补丁的意思 为什么要用这个插件 文档原文: 当您通过安装最新的 Node.js LTS 来接受最新的功能和安全修复时,像eslint-plugin-import、…...

vue的第2篇 开发环境vscode的安装以及创建项目空间
一 环境的搭建 1.1常见前端开发ide 1.2 安装vs.code 1.下载地址:Visual Studio Code - Code Editing. Redefined 2.进行安装 1.2.1 vscode的中文插件安装 1.在搜索框输入“chinese” 2.安装完成重启,如下变成中文 1.2.2 修改工作区的颜色 选中[浅色]…...
Java之包装类的详细解析
包装类 5.1 概述 Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使…...
SpringBoot项目防止接口重复提交(简单拦截器实现方案)
基于SpringBoot框架来开发业务后台项目时,接口重复提交是一个常见的问题。为了避免这个问题,我们可以通过自定义拦截器实现一个后台拦截接口重复提交的功能,本文将介绍如何使用基于SpringBoot实现这个功能。 首先,我们需要引入一…...

C语言 数据结构与算法 I
C语言-数据结构与算法 C语言基础 因为之前写算法都是用C,也有了些C基础,变量常量数据类型就跳过去吧。 首先是环境,学C时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧…...
PHP指定时间戳/日期加一天,一年,一周,一月
PHP指定时间戳加上1天,1周,1月,一年其实是不需要用上什么函数的!指定时间戳本身就是数字整型,我们只需要再计算1天,1周它的秒数相加即可! 博主搜索php指定时间戳加一天一年,结果许多…...

前端框架 vue-admin-template的搭建运行
一介绍 1.1 下载地址 vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 GitHub - PanJiaChen/vue-element-admin: :tada: A magical vue admin https://panjiachen.github.io/vue-element-admin 1.2 node.js的安装 地址下载node.js 1.6版本 CNPM Binari…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...