【Spring MVC】传递参数

前言: 

  访问不同路径就是在发送不同的请求,在发送请求时,可能会带有一些参数,所以Spring的请求主要是为了学习如何传递参数到后端以及后端如何接收。

在SpringMVC中使用@RequestMapping来实现路由映射,也就是浏览器连接程序的作用。

第一个Spring代码 :

package com.example.demo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/hello/a")
@RestController//创建一个controller类,实现用户通过浏览器和程序的交互
public class HelloController {@RequestMapping(value = "/sayhi/b",method = RequestMethod.GET)public String sayHi(){return "hi,SpringBoot";}@RequestMapping("/sayhello")public String sayHello(){return "hello,SpringBoot";}}

通过路径 (127.0.0.1:8080/hello/a/sayhi/b)直接访问得到如下结果:

@RestController的作用

 @RequestMapping是SpringMVC中常用的注解之一,是用来注册接口的路由映射的。

路由映射:当用户访问一个url时,将用户的请求对应到程序中某个类的某个方法的过程。

既然 @RequestMapping可以达到我们的目的,为啥还要加@RestController?

删除@RestController试一试,可以看到:

所以 @RestController不能删!!!因为每个类可能有很多的方法,Spring不知道执行哪个方法,因此会对所有类进行扫描,如果这个类添加了注解@RestController,Spring才会去看这个类里面的方法有没有加@RequestMapping这个注解。

@RequestMapping的使用

@RequestMapping既可以修饰类也可以修饰方法,修饰类和方法时,访问的地址是类路径+方法路径。

    @RequestMapping标识一个类:设置映射请求的请求路径的初始信息,如:@RequestMapping("/hello/a")

    @RequestMapping标识一个方法:设置映射请求请求路径的具体信息,如:@RequestMapping(value = "/sayhi/b")

@RequestMapping("/hello/a")
@RestController//创建一个controller类,实现用户通过浏览器和程序的交互
public class HelloController {@RequestMapping(value = "/sayhi/b")public String sayHi(){return "hi,SpringBoot";}
}

访问地址为: 127.0.0.1:8080/hello/a/sayhi/b

@RequestMapping是GET还是POST请求?

@RequestMapping 既支持GET请求,也支持POST请求,但是浏览器发送的请求类型都是GET请求,也可指定自己所需要的请求:

1.传递单个参数

接收单个参数,在SpringMVC中直接用方法中的参数就可以了,比如:

@RestController
@RequestMapping("/param")
public class ParamController {@RequestMapping("/m1")public String m1(String name){return "接收到的参数name:"+name;}
}

请求的URL: 127.0.0.1:8080/param/m1?name=zhangsan

注意:使⽤基本类型来接收参数时, 参数必须传(除boolean类型), 否则会报500错误;类型不匹配时, 会报400错误。

500报错:

 

400报错: 

 2.传递多个参数

 @RequestMapping("/m2")public String m2(String name, Integer age){return "接收到的参数name:"+name + ",age:"+age;}

访问的URL:http://127.0.0.1:8080/param/m2?name=zhangsan&age=18

 3.传递对象

给一个Person对象:

