当前位置: 首页 > news >正文

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别

用餐厅点餐来理解

想象你去一家餐厅吃饭:

  • Request Controller(接单员):负责处理你的点餐请求,记录你的口味、桌号等信息。
  • Response Controller(厨师+服务员):根据你的需求制作菜品,并把热乎乎的菜端到你桌上。

它们的核心区别

  • Request Controller:专注 接收并解析用户请求(比如拿参数、查Cookie、读Session)。
  • Response Controller:专注 构造并返回响应数据(比如返回网页、JSON数据、设置状态码)

第一部分:RespController - 响应处理中心

(相当于快递包装流水线)

1. 地址导航员(返回页面)

@RequestMapping("/r1")
public String returnPage(){return "/index.html"; 
}

作用:引导用户访问指定网页
示例:类似点击网页导航链接
访问地址:http://localhost/resp/r1
响应结果:显示服务器上的index.html网页文件

2. 文字快递员(返回纯文本)

@ResponseBody
@RequestMapping("/r2")
public String returnData(){return "我是前端需要的数据"; 
}

作用:向浏览器直接发送文字内容
示例:手机收到验证码短信
响应头:Content-Type: text/plain
响应内容:直接显示返回的字符串原文

3. HTML零件供应商

@ResponseBody
@RequestMapping("/r3")
public String returnHTML(){return "<h1>我是一级标题</h1>";
}

作用:发送HTML片段让浏览器渲染
示例:网购时的商品描述模块
响应头:Content-Type: text/html
前端显示:显示为带样式的标题文字

4. 强制纯文本模式

@ResponseBody
@RequestMapping(value = "/r4", produces = "text/plain")
public String returnTEXT(){return "<h1>我是一级标题</h1>";
}

作用:强制浏览器以纯文本处理内容
示例:收到代码截图文档
响应头:Content-Type: text/plain
前端显示:显示原始代码文本 <h1>...

5. JSON数据专员

(需要UserInfo类支持)

@ResponseBody
@RequestMapping("/r5")
public UserInfo returnJSON(){return new UserInfo(1, "zhangsan");
}

作用:发送结构化数据
示例:接收用户信息表单
响应头:Content-Type: application/json

响应内容

{"id":1, "name":"zhangsan"}


6. 异常状态标注员

@ResponseBody
@RequestMapping("/r6")
public UserInfo setStatus(HttpServletResponse response){response.setStatus(400);return new UserInfo(1, "zhangsan");
}

第二部分:RequestController  - 需求处理中心

1. 问询接待员(基础参数接收)

示例请求
访问:http://localhost/request/r1?keyword=手机
响应结果:接收参数手机

2. 多重接待窗口

@RequestMapping("/r2")
public String r2(String name, String password) {return "usrname" + name + "password" + password;
}

示例请求
访问:http://localhost/request/r2?name=张三&password=123456
响应结果:username张三 password123456

3. 数字检查员(包装类)

@RequestMapping("/r3")
public String r3(Integer age) {return "age" + age;
}

特点

  • 允许空值(如访问时不带age参数)
  • 示例空请求响应:age null

4. 强制数字模式

@RequestMapping("/r4")
public String r4(int age) {return "age" + age;
}

特点

  • 基本类型必须有值
  • 空请求时默认返回 age 0

5. 对象收集员

@RequestMapping("/r5")
public String r5(UserInfo userInfo) {return "userInfo" + userInfo.toString();
}

使用方式
访问:http://localhost/request/r5?id=2&name=李四
参数自动装配:转换为UserInfo对象

6. 参数改装员

@RequestMapping("/r6")
public String r6(@RequestParam("q") String keyword) {return "keyword" + keyword;
}

示例请求
访问:http://localhost/request/r6?q=笔记本电脑
功能:把参数q映射到keyword变量

7. 批量收货员

@RequestMapping("/r7")
public String r7(String[] arr) {return "arr" + Arrays.toString(arr);
}


示例请求
访问:http://localhost/request/r7?arr=苹果&arr=香蕉
响应结果:arr [苹果, 香蕉]

8. 路径解析员

