springboot系列九: 接收参数相关注解

文章目录

  • 基本介绍
  • 接收参数相关注解应用实例
      • @PathVariable
      • @RequestHeader
      • @RequestParam
      • @CookieValue
      • @RequestBody
      • @RequestAttribute
      • @SessionAttribute
  • 复杂参数
    • 基本介绍
    • 应用实例
  • 自定义对象参数-自动封装
    • 基本介绍
    • 应用实例

在这里插入图片描述

基本介绍

1.SpringBoot 接收客户端提交数据 / 参数会使用到相关注解.

2.详细学习 @PathVariable, @RequestHeader, @ModelAttribute, @RequestParam, @CookieValue, @RequestBody

接收参数相关注解应用实例

●需求:
演示各种方式提交数据/参数给服务器, 服务器如何使用注解接收

@PathVariable

1.创建src/main/resources/public/index.html
JavaWeb系列十: web工程路径专题

<h1>跟着老韩学springboot</h1>
基本注解:
<hr/>
<!--
    1. web工程路径知识:
    2. / 会解析成 http://localhost:8080
    3. /monster/100/king => http://localhost:8080/monster/100/king
    4. 如果不带 /, 会以当前路径为基础拼接
/-->
<a href="/monster/100/king">@PathVariable-路径变量 monster/100/king</a><br/><br/>
</body>

2.创建src/main/java/com/zzw/springboot/controller/ParameterController.java
url占位符回顾

@RestController
public class ParameterController {

    /**
     * 1./monster/{id}/{name} 构成完整请求路径
     * 2.{id} {name} 就是占位变量
     * 3.@PathVariable("name"): 这里 name 和 {name} 命名保持一致
     * 4.String name_ 这里自定义, 这里韩老师故意这么写
     * 5.@PathVariable Map<String, String> map 把所有传递的值传入map
     * 6.可以看下@pathVariable源码
     * @return
     */
    @GetMapping("/monster/{id}/{name}")
    public String pathVariable(@PathVariable("id") Integer id,
                               @PathVariable("name") String name,
                               @PathVariable Map<String, String> map) {
        System.out.println("id = " + id + "\nname = " + name + "\nmap = " + map);
        return "success";
    }
}

3.测试 http://localhost:8088/monster/100/king

在这里插入图片描述
在这里插入图片描述

@RequestHeader

需求: 演示@RequestHeader使用.

1.修改src/main/resources/public/index.html

<a href="/requestHeader">@RequestHeader-获取http请求头</a><br/><br/>

2.修改ParameterController.java
JavaWeb系列八: WEB 开发通信协议(HTTP协议)

/**
 * 1. @RequestHeader("Cookie") 获取http请求头的 cookie信息
 * 2. @RequestHeader Map<String, String> header 获取到http请求的所有信息
 */
@GetMapping("/requestHeader")
public String requestHeader(@RequestHeader("Host") String host,
                            @RequestHeader Map<String, String> header) {
    System.out.println("host = " + host + "\nheader = " + header);
    return "success";
}

3.测试

在这里插入图片描述
在这里插入图片描述

@RequestParam

需求: 演示@RequestParam使用.

1.修改src/main/resources/public/index.html

<a href="/hi?name=赵志伟&fruit=apple&fruit=pear&address=上海&id=3">@RequestParam-获取请求参数</a><br/><br/>

2.修改ParameterController.java
SpringMVC系列五: SpringMVC映射请求数据

/**
 * 如果我们希望将所有的请求参数的值都获取到, 可以通过
 * @RequestParam Map<String, String> params
 */
@GetMapping("/hi")
public String hi(@RequestParam(value = "name") String username,
                 @RequestParam(value = "fruit") List<String> fruits,
                 @RequestParam Map<String, String> params) {
    System.out.println("username = " + username + "\nfruits = "
            + fruits + "\nparams = " + params);
    return "success";
}

3.测试

在这里插入图片描述
在这里插入图片描述

@CookieValue

需求: 演示@CookieValue使用.

1.修改src/main/resources/public/index.html

<a href="/cookie">@CookieValue-获取cookie值</a>