package com.example.demo;public class Person {Integer id;String name;Integer age;@Overridepublic String toString() {return "Person{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

 传递对象代码实现:URL:http://127.0.0.1:8080/param/m4?id=123&name=zhangsan&age=18

@RequestMapping("/m4")public String m4(Person person){return "接收到的参数person:"+person.toString();}

 4.传递数组

Spring MVC可以自动绑定数组参数的赋值

    @RequestMapping("/m6")public String m6(String[] arrayParam){return "接收到的参数arrayParam:"+ Arrays.toString(arrayParam) + ",长度:"+arrayParam.length;}

Postman传参测试: 127.0.0.1:8080/param/m6?arrayParam=zhangsan

​​​​​​

浏览器传参:127.0.0.1:8080/param/m6?arrayParam=zhangsan 

5.传递集合 

集合参数:和数组类似,同一个请求参数名有多个,且需要使用@RequestParam绑定参数关系

默认情况下,请求中参数名相同的多个值,是封装到数组。但是!如果要封装到集合,要使用@RequestParam绑定参数关系

代码:

 @RequestMapping("/m7")public String m7(@RequestParam(required = false) List<String> listParam){return "接收到的参数listParam:"+ listParam + ",长度:"+listParam.size();}

Postman传参测试:http://127.0.0.1:8080/param/m7?listParam=zhangsan

6.传递JSON数据

 JSON:JavaScript Object Notation【JavaScript对象表示法】

JSON是一种轻量级的数据交互格式,它有自己的格式和语法,使用文本表示一个对象或数组的信息,因此JSON本质是字符串,主要负责在不同的语言中数据传递和交换

JSON和JavaScript没有关系,只是语法比较相似,JavaScript开发者能更快的上手,语法本身比较简单。

JSON语法:

1.数据在键值对(key/value)中

2.数据由逗号,分割

3.对象用{}表示(保存的对象是一个无序的键值对集合,一个对象以左括号{开始,右括号}结束。每一个”键“后面跟一个冒号:,键值对使用逗号,分割。

4.数组用[]表示(中括号保存的数组是值(value)的有序集合,一个数组以左括号[开始,右括号]结束,值之间使用逗号,分隔。

5.值可以为对象,也可以为数组,数组中可以包含多个对象

{"Name ": "zhangsan ","ID": "City","formed": 2023,"active": true,"members": {"name": "lisi","age": 18,"array": ["zhangsan", "lisi", "wangwu"]}
}

JSON优点

1.简单易用:语法简单,易于理解和编写,可以快速的进行数据交换

2.跨平台支持:JSON可以被多种语言解析和生成,可以在不同的平台和语言之间进行数据交换和传输。

3.轻量级:相对于XML格式,JSON数据格式更加轻量级,传输数据时占用宽带较小,可以提高数据传输速度

4.易于扩展:JSON的数据结构灵活,支持嵌套对象和数组等复杂的数据结构,便于扩展和使用。

5.安全性:JSON数据格式是一种纯文本格式,不包含可执行代码,不会执行恶意代码,因此具有较高的安全性。

JSON在Web应用程序中被广泛使用,如前后端数据交互,API接口数据传输等。

后端代码:

    @RequestMapping("/m8")public String m8(@RequestBody Person person){return "接收的数据person:" + person.toString();}

Postman发送json请求参数:

 

 Fiddler抓包:

7.获取URL中参数@PathVariable(路径变量) 

这个注解主要作用就是在请求URL路径上的数据绑定(默认传递参数写在URL上,SpringMVC就可以获取到)

后端代码:

    @RequestMapping("/m9/{userId}")public String m9(@PathVariable Integer userId){return "userId:"+userId ;}

 Postman:127.0.0.1:8080/param/m9/5

8.上传文件@RequestPart 

后端代码:

    @RequestMapping("/m10")public String m10(@RequestPart MultipartFile file) throws IOException {System.out.println(file.getOriginalFilename());file.transferTo(new File("D:/temp/"+file.getOriginalFilename()));return "success";}

 Postman传参测试:http://127.0.0.1:8080/param/m10

 9.获取Cookie/Session/Header

   @RequestMapping("/getCookie")public String getCookie(HttpServletRequest request,HttpServletResponse response){Cookie[] cookies = request.getCookies();//request中拿cookie
//        for (Cookie cookie : cookies) {
//            System.out.println(cookie.getName()+":"+cookie.getValue());
//        }//lambda表达式方式写if (cookies!=null){//判断空指针异常Arrays.stream(cookies).forEach(cookie->{System.out.println(cookie.getName()+":"+cookie.getValue());});}return "获取cookie成功";}
//开发过程中只获取一个cookie用这种@RequestMapping("/getCookie2")public String getCookie2(@CookieValue String bite,@CookieValue String aaa){return "cookie存取的值bite:"+bite+",aaa:"+aaa;}
 @RequestMapping("/setSession")public String setSession(HttpServletRequest request){HttpSession session = request.getSession();session.setAttribute("username","zhangsan");return "success";}//原始方式@RequestMapping("/getSession")public String getSession(HttpServletRequest request){HttpSession session = request.getSession(false);if (session!=null){String username = (String)session.getAttribute("username");return "登录用户:"+username;}return "session 为空";}@RequestMapping("/getSession2")//下面的@SessionAttribute默认是一个必传参数public String getSession2(@SessionAttribute(required = false) String username){return "username:"+username;}//通过内置对象(需要的时候直接加上,不需要的时候不用去写)@RequestMapping("/getSession3")public String getSession3(HttpSession session){//HttpSession session等同于HttpSession session=request.getSession(true)String username = (String)session.getAttribute("username");return "登录用户:"+username;}

Cookie 和 Session 的区别

Cookie 是客⼾端保存⽤⼾信息的⼀种机制Session 是服务器端保存⽤⼾信息的⼀种机制。

Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁。

Cookie 和 Session 经常会在⼀起配合使⽤.,但是不是必须配合。

    @RequestMapping("/getHeader")public String getHeader(HttpServletRequest request){String userAgent = request.getHeader("User-Agent");//User—Agent获取使用是哪个浏览器return "userAgent:"+userAgent;}@RequestMapping("/getHeader2")public String getHeader2(@RequestHeader("User-Agent") String userAgent){//通过注解的方式拿取信息return "userAgent:"+userAgent;}

 

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

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

相关文章

Linux--jdk、tomcat、环境配置,mysql安装、后端项目搭建

前言 上期我们讲到了安装linux虚拟机&#xff0c;这期我们来讲一下如何使用xshell和xftp在linux系统上搭建我们的单体项目 一、软件的传输 1.1 xftp Xftp是一款功能强大的文件传输软件&#xff0c;用于在本地主机和远程服务器之间进行快速、安全的文件传输。它是由南京帆软科…

2024王道考研计算机组成原理——中央处理器

CPU的运算器其实就是进行固定的数据处理&#xff0c;后面讲的CPU主要侧重的是它的控制器功能 运算器的基本结构 左右两边都是16位&#xff0c;因为寄存器可能位于左右两端的一边(源/目的操作数) A、B两端都要接一堆线 通用寄存器 ALU都在运算器当中 从主存来的数据直接放到…

BLS embedded curves族

1. 引言 以太坊基金会Antonio Sanso 2023年论文 Family of embedded curves for BLS中&#xff0c;展示了源自BLS椭圆曲线的embedded curves。 pairing-friendly curve E E E具有bilinear map e : G 1 G 2 → G T e:\mathbb{G}_1\times \mathbb{G}_2\rightarrow \mathbb{G…

MFC打开控制台的常用方式

工程项目中&#xff0c;想打开控制台的&#xff0c;简单打印日志 &#xff08;1&#xff09;依次打开&#xff1a; 项目配置属性——>生成事件——>后期生成事件&#xff1a;命令行 &#xff08;2&#xff09;输入&#xff1a; editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$…

C++前缀和算法的应用:统计上升四元组

C前缀和算法的应用&#xff1a;统计上升四元组 本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个长度为 n 下标从 0 开始的整数数组 nums &#xff0c;它包含 1 到 n 的所有数字&#xff0c;请你返回上…

DXF文件写入多边形和名称属性,可在Global Mapper和ArcGIS打开

DXF文件写入多边形和名称属性&#xff0c;可在Global Mapper和ArcGIS打开 目标效果 为了实现下图的效果&#xff0c;学习了一下dxf格式的相关内容。 官方文档价值很高&#xff0c;但是结合实例.dxf文件看学习起来更快。 免费下载实例 下面将介绍dxf文件的格式规范&#xff0…

Elasticsearch:在你的数据上训练大型语言模型 (LLM)

过去的一两年&#xff0c;大型语言模型&#xff08;LLM&#xff09;席卷了互联网。 最近 Google 推出的 PaLM 2 和 OpenAI 推出的 GPT 4激发了企业的想象力。 跨领域构思了许多潜在的用例。 多语言客户支持、代码生成、内容创建和高级聊天机器人都是一些例子。 这些用例要求 LL…

数字展厅搭建平台要具备哪些功能,如何选择数字展厅搭建平台

引言: 数字展厅搭建平什台是现代营销中不可或缺的重要工具之一。它可以帮助企业打造个性化、多媒体、互动性强的展示空间&#xff0c;吸引、引导和留住目标用户。在选择数字展厅搭建平台时&#xff0c;我们需要考虑各方面的功能和性能&#xff0c;以确保能够满足企业的需求并取…

面试算法47:二叉树剪枝

题目 一棵二叉树的所有节点的值要么是0要么是1&#xff0c;请剪除该二叉树中所有节点的值全都是0的子树。例如&#xff0c;在剪除图8.2&#xff08;a&#xff09;中二叉树中所有节点值都为0的子树之后的结果如图8.2&#xff08;b&#xff09;所示。 分析 下面总结什么样的节…

全网公开电商数据的采集重点

数据的采集是根据需求而定的&#xff0c;品牌会做数据采集的原因&#xff0c;一般与内部营销、渠道管控有关&#xff0c;如需要做价格管控时&#xff0c;需要先采集价格&#xff0c;这就需要对数据进行采集&#xff0c;包括价格、促销信息&#xff0c;又或者是需要做行业分析、…

PHP连接SQLServer echo输出中文汉字显示乱码解决方法

1、查询结果有中文会显示乱码。 解决方法一&#xff08;较简单&#xff0c;建议使用&#xff09;&#xff1a; 在php文件最开头写上&#xff1a; header(Content-type: text/html; charsetUTF8); // UTF8不行改成GBK试试&#xff0c;与你保存的格式匹配 <?php header(&q…

matab读取包含struct混合类型的mat文件转为txt文件

现有一个mat文件&#xff0c;其内容如下&#xff1a; 目标&#xff1a;要将data.mat中的Obs_Iridium_A转为文本格式。 分析&#xff1a; data.mat里面包含了4个struct结构的成员&#xff0c;Obs_Iridium_A是其中之一&#xff0c;Obs_Iridium_A为1*7496维&#xff0c;7496代表…

波浪理论第3波anzo capital昂首资本3个方法3秒确认

要想通过波浪理论在交易中赚取最大利润&#xff0c;确认第三波必不可少&#xff0c;因为第三波通常是趋势中最大和最强的一波&#xff0c;今天anzo capital昂首资本3个方法3秒确认。 首先&#xff0c;第一个确认方法—斜率。 通常&#xff0c;第三波的斜率会比第一波更陡峭&a…

Linux内核是如何创建进程?

目录 1.Linux如何创建进程 2.fork函数原理 2.1 fork函数原型 2.2 fork函数实现原理 2.3 父子进程虚拟地址空间&#xff08;mm_struct&#xff09;之间的关系 2.4 写时拷贝&#xff08;copy-on-write&#xff09;技术 2.5 父子进程如何共享文件&#xff08;files_struct&…

06、Caused by: java.nio.charset.MalformedInputException: Input length = 1

目录 问题&#xff1a;原因&#xff1a;解决方法&#xff1a; 问题&#xff1a; Caused by: java.nio.charset.MalformedInputException: Input length 1 原因&#xff1a; 应该是中文有哪些文字导致的。 yml 编码格式出错 解决方法&#xff1a; 直接这里把GBK改成 utf-8…

unordered系列关联式容器--哈希结构详细讲解及使用示例

目录 unordered系列关联式容器unordered_map 哈希哈希概念哈希函数直接定址法&#xff1a;除留余数法&#xff1a; 哈希冲突解决哈希冲突闭散列&#xff1a;开散列&#xff1a; unordered系列关联式容器 之前讲解在C98中STL提供了底层为红黑树结构的一系列关联式容器&#xff…

Nginx域名重定向(如何访问的域名和实际的数据请求路径不同,可解决前端跨域)

感情需要被抑制&#xff0c;不能泛滥… 当需要将一个域名重定向到另一个域名并且用户仍然看到原始域名时&#xff0c;Nginx是一个强大的工具。这种场景通常涉及到反向代理或重写URL的技巧。在本篇博客中&#xff0c;我们将详细介绍如何使用Nginx来实现这个目标&#xff0c;以及…

精品基于Python的考场考试分配规划系统

《[含文档PPT源码等]精品基于Python的考场分配规划系统的设计与实现》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技…

ubuntu(18.04) 安装 blast 并在php中调用

1、下载 https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/LATEST/2、解压&#xff0c;配置环境变量 tar zvxf ncbi-blast-2.14.1-x64-linux.tar.gz解压后改名为 blast 配置环境变量&#xff0c;可以不配置 使用的时候直接绝对路径使用&#xff08;本次使用绝对路径&am…

LInux之在同一Tomcat下使用不同的端口号访问不同的项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《LInux实战开发》。&#x1f3af;&#x1f3af; …