【Spring MVC】传递参数

news2024/10/7 20:32:18

前言: 

  访问不同路径就是在发送不同的请求,在发送请求时,可能会带有一些参数,所以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;

    @Override
    public 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.coloradmin.cn/o/1155502.html

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

相关文章

5G物联网关相较有线网关有哪些独特优势

5G为产业物联网应用带来了质的飞跃&#xff0c;5G技术实现更高速率、更低延迟和更大带宽&#xff0c;使得物联网能够接入更多数量的设备&#xff0c;实现更稳定、高效的连接和数据传输&#xff0c;在提高生产效率的同时&#xff0c;也进一步促进了物联网的应用发展和升级。 针对…

预约上门洗衣店洗鞋店管理软件;

洗衣店洗鞋店管理软件&#xff1b; 软件操作简单&#xff0c;专业管理进货、库存、销售、会员、利润统计和导购员提成。前台扫描销售和会员打折&#xff0c;会员充值消费&#xff0c;支持扫码支付&#xff0c;结账自动打印小票。手机可以查询库存和营业情况&#xff01; 干洗店…

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

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

RecyclerView自定义LayoutManager从0到1实践

此前大部分涉及到 RecyclerView 页面的 LayoutManager基本上用系统提供的 LinearLayoutManager 、GridLayoutManager 就能解决&#xff0c;但在一些特殊场景上还是需要我们自定义 LayoutManager。之前基本上没有自己写过&#xff0c;在网上看各种源码各种文章&#xff0c;刚开始…

[MySQL]索引

目录 概念解释 作用/优点 缺点 适用场景 索引的创建,删除与查看 系统对索引的自动创建 索引建立的时机 索引存储的数据结构 选择B树的原因 B树的原理 查询流程 优点 B树 与B树的区别 优点 概念解释 索引就像是一本字典的目录,我们可以根据目录快速定位到我们想…

Java架构师前沿技术

目录 1 导学2 信息物理系统2.1CPS的体系架构2.2 CPS的技术体系3 人工智能4 机器人5 边缘计算6 数字李生体7 云计算7.1 云计算的部署模式8 大数据想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 信息物理系统 信息物理系统(CPS)是控制系统、嵌入式系统的扩展与…

一张图讲清楚业务稳定性要如何做:SRE体系化稳定性方案

概述&#xff1a;作为一个SRE、运维工程师&#xff0c;当我们在治理系统稳定性时&#xff0c;方法有很多&#xff0c;但往往无从下手。本文以一张逻辑图的形式&#xff0c;为读者提供治理稳定性的体系化思路。 先上图&#xff1a; 1、治理目标 我们做稳定性的目标&#xff0c…

MySQL 基础学习笔记(二)

目录 1 约束1.1 约束概述1.2 非空约束1.3 唯一约束1.4 主键约束1.5 默认约束1.6 外键约束 2 数据库设计2.1 数据库设计概述2.2 表关系 3 多表查询3.1 多表查询概述3.2 内连接查询3.3 外连接查询3.4 子查询 4 事务4.1 事务概述4.2 四大特征 1 约束 1.1 约束概述 约束是作用于表…

Whatsapp企业号如何增粉?5个措施帮到你

收集粉丝关注的方法有很多种&#xff0c;本文将会介绍九种有效的方式&#xff0c;可以参考。 在传播信息的过程中&#xff0c;我们要需要把客户放在第一位&#xff0c;你能提供给客户什么&#xff0c;实用价值或情绪价格。给人的感觉真实吗&#xff1f;足够透明吗&#xff1f;…

[黑马程序员Pandas教程]——Pandas快速体验

目录&#xff1a; 为什么要使用Python做数据开发Python在数据开发领域的优势为什么要学习Pandas其他常用Python库介绍主要内容介绍Anaconda安装Anaconda的虚拟环境管理虚拟环境的作用可以通过Anaconda界面创建虚拟环境通过命令行创建虚拟环境通过Anaconda管理界面安装包也可以…

Linux C语言进阶-D2字符数组和字符串

字符数组&#xff1a;元素的数据类型为字符类型的数组 char c[10],ch[3][4]; 字符数组的初始化 逐个字符赋值,无\0 在下图中&#xff0c;剩余的会自动添加上\0&#xff0c;而在int中会自动添加0&#xff0c;和NULL其实是一个意思 用字符串常量有\0 字符数组长度计算 下图中&am…

你知道什么是 Ping 吗?

欢迎到我的博客浏览 胤凯 (oyto.github.io) 这次我们来看一下什么是 Ping 操作&#xff0c;以及它有什么用处&#xff0c;并且我们来动手实现一个简易版的 Ping 工具。 Ping 是什么&#xff1f; ​ ping 是一个计算机网络工具&#xff0c;通常用于测试网络连接的可达性和测…

服务器带宽忽然暴增,不停的触发告警

问题&#xff1a; 线上环境&#xff0c;服务器的外网下行带宽达到某个阈值&#xff0c;触发告警&#xff0c;查了下服务器的带宽监控信息&#xff0c;是从某个时间开始突然串上去的&#xff0c;然后监控图形非常有规律&#xff0c;都是每秒达到顶峰后&#xff0c;又立马下去了…

信息系统项目管理师教程 第四版【第9章-项目范围管理-思维导图】

信息系统项目管理师教程 第四版【第9章-项目范围管理-思维导图】 课本里章节里所有蓝色字体的思维导图

2023年云栖大会来啦!!(2022年就已经深受震撼)

2023云栖大会已经开始啦&#xff0c;让我们来回顾回顾去年的云栖大会吧。 云栖大会是中国阿里巴巴集团每年举办的一项技术盛会&#xff0c;前身可追溯到2009年的地方网站峰会&#xff0c;2011年演变为阿里云开发者大会&#xff0c;2015年正式更名为“云栖大会”&#xff0c;并且…

DL Homework 5

目录 习题4-1 对于一个神经元​编辑&#xff0c;并使用梯度下降优化参数w时&#xff0c;如果输入x恒大于0&#xff0c;其收敛速度会比零均值化的输入更慢。 习题4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为N1&#xff0c;输入层大小为​编辑&#xff0c;输出层大…

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测

回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测 目录 回归预测 | Matlab实现RIME-CNN-SVM霜冰优化算法优化卷积神经网络-支持向量机的多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RIME-CNN-SVM霜冰优化算…

[SHCTF 2023 校外赛道] reverse

week1 ez_asm 想不到第1题是个汇编&#xff0c;咱也不知道拿啥能弄成c&#xff0c;不过这题也不难&#xff0c;直接能看懂&#xff0c;关键部分。 取出异或0x1e然后保存&#xff0c;再取出-0xa再保存。 .text:0000000000401566 loc_401566: …

赛宁网安多领域创新成果亮相第五届“纵横”论坛

10月27日&#xff0c;第五届“纵横”网络空间安全创新论坛在安徽合肥举办&#xff0c;来自中央国家机关、地方政府、军队有关单位、高校、科研院所和部分高新技术企业的领导、专家和代表500余人参加。 本届论坛由军事科学院和国防科技大学等单位共同主办&#xff0c;国防科技大…

电脑出现找不到d3dcompiler_43.dll的情况怎么办,分享d3dcompiler_43.dll丢失的办法

在使用电脑时你是不是也遇到过“未找到d3dcompiler_43.dll”的情况&#xff1f;是使用电脑的过程中d3dcompiler_43.dll丢失是一个经常出现问题&#xff0c;是一件大概率的事情&#xff0c;但是对于不了解这个文件的小伙伴而言出现这个问题是一件棘手的事情&#xff0c;那么今天…