2.修改ParameterController.java
JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

/**
 * 因为我们的浏览器目前没有cookie, 我们可以自己设置cookie
 * 如果要测试, 可以先写一个方法, 在浏览器创建对应的cookie
 * 说明:
 * 1. value = "cookie_key" 表示接收名字为 cookie_key的cookie
 * 2. 如果浏览器携带来对应的cookie, 那么后面的参数是String, 则接收到的是对应的value
 * 3. 后面的参数是Cookie, 则接收到的是封装好的对应的cookie
 */
@GetMapping("/cookie")
public String cookie(@CookieValue(value = "cookie_key") String cookie_value,
                     @CookieValue(value = "username") Cookie cookie,
                     HttpServletRequest request) {
    System.out.println("cookie_value = " + cookie_value
            + "\nusername = " + cookie.getName() + "-" + cookie.getValue());
    Cookie[] cookies = request.getCookies();
    
    for (Cookie cookie1 : cookies) {
        System.out.println("cookie1 = " + cookie1.getName() + "-" + cookie1.getValue());
    }
    return "success";
}

3.测试
在这里插入图片描述
在这里插入图片描述

@RequestBody

需求: 演示@RequestBody使用.

1.修改src/main/resources/public/index.html

<h1>测试@RequestBody获取数据: 获取POST请求体</h1>
<form action="/save" method="post">
    名字: <input type="text" name="name"><br/>
    年龄: <input type="text" name="age"><br/>
    <input type="submit" value="提交"/>
</form>

2.修改ParameterController.java
SpringMVC系列十: 中文乱码处理与JSON处理

/**
 * @RequestBody 是整体取出Post请求内容
 */
@PostMapping("/save")
public String postMethod(@RequestBody String content) {
    System.out.println("content = " + content);//content = name=zzw&age=23
    return "sucess";
}

3.测试

在这里插入图片描述

content = name=zzw&age=123

@RequestAttribute

需求: 演示@RequestAttribute使用. 获取request域的属性.

1.修改src/main/resources/public/index.html

<a href="/login">@RequestAttribute-获取request域属性</a>

2.创建RequestController.java
SpringMVC系列十: 中文乱码处理与JSON处理

@Controller
public class RequestController {
    @RequestMapping("/login")
    public String login(HttpServletRequest request) {
        request.setAttribute("user", "赵志伟");//向request域中添加的数据
        return "forward:/ok";//请求转发到 /ok
    }

    @GetMapping("/ok")
    @ResponseBody
    public String ok(@RequestAttribute(value = "user", required = false) String username,
                     HttpServletRequest request) {
        //获取到request域中的数据
        System.out.println("username--" + username);
        System.out.println("通过servlet api 获取 username-" + request.getAttribute("user"));
        return "success"; //返回字符串, 不用视图解析器
    }
}

3.测试…

@SessionAttribute

需求: 演示@SessionAttribute使用. 获取session域的属性.

1.修改src/main/resources/public/index.html

<a href="/login">@SessionAttribute-获取session域属性</a>

2.创建RequestController.java
JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

@Controller
public class RequestController {
    @RequestMapping("/login")
    public String login(HttpServletRequest request, HttpSession session) {
        request.setAttribute("user", "赵志伟");//向request域中添加的数据
        session.setAttribute("mobile", "黑莓");//向session域中添加的数据
        return "forward:/ok";//请求转发到 /ok
    }

    @GetMapping("/ok")
    @ResponseBody
    public String ok(@RequestAttribute(value = "user", required = false) String username,
                     HttpServletRequest request,
                     @SessionAttribute(value = "mobile", required = false) String mobile,
                     HttpSession session) {
        //获取到request域中的数据
        System.out.println("username--" + username);
        System.out.println("通过servlet api 获取 username-" + request.getAttribute("user"));

        //获取session域中的数据
        System.out.println("mobile--" + mobile);
        System.out.println("通过HttpSession 获取 mobile-" + session.getAttribute("mobile"));
        return "success"; //返回字符串, 不用视图解析器
    }
}

3.测试…

复杂参数

基本介绍

