SpringMVC相关梳理

SpringMVC 返回值类型

(一)核心返回值类型分类

  1. 视图渲染类:用于跳转并渲染页面,如String(指定视图名)、ModelAndView(视图 + 数据)。
  2. 数据返回类:用于返回数据(而非页面),如@ResponseBody + Object(返回 JSON/XML 等)、ResponseEntity(自定义响应头、状态码 + 数据)。
  3. 响应控制类:直接控制响应内容,如void(通过HttpServletResponse手动写响应)、HttpServletResponse(同上)。
  4. 异步处理类:用于异步请求处理,如DeferredResultCallable
  5. 重定向专用类redirect: + RedirectAttributes(重定向时传递数据,避免request失效问题)。
  6. 转发专用类forward:(通过String返回值指定转发路径)。

(二)返回值选择指南表格

应用场景

推荐返回值类型

示例代码

显示 JSP/Thymeleaf 页面

String

return "index";(对应 index.jsp/index.html)

返回 JSON 数据(接口)

@ResponseBody + Object

@ResponseBody public User getUser() { return user; }

精确控制响应(头、状态码)

ResponseEntity

return new ResponseEntity<>(data, HttpStatus.OK);

文件下载

ResponseEntity<byte[]>void

return new ResponseEntity<>(fileBytes, headers, HttpStatus.OK);

异步请求处理(如长轮询)

DeferredResultCallable

public DeferredResult<String> asyncHandle() { ... }

重定向并传递数据

String + RedirectAttributes

public String redirect(RedirectAttributes attr) { attr.addFlashAttribute("msg", "success"); return "redirect:/index"; }

服务器内部转发

String(带forward:前缀)

return "forward:/user/detail";

直接手动写响应内容