@RequestMapping("/article/{type}/{articleId}")
public String article(@PathVariable String type, @PathVariable Integer articleId) {return "articleId" + articleId+"type"+type;
}

示例请求
访问:http://localhost/request/article/tech/1001
响应结果:articleId1001 typetech

9. 包裹接收员(文件上传)

@RequestMapping("r12")
public String r12(@RequestPart("file11") MultipartFile file) {file.transferTo(new File("C:\\temp\\"+file.getOriginalFilename()));return "文件上传成功";
}

使用方式:使用Postman等工具上传文件
表单字段名:file11
保存路径:C盘temp目录

10. 会员卡收集员

@RequestMapping("/r13")
public String r13(HttpServletRequest request) {Cookie[] cookies = request.getCookies();return "返回cookie成功";
}

功能:查看浏览器携带的所有Cookie

11. 精准会员卡读取器

@RequestMapping("/r14")
public String r14(@CookieValue("java")String java) {return "Cookie中java的值:"+java;
}

要求:浏览器必须携带名为java的Cookie

12. 储物柜管理员(Session操作)

@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("userName", "zhangsan");return "设置session成功";
}

效果
创建类似保险箱的会话存储空间,通过Cookie自动关联用户

13. 储物柜检查员(会话验证)

@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("userName") String userName){return "登录用户为" + userName;
}

使用场景对比表

功能需求对应控制器典型方法示例
需要给浏览器返回网页RespControllerreturnPage() (/r1)
开发RESTful API接口RequestControllerreturnJSON()(/r5)
用户登录状态保持RequestControllersetSession()相关方法
处理复杂的表单参数RequestControllerr5(UserInfo对象接收)
需要控制响应头信息RespControllersetHeader() (/r7)
上传用户头像文件RequestControllerr12()文件上传方法
移动端接口开发RequestController所有带@RestController的方法

相关文章:

Java Spring MVC (2)

常见的Request Controller 和 Response Controller 的区别 用餐厅点餐来理解 想象你去一家餐厅吃饭&#xff1a; Request Controller&#xff08;接单员&#xff09;&#xff1a;负责处理你的点餐请求&#xff0c;记录你的口味、桌号等信息。Response Controller&#xff08…...

对开源VLA sota π0的微调——如何基于各种开源数据集、以及你自己的私有数据集微调π0(含我司的微调实践)

前言 25年2.4日&#xff0c;几个月前推出π0的公司Physical Intelligence (π)宣布正式开源π0及π0-FAST&#xff0c;如之前所介绍的&#xff0c;他们对用超过 10,000 小时的机器人数据进行了预训练 该GitHub代码仓库「 π0及π0-FAST的GitHub地址&#xff1a;github.com/Ph…...

[排序算法]直接插入排序

1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列。 实际中我们玩扑克牌时&#xff0c;就用…...

四、云原生应用监控-Etcd

Etcd 是 Kubernetes 内部核心组件之一,作为分布式键值存储,天然支持 Prometheus 监控,自带 /metrics 端点,可直接被 Prometheus 抓取。 Etcd监控需要使用到证书。 一、检查云原生Etcd 检查节点上的Etcd [root@k8s-master01 manifests]#netstat -lnpt |grep etcd tcp …...

STM32-I2C通信外设

目录 一&#xff1a;I2C外设简介 二&#xff1a;I2C外设数据收发 三&#xff1a;I2C的复用端口 四&#xff1a;主机发送和接收 五&#xff1a;硬件I2C读写MPU6050 相关函数&#xff1a; 1.I2C_ GenerateSTART 2.I2C_ GenerateSTOP 3.I2C_ AcknowledgeConfig 4.I2C…...

CTA策略【量化理论】

CTA策略演变史 全称&#xff1a;Commodity Trading Advisor &#xff08;商品交易顾问&#xff09; CTA最开始是指通过为客户提供期权、期货方面的交易建议&#xff0c;或者直接通过受管理的期货账户参与实际交易&#xff0c;来获得收益的机构或个人。 随着市场的发展&#…...

基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享