1.在开发中, SpringBoot在相应客户端请求时, 也支持复杂参数

2.Map, Model, Errors/BindingResult, RedirectAttributes, ServletResponse, SessionStatus, UriComponentsBuilder, ServletUriComponentBuilder, HttpSession.

3.Map, Model,数据会被放在request域, 到时Debug一下.

4.RedirectAttribute 重定向携带数据

应用实例

说明: 演示复杂参数的使用.
重点: Map, Model, ServletResponse

●代码实现
1.修改src/main/java/com/zzw/springboot/controller/RequestController.java
SpringMVC系列六: 模型数据

//响应一个注册请求
@GetMapping("/register")
public String register(Map<String, Object> map,
                       Model model,
                       HttpServletRequest request) {
    //如果一个注册请求, 会将注册数据封装到map或者model
    //map中的数据和model中的数据, 会被放入到request域中
    map.put("user", "赵志伟");
    map.put("job", "java");
    model.addAttribute("sal", 6000);
    //一会我们再测试response使用
    
    //请求转发
    return "forward:/registerOk";
}

@GetMapping("/registerOk")
@ResponseBody
public String registerOk(HttpServletRequest request,
                         @RequestAttribute("user") String user,
                         @RequestAttribute("job") String job,
                         @RequestAttribute("sal") Double sal) {
    System.out.println("user=" + request.getAttribute("user"));
    System.out.println("job=" + job);
    System.out.println("sal=" + sal);
    return "success";
}

2.浏览器输入 http://localhost:8088/register , 打断点测试

SpringMVC系列十三: SpringMVC执行流程 - 源码分析

在这里插入图片描述

进入目标方法

在这里插入图片描述

剖析 request 对象

在这里插入图片描述

3.继续修改 register()方法
JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

//响应一个注册请求
@GetMapping("/register")
public String register(Map<String, Object> map,
                       Model model,
                       HttpServletRequest request,
                       HttpServletResponse response) throws UnsupportedEncodingException {
    //如果一个注册请求, 会将注册数据封装到map或者model
    //map中的数据和model中的数据, 会被放入到request域中
    map.put("user", "赵志伟");
    map.put("job", "java");
    model.addAttribute("sal", 6000);
    //一会我们再测试response使用
    //演示创建cookie, 并通过response 添加到浏览器/客户端
    Cookie cookie = new Cookie("email", "978964140@qq.com");
    response.addCookie(cookie);

    //请求转发
    return "forward:/registerOk";
}

4.测试

在这里插入图片描述

自定义对象参数-自动封装

基本介绍

1.在开发中, SpringBoot在响应客户端/浏览器请求时, 也支持自定义对象参数

2.完成自动类型转换与格式化

3.支持级联封装

应用实例

●需求说明:
演示自定义对象参数使用,完成自动封装,类型转换。

●代码实现
1.创建public/save.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加妖怪</title>
</head>
<body>
<form action="?" method="?">
    编号: <input name="" value=""><br/>
    姓名: <input name="" value=""><br/>
    年龄: <input name="" value=""><br/>
    婚否: <input name="" value=""><br/>
    生日: <input name="" value=""><br/>
    坐骑名称: <input name="" value=""><br/>
    坐骑价格: <input name="" value=""><br/>
    <input type="submit" value="保存"/>
</form>
</body>
</html>

2.创建src/main/java/com/zzw/springboot/bean/Car.java

@Data
public class Car {
    private String name;
    private Double price;
}

3.创建src/main/java/com/zzw/springboot/bean/Monster.java

@Data
public class Monster {
    private Integer id;
    private String name;
    private Integer age;
    private Boolean maritalStatus;
    private Date birthday;
    private Car car;
}

4.修改ParameterController.java

//处理添加monster的方法
@PostMapping("/saveMonster")
public String saveMonster(Monster monster) {
    System.out.println("monster = " + monster);
    return "success";
}

5.回填public/save.html

<form action="saveMonster" method="post">
    编号: <input name="id" value="100"><br/>
    姓名: <input name="name" value="张三"><br/>
    年龄: <input name="age" value="30"><br/>
    婚否: <input name="maritalStatus" value="未婚"><br/>
    生日: <input name="birthday" value="1994-01-01"><br/>
    <input type="submit" value="保存"/>