void(配合HttpServletResponse

public void writeResponse(HttpServletResponse response) { response.getWriter().write("hello"); }

请求转发(Forward)

(一)基本概念

请求转发是服务器内部的行为,客户端仅发起一次请求,服务器在内部将该请求转发到另一个资源。

(二)工作原理

客户端请求服务器(Servlet A) → 转发服务器(Servlet B) → 响应客户端

(三)特点

  1. URL 不变:浏览器地址栏始终显示原始请求的 URL,不会发生变化。
  2. 一次请求:整个转发流程中,客户端仅发送一次 HTTP 请求。
  3. 共享 request:转发前后的资源(如 Servlet、JSP 等)共享同一个request对象,可通过request传递数据。
  4. 服务器内部操作:转发过程对客户端透明,客户端无法感知到服务器内部的转发行为。
  5. 范围限制:仅能转发到当前应用内部的资源,无法转发到外部 URL(如其他网站)。

(四)使用场景

  1. 控制器完成业务逻辑处理后,跳转到用于数据展示的页面(如 JSP)。
  2. 需要在不同资源之间传递数据(如从控制器向页面传递查询结果)时。
  3. 要求保持浏览器地址栏 URL 不变的页面跳转场景。

重定向(Redirect)

(一)基本概念

重定向是客户端的行为,服务器接收到客户端请求后,会返回一个响应(告知客户端 “请去访问另一个 URL”),随后客户端会根据该响应发起新的请求。

(二)工作原理

客户端请求① → 服务器响应(302重定向状态码) → 客户端请求② → URL对应的服务器响应客户端

(三)特点

  1. URL 改变:浏览器地址栏会更新为新的目标 URL,显示最终访问的地址。
  2. 两次请求:客户端会先后发起两次 HTTP 请求,第一次请求原始 URL,第二次请求重定向后的 URL。
  3. 不共享 request:两次请求分别对应独立的request对象,无法通过request传递数据。
  4. 无范围限制:可重定向到任意 URL,包括当前应用内部资源和外部网站(如从自身系统跳转到百度)。
  5. 客户端知情:客户端能感知到重定向行为(通过地址栏变化或网络请求记录)。

(四)使用场景

  1. 表单提交后(如用户注册、登录提交),防止刷新页面导致重复提交(即 Post-Redirect-Get 模式)。
  2. 需要跳转到外部网站时(如从应用内跳转到第三方支付平台)。
  3. 用户完成登录 / 注销操作后,跳转到目标页面(如登录后跳转到首页,注销后跳转到登录页)。
  4. 要求改变浏览器地址栏 URL 的场景(如优化 URL 显示,隐藏内部接口路径)。

请求转发与重定向对比表格

特性

请求转发(Forward)

重定向(Redirect)

请求次数

1 次

2 次

URL 变化

不变(显示原始 URL)

改变(显示目标 URL)

数据共享

共享同一个request对象

不共享request对象(两次请求独立)

速度

较快(仅服务器内部处理,无客户端往返)

较慢(需客户端发起第二次请求,有网络往返)

目标范围

仅能跳转至同一应用内部资源

可跳转至任意 URL(内部 / 外部)

浏览器感知

无感知(不知道转发过程)

有感知(地址栏变化、可查看两次请求)

实现方式(SpringMVC

return "forward:url"

return "redirect:url"

实际应用示例(SpringMVC 环境)

(一)请求转发示例

/*** 返回String类型,实现请求转发* @return 转发目标路径*/@RequestMapping("/save4.do")public String save4() {System.out.println("业务逻辑执行完成(如数据保存)...");// 转发到/pages目录下的suc.jsp页面return "forward:/pages/suc.jsp";}

(二)重定向示例

/*** 返回String类型,实现重定向* @return 重定向目标路径*/@RequestMapping("/save5.do")public String save5() {System.out.println("业务逻辑执行完成(如表单提交)...");// 重定向到/pages目录下的suc.jsp页面return "redirect:/pages/suc.jsp";}

选择原则

(一)优先选择请求转发的场景

  1. 需保持浏览器地址栏 URL 不变时。
  2. 需在不同资源(如控制器→页面、控制器→控制器)之间通过request传递数据时。
  3. 仅需跳转到当前应用内部页面,且对跳转性能有较高要求时。

(二)优先选择重定向的场景

  1. 表单提交后,需防止刷新页面导致重复提交时(必选 Post-Redirect-Get 模式)。
  2. 需跳转到外部网站(如第三方平台、合作系统)时。
  3. 用户完成登录、注销等操作后,需跳转到目标页面(如首页、个人中心)时。
  4. 需改变浏览器地址栏 URL,隐藏内部接口路径或优化 URL 显示时。
  5. 需实现跨应用跳转(如从 A 应用跳转到 B 应用)时。

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

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

相关文章

Docker化性能监控平台搭建:JMeter+InfluxDB+Grafana全攻略

你作为一名DevOps工程师或测试专家&#xff0c;正在监控一个高并发微服务系统&#xff1a;突发流量峰值导致响应延迟&#xff0c;服务器CPU飙升&#xff0c;但你只能手动查看日志&#xff0c;优化起来像大海捞针。这时&#xff0c;DockerJMeterInfluxDBGrafana的“梦幻四重奏”…

Adobe Acrobat 中通过 JavaScript 调用 Web 服务

强大的JavaScript支持&#xff0c;允许用户通过脚本自动化处理PDF文档。本文将详细介绍如何在Adobe Acrobat环境中使用JavaScript调用Web服务&#xff0c;包括基础概念、实现方法、代码示例以及常见问题解决方案。 第一部分&#xff1a;基础概念与技术背景 1.1 Acrobat JavaScr…

SpringCloud OpenFeign 远程调用(RPC)(三)

目录 1 概念导入 2 添加依赖 3 在启动类上添加注解 4 编写对应的接口 5 注入并调用 6 日志 7 超时控制 8 超时重试 9 拦截器 10 Fallback兜底 1 概念导入 Spring Cloud OpenFeign Features :: Spring Cloud Openfeign 2 添加依赖 <!-- 远程调用 --><depen…

【Flask】测试平台开发,登陆重构

概述我们在开篇的时候实现了简单的登陆功能&#xff0c;也实现了一个前后端联调的登陆功能&#xff0c;但是你有没有发现&#xff0c;那个登陆只是一个简单的登陆&#xff0c;且密码在接口返回的过程中是铭文密码&#xff0c;在生产环境中使用肯定是不行的&#xff0c;一般密码…

【Bluedroid】A2DP Source设备音频数据读取机制分析(btif_a2dp_source_read_callback)

本文聚焦Android 蓝牙 A2DP Source设备的音频数据读取核心逻辑,深入解析关键回调函数btif_a2dp_source_read_callback的功能实现,包括从 HAL(硬件抽象层,支持 HIDL/AIDL 两种传输方式)或 UIPC(用户空间进程间通信)获取音频数据的路径选择机制,以及数据下溢(Underflow)…

多方调研赋能AI+智慧消防 豪越科技人工智能创新获认可

8月26日&#xff0c;中国职业安全健康协会城市及社区安全发展专业委员会秘书长汪卫国以及常务副秘书长黄强亮等诸位领导到访委员单位豪越科技&#xff0c;展开了实地的调研活动并给予相关指导。此次调研着重于了解豪越科技自主研发的“AI消防救援一体化安全管控平台”&#xff…

算法---字符串

一、算法说明 字符串是一种类型&#xff0c;他不是一种算法&#xff0c;所以我们在处理这方面的问题的时候&#xff0c;需要结合其他的算法 二、题目 最长公共前缀 1、题目 最长公共前缀 2、解题思路 解法一&#xff1a;我们可以先让两个相互比较&#xff0c;然后在将比较…

鸿蒙Next导航与路由指南:组件导航与页面路由的完美协作

一次搞懂HarmonyOS NEXT中的两种导航方式&#xff0c;打造流畅的应用内跳转体验在鸿蒙应用开发中&#xff0c;流畅的页面导航和路由是提升用户体验的关键。HarmonyOS NEXT提供了组件导航&#xff08;Navigation&#xff09; 和页面路由&#xff08;ohos.router&#xff09; 两种…

JavaScript原型详解——面试重点

一、原型的含义&#xff1a;JavaScript 中的“原型”既指 函数身上的 prototype 对象&#xff0c;也指 对象身上的 [[Prototype]] 隐藏链接&#xff1b;它俩共同构成了“原型链”&#xff0c;决定了“找不到属性时去哪里继续找”的规则。&#xff08;1&#xff09;原型对象(pro…

Vue3 全面介绍

Vue3&#xff08;正式名称为 Vue.js 3&#xff09;是 Vue.js 前端框架的第三个主要版本&#xff0c;于 2020 年 9 月正式发布。作为对 Vue2 的重大升级&#xff0c;Vue3 在核心架构、性能优化、开发体验等方面进行了全面重构&#xff0c;同时保持了 Vue 一贯的“渐进式框架”理…

HTTP 范围请求:为什么你的下载可以“断点续传”?

在现代网络应用中&#xff0c;我们习以为常的功能&#xff0c;如断点续传、多线程下载和在线视频快进快退&#xff0c;都依赖于 HTTP 协议中的一个强大特性&#xff1a;范围请求&#xff08;Range Requests&#xff09;。这项技术让客户端能够聪明地只请求文件的一部分&#xf…

万博智云联合华为云共建高度自动化的云容灾基线解决方案

一、摘要 近日&#xff0c;万博智云与华为云的深入合作再添新章——万博智云HyperBDR云容灾解决方案&#xff0c;顺利通过华为云专家团队评审和认证&#xff0c;正式被选为华为云基线解决方案&#xff08;Baseline Solution&#xff09;&#xff0c;并在华为云国际站上线。 Hy…

机器视觉opencv教程(二):二值化、自适应二值化

文章目录机器视觉opencv教程&#xff08;二&#xff09;&#xff1a;二值化、自适应二值化一、二值化图基础概念二、传统二值化方法&#xff08;基于全局固定阈值&#xff09;1. 阈值法&#xff08;THRESH_BINARY&#xff09;2. 反阈值法&#xff08;THRESH_BINARY_INV&#xf…

leetcode 461 汉明距离

一、问题描述二、解题思路采用位运算的思想来解决这个问题&#xff0c;首先&#xff0c;将x和y进行异或&#xff0c;x和y对应二进制位不同就会得到1&#xff0c;然后统计所有1的个数&#xff0c;即为汉明距离。三、代码实现时间复杂度&#xff1a;T(n)O(n)空间复杂度&#xff1…

ClickHouse 客户端

ClickHouse 客户端 ClickHouse提供两种客户端接口&#xff0c;分别基于 HTTP 和 TCP 协议 基于 HTTP 协议 主要用来支持轻量级的简单操作&#xff0c;方便跨平台和编程语言。 测试clickhouse联通性&#xff1a; $ curl http://localhost:8123/ Ok.在运行状况检查脚本中使用…

DBeaver 连接 PostgreSQL 教程

&#x1f6e0;️ DBeaver 连接 PostgreSQL 教程1️⃣ 安装 DBeaver打开官网&#xff1a;https://dbeaver.io/download/下载 Community Edition&#xff08;免费版&#xff09;&#xff0c;选择对应系统&#xff08;Windows / macOS / Linux&#xff09;。安装完成后&#xff0c…

Komo Searc-AI驱动的搜索引擎

本文转载自&#xff1a;Komo Searc-AI驱动的搜索引擎 - Hello123工具导航 ** 一、&#x1f50d; Komo Search 是什么&#xff1f; Komo Search 是一款基于人工智能技术的新一代交互式搜索引擎&#xff0c;它彻底改变了我们获取信息的方式 —— 从被动检索变成主动对话。不同于…

HTML 和 JavaScript 关联的基础教程

HTML 和 JavaScript 是构建现代网页的核心技术。HTML 负责页面结构&#xff0c;JavaScript 负责动态交互。以下是两者的基本关联方式。内联方式&#xff1a;直接在 HTML 中嵌入 JavaScript在 HTML 文件中&#xff0c;可以通过 <script> 标签直接编写 JavaScript 代码。这…

淘宝四个月造了一个超越美团的“美团”

本周三&#xff0c;美团发布最新一季财报&#xff0c;利润承压导致股价爆跌。只隔一天&#xff0c;阿里也发布了最新季报&#xff0c;最大的亮点是“淘宝闪购”即时零售业务&#xff0c;日均订单量站稳8000万单&#xff0c;峰值订单更是达到了1.2亿单。8000万单这个数字令市场眼…

Java开发MongoDB常见面试题及答案

基础概念题1. 什么是MongoDB&#xff1f;它的主要特点是什么&#xff1f;答案&#xff1a; MongoDB是一个开源的NoSQL文档型数据库&#xff0c;主要特点包括&#xff1a;文档存储&#xff1a;使用BSON格式存储数据&#xff0c;类似JSON结构无Schema约束&#xff1a;灵活的数据结…