作者&#xff1a;Hello,Panda 各位FPGAer周末愉快&#xff0c;今天熊猫君分享一个基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案。 一、方案背景 先说方案的应用背景&#xff1a;众所周知&#xff0c;较为上层的如基于AI的机器视觉应用&#xff0c;大多基于高端的专用SoC、AI专…...

②Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网

Modbus TCP转Modbus RTU/ASCII网关同步采集无需编程高速轻松组网https://item.taobao.com/item.htm?ftt&id784749793551 网关 MS-A1-5081 MS-A1-5081 网关通过 MODBUS TCP 协议与 Modbus RTU/ASCII 协议的相互转换&#xff0c;可以将 Modbus 串口设备接入 MODBUS TCP 网络…...

游戏引擎学习第145天

仓库:https://gitee.com/mrxiao_com/2d_game_3 今天的计划 目前&#xff0c;我们正在完成遗留的工作。当时我们已经将声音混合器&#xff08;sound mixer&#xff09;集成到了 SIMD 中&#xff0c;但由于一个小插曲&#xff0c;没有及时完成循环内部的部分。这个小插曲主要是…...

【Kotlin】Kotlin基础笔记

一、数据类型 1.1 变量声明与类型推导 变量声明 使用 val 声明不可变变量&#xff08;相当于常量&#xff09;&#xff1b;使用 var 声明可变变量。 val a 10 // 类型自动推断为 Int&#xff0c;不可变 var b: Double 5.0 // 显示声明为 Double&#xff0c;可变变量…...

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). )

Jump( 2015-2016 ACM-ICPC Northeastern European Regional Contest (NEERC 15). ) 题目大意&#xff1a; 在这个交互式问题中&#xff0c;你需要通过查询系统&#xff0c;逐步找出隐藏的位字符串 S。给定一个偶数 n&#xff0c;表示目标位字符串 S 的长度&#xff0c;你需要通…...

uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!

此文章懒得排版了&#xff0c;为了找出这个bug, 星期六的晚上我从9点查到0点多&#xff0c;此时我心中一万个草泥马在崩腾&#xff0c;超级想骂人&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; uniCloud 不想…...

【Linux】冯诺依曼体系与操作系统理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充&#xff1a;理解系统调用…...

STM32之软件SPI

SPI传输更快&#xff0c;最大可达80MHz&#xff0c;而I2C最大只有3.4MHz。输入输出是分开的&#xff0c;可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意&#xff1a;所有设备需要共地&#xff0c;时钟线主机输出&…...

Python零基础学习第三天:函数与数据结构

一、函数基础 函数是什么&#xff1f; 想象你每天都要重复做同一件事&#xff0c;比如泡咖啡。函数就像你写好的泡咖啡步骤说明书&#xff0c;每次需要时直接按步骤执行&#xff0c;不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…...

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…...

顶点着色器和片段着色器

在Unity渲染中&#xff0c;**顶点着色器&#xff08;Vertex Shader&#xff09;和片段着色器&#xff08;Fragment Shader&#xff09;**是图形渲染管线中的两个核心阶段。我们可以通过一个比喻来理解它们的分工&#xff1a;想象你要画一幅由三角形组成的3D模型&#xff0c;顶点…...

std::optional详解

基础介绍 c17版本引入了std::optional特性&#xff0c;这一个类模板&#xff0c;基本的使用方法如下&#xff1a; std::optional<T> 这个新特性的含义是利用std::optional<T>创建的某个类型的对象&#xff0c;这个对象存储某个类型的值&#xff0c;这个值可能存在…...

Web三件套学习笔记

<!-- HTML --> HTML是超文本标记语言 1、html常用标签 块级标签 独占一行 可以设置宽度&#xff0c;高度&#xff0c;margin,padding 宽度默认所在容器的宽度 标签作用table定义表格h1 ~ h6定义标题hr定义一条水平线p定义段落li标签定义列表项目ul定义无序列表ol定…...

Scala 中trait的线性化规则(Linearization Rule)和 super 的调用行为