</form>

6.自动封装需要用到自定义转换器. 接下来, 继续学习自定义转换器.


🔜 下一篇预告: [即将更新,敬请期待]


📚 目录导航 📚

  1. springboot系列一: springboot初步入门
  2. springboot系列二: sprintboot依赖管理
  3. springboot系列三: sprintboot自动配置
  4. springboot系列四: sprintboot容器功能
  5. springboot系列五: springboot底层机制实现 上
  6. springboot系列六: springboot底层机制实现 下
  7. springboot系列七: Lombok注解,Spring Initializr,yaml语法
  8. springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解

💬 读者互动 💬
在学习 Spring Boot 静态资源访问和 Rest 风格请求处理的过程中,您有哪些新的发现或疑问?欢迎在评论区留言,让我们一起讨论吧!😊


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二进制二维数组与装箱问题

装箱问题&#xff08;Bin Packing Problem&#xff09;是一类经典的优化问题&#xff0c;其目标是将一系列项目&#xff08;通常具有不同的体积或重量&#xff09;分配到尽量少的箱子中&#xff0c;使得每个箱子的容量不被超出。这种问题在物流、资源分配、内存管理等领域有广泛…

LinkedList----源码分析

源码介绍 public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable{} 添加过程中的操作&#xff1a; 当创建LinkedList类时&#xff0c;会调用其空参构造方法&#xff0c;将其参…

第一关:Linux基础知识

Linux基础知识目录 前言LinuxInternStudio 关卡1. InternStudio开发机介绍2. SSH及端口映射2.1 什么是SSH&#xff1f;2.2 如何使用SSH远程连接开发机&#xff1f;2.2.1 使用密码进行SSH远程连接2.2.2 配置SSH密钥进行SSH远程连接2.2.3 使用VScode进行SSH远程连接 2.3. 端口映射…

6-5,web3浏览器链接区块链(react+区块链实战)

6-5&#xff0c;web3浏览器链接区块链&#xff08;react区块链实战&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 这里就是浏览器端和智能合约的交…

论文阅读【时空+大模型】ST-LLM(MDM2024)

论文阅读【时空大模型】ST-LLM&#xff08;MDM2024&#xff09; 论文链接&#xff1a;Spatial-Temporal Large Language Model for Traffic Prediction 代码仓库&#xff1a;https://github.com/ChenxiLiu-HNU/ST-LLM 发表于MDM2024&#xff08;Mobile Data Management&#xf…

回归损失和分类损失

回归损失和分类损失是机器学习模型训练过程中常用的两类损失函数&#xff0c;分别适用于回归任务和分类任务。 回归损失函数 回归任务的目标是预测一个连续值&#xff0c;因此回归损失函数衡量预测值与真实值之间的差异。常见的回归损失函数有&#xff1a; 均方误差&#xff…

srs直播内网拉流带宽飙升问题记录

问题背景 srs部署在云服务器上&#xff0c;32核cpu&#xff0c;64G内存&#xff0c;带宽300M. 客户端从srs拉流&#xff0c;发现外网客户端拉流&#xff0c;cpu和带宽都正常。然而内网客户端拉流&#xff0c;拉流人数超过5人以上&#xff0c;带宽就会迅速飙升。 排查 用srs…

Pandas数学函数大揭秘:让数据处理变得如此简单高效,轻松玩转数据分析新纪元!

1.导包 # 导包 import numpy as np import pandas as pd2.聚合函数 df pd.DataFrame(datanp.random.randint(0,100,size(5,3))) df01203550281552376231419335895434679917 # 列非空元素的数量 df.count()0 5 1 5 2 5 dtype: int64# 行非空元素的数量 df.count(ax…

小白的OS Copilot 产品测评

背景 通过群友介绍才知OS Copilot 。不想错过任何优秀的AI产品。随着互联网的发展和时代的进步&#xff0c;要紧跟时代&#xff0c;了解市面上的优秀的AI科技产品。 OS Copilot 产品体验评测 1&#xff09;您的角色是什么&#xff1f;开发、运维、学生&#xff1f;如果使用O…