在 Scala 中&#xff0c;特质&#xff08;Trait&#xff09;是一种强大的工具&#xff0c;用于实现代码的复用和组合。当一个类混入&#xff08;with&#xff09;多个特质时&#xff0c;可能会出现方法冲突的情况。为了解决这种冲突&#xff0c;Scala 引入了最右优先原则&#…...

BetterJoy完整配置指南:5分钟让Switch手柄在PC上完美运行

BetterJoy完整配置指南&#xff1a;5分钟让Switch手柄在PC上完美运行 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.c…...

ARM PMU性能监控单元原理与实践指南

1. ARM PMU性能监控单元概述性能监控单元&#xff08;PMU&#xff09;是现代ARM处理器中用于硬件级性能分析的核心组件。它通过一组可编程的硬件计数器&#xff0c;实现对处理器内部各种关键事件的精确测量。这些事件涵盖了从指令执行、缓存访问到内存子系统行为等处理器活动的…...

从入门到实践:EEG公开数据集分类与应用场景全解析

1. EEG公开数据集入门指南刚接触脑电信号分析的研究者&#xff0c;常常会被一个问题困扰&#xff1a;"我应该从哪里获取可靠的EEG数据&#xff1f;"作为一个在这个领域摸爬滚打多年的研究者&#xff0c;我完全理解这种困惑。记得我第一次接触EEG研究时&#xff0c;光…...

搞定这 5 个全栈电商项目,面试别再用 Todo-List 凑数了

找独立开发练手项目或者写简历项目时&#xff0c;最忌讳两件事&#xff1a;一是太简单&#xff08;纯前端 Mock 数据&#xff0c;点两下就没了&#xff09;&#xff0c;二是太假&#xff08;一上来就硬套微服务、消息队列、高并发&#xff0c;结果自己根本Hold不住&#xff09;…...

FT231XQ USB串口桥接板设计解析与实战应用指南

1. 项目概述&#xff1a;从FT232R到FT231XQ的USB串口桥接板演进在嵌入式开发和硬件调试的日常工作中&#xff0c;一个可靠、小巧且功能清晰的USB转串口&#xff08;UART&#xff09;桥接板&#xff08;Breakout Board&#xff0c; 简称BoB&#xff09;几乎是工程师手边的标配工…...

CANoe诊断测试没CDD文件怎么办?手把手教你用Fault Memory窗口和CAPL脚本读取解析DTC故障码

CANoe诊断测试无CDD文件的实战解决方案&#xff1a;从Fault Memory到CAPL脚本全解析当CDD文件缺失或定义不清晰时&#xff0c;诊断测试工程师常常陷入困境。本文将深入探讨如何利用Fault Memory窗口的基础功能&#xff0c;并通过CAPL脚本实现更灵活、更强大的故障码读取与解析方…...

DeepSeek代码风格检查避坑指南(内部审计报告首次披露:37个被忽略的合规红线)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek代码风格检查的合规性本质与审计背景 DeepSeek代码风格检查并非单纯的技术偏好约束&#xff0c;而是嵌入研发治理链条中的合规性控制节点。其本质是将编程实践与组织级安全策略、行业监管要求&…...

AB包相关知识

Lua与AB包/Addressables以及YooAsset 摘自千问&#xff1a; Lua 是菜谱&#xff08;逻辑&#xff09;&#xff1a;决定了菜怎么做&#xff0c;味道如何。因为你需要随时换菜谱&#xff08;热更新&#xff09;&#xff0c;所以菜谱不能死板地印在墙上&#xff08;编译进主包&a…...

Claude Code用户告别封号与Token焦虑,无缝切换至Taotoken平台

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Claude Code用户告别封号与Token焦虑&#xff0c;无缝切换至Taotoken平台 对于依赖Claude Code进行编程辅助的开发者而言&#xff…...

理想二极管控制器:用MOSFET实现毫伏级压降的电源管理方案

1. 理想二极管控制器&#xff1a;告别传统二极管的压降损耗 在电源设计、电池保护、太阳能板并联这些领域里&#xff0c;二极管是个再常见不过的元件。我们用它来防反接、做整流、实现“或”逻辑供电&#xff0c;几乎不假思索。但如果你设计过一个需要处理大电流、低电压的系统…...