7.11日学习打卡----初学Redis(六)

7.11日学习打卡 目录&#xff1a; 7.11日学习打卡一. redis事务事务的概念与ACID特性Redis事务三大特性Redis事务执行的三个阶段Redis事务基本操作 二. redis集群主从复制主从复制环境搭建主从复制原理剖析 哨兵监控哨兵监控环境搭建哨兵工作原理剖析 故障转移Cluster模式Clust…

MES系统是如何进行工艺管理的

1. MES系统工艺管理 工艺管理是MES制造执行系统中至关重要的功能模块之一&#xff0c;它涉及到产品从设计到生产的整个工艺流程的规划、执行和优化。以下是对MES系统中工艺管理模块的详细介绍&#xff1a; 1.1 工艺流程设计 工艺流程设计是MES系统工艺管理的核心部分&#xf…

PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0

符合条件的 PCI SSC 利益相关者在 30 天的意见征询 (RFC) 期间审查 PCI PTS 硬件安全模块 (HSM) 模块化安全要求 v5.0 草案并提供反馈。 PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0图 从 7 月 8 日到 8 月 8 日&#xff0c;邀请符合条件的 PCI SSC 利益相关者在 30 天的意见…

使用getopt处理参数

文章目录 使用getopt处理参数1. shift 命令1.1 删除一个参数1.2 删除多个参数1.3 多次执行 shift 参数1.4 参数解析示例1.5 优化处理1.6 问题处理 2. getopt 命令2.1 常用参数及示例2.2 脚本参数优化示例2.3 参数校验 3. 示例展示4. eval 命令4.1 示例示例 1示例 2示例 3示例 4…

“论软件维护方法及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 软件维护是指在软件交付使用后&#xff0c;直至软件被淘汰的整个时间范围内&#xff0c;为了改正错误或满足 新的需求而修改软件的活动。在软件系统运行过程中&#xff0c;软件需要维护的原因是多种多样的&#xff0c; 根据维护的原因不同&#xff0c;可以将软件维护…

新火种AI|微软和苹果放弃OpenAI董事会观察员席位

作者&#xff1a;一号 编辑&#xff1a;美美 微软苹果双双不做OpenAI“观察员”&#xff0c;OpenAI能更自由吗&#xff1f; 7月10消息&#xff0c;微软当地时间周一宣布将放弃在OpenAI董事会的观察员席位&#xff0c;他们称&#xff0c;OpenAI在过去八个月中取得了“重大进展…

天润融通引领客服革新,AI大模型助力品牌服务升级

AI时代&#xff0c;消费零售品牌的客户服务应该怎么做&#xff1f; 如今消费者的关注点已经越来越复杂&#xff0c;一条毛巾&#xff0c;关注点就可以包括&#xff1a; 是否婴幼儿可用&#xff0c;是否儿童成人可用&#xff1b;是否可以直接接触皮肤&#xff1b;是否无甲醛、…

初学SpringMVC之接收请求参数及数据回显

pom.xml 文件导入 lombok 的依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.34</version></dependency> Controller 表示这是一个控制器 RequestParam 表示从前端接收…

14 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数(一)

14 - matlab m_map地学绘图工具基础函数 - 一些数据转换函数&#xff08;一&#xff09; 0. 引言1. 关于m_ll2xy和m_xy2ll2. 关于m_lldist3. 关于m_xydist4 关于m_fdist5 关于m_idist6. 总结 0. 引言 通过前面篇节已经将m_map绘图工具中大多绘图有关的函数进行过介绍&#xff0…

axios使用sm2加密数据后请求参数多了双引号解决方法

axios使用sm2加密数据后请求参数多了双引号解决 背景问题描述解决过程 背景 因项目安全要求&#xff0c;需对传给后端的入参加密&#xff0c;将请求参数加密后再传给后端 前期将axios降低到1.6.7后解决了问题&#xff0c;但最近axios有漏洞&#xff0c;安全要求对版本升级&…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …