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

Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析

目录

  1. RESTful API 设计规范
  2. Spring MVC 核心注解解析
  3. 静态资源处理策略
  4. JSON 数据交互全解
  5. 高频问题与最佳实践

一、RESTful API 设计规范

1.1 核心原则

原则说明示例 URI
资源为中心URI 使用名词(复数形式)/users ✔️ /getUser
HTTP 方法语义化GET(查)、POST(增)、PUT(改)、DELETE(删)DELETE /users/1
无状态通信服务端不保存客户端会话状态每次请求携带完整认证信息

1.2 完整代码示例

@RestController
@RequestMapping("/api/v1/users")
public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.findById(id);return user != null ? ResponseEntity.ok(user) : ResponseEntity.notFound().build();}@PostMappingpublic ResponseEntity<User> createUser(@Valid @RequestBody User user) {User savedUser = userService.save(user);URI location = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(savedUser.getId());return ResponseEntity.created(location).body(savedUser);}
}

1.3 高级技巧

  • HATEOAS 实现(响应中嵌入资源链接):
@GetMapping("/{id}/orders")
public CollectionModel<Order> getUserOrders(@PathVariable Long id) {List<Order> orders = orderService.findByUserId(id);Link selfLink = linkTo(methodOn(UserController.class).getUserOrders(id)).withSelfRel();return CollectionModel.of(orders, selfLink);
}
  • 响应示例
{"content": [ ... ],"_links": {"self": { "href": "/users/1/orders" }}
}

二、Spring MVC 核心注解解析

2.1 参数绑定注解

注解作用场景示例代码
@PathVariable从 URI 路径提取变量@GetMapping("/{id}")id=1
@RequestParam绑定查询参数(支持默认值)@RequestParam(name="page", defaultValue="1")
@RequestBody将请求体 JSON 映射到 Java 对象public User createUser(@RequestBody User user)

2.2 元数据获取注解

// 获取 Cookie 值
@GetMapping("/session")
public String getSession(@CookieValue("JSESSIONID") String sessionId) { ... }// 读取请求头
@GetMapping("/headers")
public String getHeader(@RequestHeader("User-Agent") String userAgent) { ... }

2.3 作用域注解

注解作用域生命周期
@SessionAttribute读取 Session 属性用户会话期间有效
@ModelAttribute预加载模型数据每次请求前执行

三、静态资源处理策略

3.1 配置方式对比

方式配置示例适用场景
缺省 Servlet 放行web.xml 配置 <servlet-mapping>传统项目兼容
resources 标签<mvc:resources mapping="/img/**" location="/img/"/>明确指定资源目录
default-servlet-handler<mvc:default-servlet-handler/>快速放行所有静态资源

3.2 常见问题

  • JSP 未被放行:需通过视图解析器处理,不属于静态资源。
  • 路径冲突:避免控制器映射与静态资源路径重叠(如 /js/**/js/controller)。

四、JSON 数据交互全解

4.1 响应 JSON 配置

@RestController // = @Controller + @ResponseBody
public class ApiController {@GetMapping("/city/{id}")public City getCity(@PathVariable int id) {return cityService.findById(id);}
}

4.2 序列化控制

@Data
public class Product {@JsonIgnoreprivate String internalCode; // 不序列化@JsonFormat(pattern = "yyyy-MM-dd")private Date createTime;     // 日期格式化
}

4.3 依赖配置

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.14.0</version>
</dependency>

五、高频问题与最佳实践

5.1 常见错误

  1. RESTful 路径设计混乱
    • /getUserOrders?userId=1 → ✅ GET /users/1/orders
  2. HTTP 方法误用
    • ❌ 用 POST 请求更新资源 → ✅ 使用 PUT/PATCH
  3. JSON 日期序列化错误
    • 解决方案:@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")

5.2 性能优化

  • 静态资源缓存:配置 Cache-Control 头减少重复请求。
  • Jackson 延迟加载:对大数据集使用 @JsonView 控制序列化字段。

相关文章:

Spring MVC 全栈指南:RESTful 架构、核心注解与 JSON 实战解析

目录 RESTful API 设计规范Spring MVC 核心注解解析静态资源处理策略JSON 数据交互全解高频问题与最佳实践 一、RESTful API 设计规范 1.1 核心原则 原则说明示例 URI资源为中心URI 使用名词&#xff08;复数形式&#xff09;/users ✔️ /getUser ❌HTTP 方法语义化GET&…...

【第43节】实验分析windows异常分发原理

目录 前言 一、异常处理大致流程图 二、实验一&#xff1a;分析 KiTrap03 三、实验二&#xff1a;分析CommonDispatchException 四、代码探究&#xff1a;分析 KiDispatchException 函数 五、代码探究&#xff1a;伪代码分析用户层KiUserExceptionDispatcher 前言 在Wind…...

自动化测试概念篇

文章目录 目录1. 自动化1.1 自动化概念1.1.1 回归测试 1.2 自动化分类1.3 自动化测试金字塔 2. web自动化测试2.1 驱动2.1.1 安装驱动管理2.1.2 selenium库 3. Selenium3.1 一个简单的web自动化示例3.2 selenium驱动浏览器的工作原理 目录 自动化web自动化测试Selenium 1. 自…...

「数据可视化 D3系列」之开篇:开启数据可视化之旅

一、系列介绍 欢迎来到《快速学习D3.js》系列&#xff01;在这个系列中&#xff0c;我们将一起从零开始掌握D3.js&#xff08;Data-Driven Documents&#xff09;&#xff0c;一个强大的JavaScript库&#xff0c;用于创建动态、交互式的数据可视化。 无论你是前端开发者、数据…...

编译构建 WSO2 产品时的一些注意事项

编译构建 WSO2 产品时的一些注意事项 1、JDK 版本2、maven 版本3、npm 和 node 版本4、编译命令示例 1、JDK 版本 对于 WSO2 ESB、WSO2 EI 老产品&#xff0c;可以直接使用 JDK 1.8对于 WSO2 APIM、WSO2 IS、WSO2 MI 等产品的新版本&#xff0c;需要 JDK 11 以上 特别注意&…...

字符串与相应函数(下)

字符串处理函数分类 求字符串长度&#xff1a;strlen长度不受限制的字符串函数&#xff1a;strcpy,strcat,strcmp长度受限制的字符串函数:strncpy,strncat,strncmp字符串查找&#xff1a;strstr字符串切割&#xff1a;strtok错误信息报告&#xff1a;strerror字符操作&#xf…...

驾驭 Linux 云: JavaWeb 项目安全部署

目录 1. 引言 2. Linux 基础指令 2.1 ls 展示目录/文件 2.2 pwd 查看所在路径 2.3 mkdir 创建文件夹 2.4 cd 切换路径 2.5 touch 创建文件 2.6 rm 删除文件 2.6 rm -r/rf 删除文件夹 2.7 rz/sz 上传/下载文件 2.7.1 rz 上传文件 2.7.2 sz 下载文件 2.8 mv 移动文件…...

【MySQL数据库】InnoDB存储引擎:逻辑存储结构、内存架构、磁盘架构

逻辑存储结构 一个数据库是由一张张表组成的&#xff0c;而表中是由一个个段构成的&#xff0c;一个段是由区构成的&#xff0c;区空间是由页构成的&#xff0c;页是行构成的。 ①表空间&#xff1a;.ibd文件&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储…...

HJ16 购物单

https://www.nowcoder.com/exam/oj/ta?tpId37 HJ16 购物单 描述 王强决定把年终奖用于购物&#xff0c;他把想买的物品分为两类&#xff1a;主件与附件。 主件可以没有附件&#xff0c;至多有 2个附件。附件不再有从属于自己的附件。如果要买归类为附件的物品&#xff0c;必…...

SLAM文献之DM-VIO: Delayed Marginalization Visual-Inertial Odometry

1. 算法概述 DM-VIO (Delayed Marginalization Visual-Inertial Odometry) 是一种基于延迟边缘化的视觉-惯性里程计算法&#xff0c;它结合了视觉和惯性测量单元(IMU)的数据进行位姿估计。该算法是VINS-Mono的改进版本&#xff0c;主要创新点在于采用了一种延迟边缘化策略&…...

【信息安全】黑芝麻A1000芯片安全启动方案

基于黑芝麻A1000芯片的安全启动方案实现指南: 一、安全启动流程架构设计 // 启动阶段状态机定义(基于A1000芯片手册) typedef enum {ROM_BOOT = 0x01, // BootROM验证 SPL_VERIFY = 0x02, // 二级加载器验证 ATF_SIGN_CHECK = 0x03, // ARM Trusted Firmware验证 OS_LOADE…...

初识Redis · list和hash类型

目录 前言&#xff1a; 哈希类型 基本命令 编码方式 应用场景 列表 基本命令 编码方式 应用场景 前言&#xff1a; 前文我们已经介绍了string的基本使用&#xff0c;以及对应的基本命令&#xff0c;最后也是简单的理解了一下string的应用场景&#xff0c;比如计数统计…...

golang-非orm数据库的操作与对比 database/sql、sqlx 和 sqlc

简单介绍 database/sql database/sql 是一个标准库软件包&#xff0c;负责与数据库&#xff08;主要是 SQL 关系数据库&#xff09;的连接和交互。 它为类 SQL 交互提供泛型接口、类型和方法。database/sql 在创建时将简单易用纳入考量&#xff0c;配置为支持与类 SQL 数据库…...

‌DeepSeek模型在非图形智能体的应用中是否需要GPU

答&#xff1a;不一定 概念 1、是否需要GPU与应用是否图形处理应用无关 2、文本内容智能体大多也需要GPU来提供更好的性能 3、‌DeepSeek模型在非图形智能体的应用中是否需要GPU取决于具体的模型版本和部署环境 不需要GPU的模型版本 ‌DeepSeek-R1-1.5B‌&#xff1a; 这…...

RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法

RadioMaster POCKET遥控器进入ExpressLRS界面一直显示Loading的问题解决方法 问题描述解决方法 问题描述 有一天我发现我的 RadioMaster POCKET 遥控器进入 ExpressLRS 设置界面时&#xff0c;界面却一直停留在 “Loading” 状态&#xff0c;完全无法进入设置界面。 我并没有…...

idea的快捷键使用以及相关设置

文章目录 快捷键常用设置 快捷键 快捷键作用ctrlshift/注释选中内容Ctrl /注释一行/** Enter文档注释ALT SHIFT ↑, ALT SHIFT ↓上下移动当前代码Ctrl ALT L格式化代码Ctrl X删除所在行并复制该行Ctrl D复制当前行数据到下一行main/psvm快速生成入口程序soutSystem.o…...

【DDR 内存学习专栏 1.4 -- DDR 的 Bank Group】

文章目录 BankgroupBankgroup 与 Bank 的关系 DDR4 中的 BankgroupDDR4-3200 8Gb芯片为例组织结构访问场景 实际应用示例 Bankgroup Bankgroup是DDR4及后续标准(DDR5)中引入的一个更高层次的组织结构。它将多个Bank组合在一起形成一个Bankgroup&#xff0c;目的是为了进一步提…...

新晋前端框架技术:小程序容器与SuperApp构建

2025年&#xff0c;前端开发领域持续迭代&#xff0c;主流框架如Vue、React等纷纷推出新版本&#xff0c;在性能、开发效率及适用场景上实现突破&#xff0c;进一步巩固其技术地位。 1. Vue 3的全面普及与创新 Vue 3通过多项核心特性优化了开发体验&#xff1a; Teleport组件…...

强化学习:基于价值的方法做的是回归,基于策略的方法做的是分类,可以这么理解吗?

在强化学习领域,基于价值的方法(Value-based Methods)和基于策略的方法(Policy-based Methods)是两种核心范式。本文将从目标函数、优化机制以及与机器学习任务的类比角度,探讨这两种方法是否可以被分别理解为回归和分类任务,并深入分析其内在逻辑。 一、基于价值的方法…...

蓝耘元生代AIDC OS:一站式MaaS平台,助力AI应用快速落地

文章目录 引言1. 什么是MaaS平台&#xff1f;MaaS平台的典型特点 2. 蓝耘元生代AIDC OS 热门模型3. 快速入门&#xff1a;如何调用API&#xff1f;步骤1&#xff1a;注册并获取API Key步骤2&#xff1a;调用API&#xff08;Python示例&#xff09; 4. 与Chatbox搭配使用&#x…...

3.2.2.3 Spring Boot配置拦截器

在Spring Boot应用中配置拦截器&#xff08;Interceptor&#xff09;可以对请求进行预处理和后处理&#xff0c;实现如权限检查、日志记录等功能。通过实现HandlerInterceptor接口并注册到Spring容器&#xff0c;拦截器可以自动应用到匹配的请求路径。案例中&#xff0c;创建了…...

Python----机器学习(基于PyTorch的蘑菇逻辑回归)

Logistic Regression&#xff08;逻辑回归&#xff09;是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型&#xff0c;通过Sigmoid函数将输出映射到[0, 1]范围内&#xff0c;表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 本例使用了…...

Python----机器学习(基于PyTorch的乳腺癌逻辑回归)

Logistic Regression&#xff08;逻辑回归&#xff09;是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型&#xff0c;通过Sigmoid函数将输出映射到[0, 1]范围内&#xff0c;表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 在本例中&…...

如何配置AWS EKS自动扩展组:实现高效弹性伸缩

本文详细讲解如何在AWS EKS中配置节点组&#xff08;Node Group&#xff09;和Pod的自动扩展&#xff0c;优化资源利用率并保障应用高可用。 一、准备工作 工具安装 安装并配置AWS CLI 安装eksctl&#xff08;EKS管理工具&#xff09; 安装kubectl&#xff08;Kubernetes命令…...

【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将开启Qt的学习&#xff0c;Qt是一个较为古老但仍然在GUI图形化界面设计中有着举足轻重的地位&#xff0c;因为它适合嵌入式和多种平台而被广泛使用…...

用Python打造去中心化知识产权保护系统:科技驱动创作者权益新方案

用Python打造去中心化知识产权保护系统:科技驱动创作者权益新方案 近年来,区块链技术和去中心化系统的兴起为知识产权保护提供了新的可能性。在传统模式下,知识产权保护通常依赖于集中化管理机构,这种方式不仅成本高,还可能因不透明导致权益争议。于是,我们萌生了一个设…...

CVE重要漏洞复现-Fastjson1.2.24-RCE漏洞

本文仅供网络学习&#xff0c;不得用于非法目的&#xff0c;否则后果自负 1、漏洞简介 fastjson是阿里巴巴的开源JSON解析库&#xff0c;它可以解析JSON格式的字符串&#xff0c;也可以从JSON字符串反序列化到JavaBean。即fastjson的主要功能就是将Java Bean序列化成JSON字符…...

Windows 图形显示驱动开发-WDDM 1.2功能—显示设备硬件软件认证要求

一、容器技术id技术的硬件级实现要求 1.1 EDID规范深度适配 1.物理层要求&#xff1a; 必须使用EDID 2.0及以上版本数据结构 容器ID需写入VSDB区块的0x50-0x6F区域&#xff0c;采用Little-Endian格式存储 允许的最大传输延迟&#xff1a;I2C总线时钟频率≤100KHz时&#xf…...

Coze流搭建--写入飞书多维表格

目标 使用coze搭建一个业务流&#xff0c;将业务流生产出的数据写入飞书保存 测试业务流 使用图片生成插件&#xff0c;配置prompt生产图片&#xff0c;将生产的结果写入飞书文档 coze流 运行后最终效果 搭建流程 第一步&#xff1a;飞书创建多维表格 注册飞书创建多维表…...

4.14:计组第三章

一、数据的强制类型转换与存储 1、边界对齐与大端小端方式 2、真-强制类型转换 二、存储器的基本知识(不包含磁盘存储器) 1、主存储器 (1)...

Vue3+Vite前端项目部署后部分图片资源无法获取、动态路径图片资源报404错误的原因及解决方案

目录 Vue3vite前端项目部署后部分图片资源无法获取、动态路径图片资源报404错误的原因及解决方案 一、情景介绍 1、问题出现的场景 2、无法加载的图片写法 二、反向代理原理简介 三、造成该现象的原因 四、解决方案 1、放弃动态渲染 2、在页面挂载的时候引入图片资源 …...

Nacos操作指南

第一章&#xff1a;Nacos 概述 1.1 什么是 Nacos&#xff1f; 定义与定位 Nacos&#xff08;Naming and Configuration Service&#xff09;是阿里巴巴于2018年开源的动态服务发现、配置管理和服务管理平台&#xff0c;现已成为微服务生态中的重要基础设施。其核心价值在于帮…...

2025年常见渗透测试面试题-红队面试宝典下(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 一、Java反序列化过程及利用链示例 二、大型网络渗透经验 三、Cobalt Strike的两种Dump Hash区别 四…...

扩增子分析|基于R语言microeco包进行微生物群落网络分析(network网络、Zi-Pi关键物种和subnet子网络图)

一、引言 microeco包是福建农林大学姚敏杰教授团队开发的扩增子测序集成分析。该包综合了扩增子测序下游分析的多种功能包括群落组成、多样性、网络分析、零模型等等。通过简单的几行代码可实现复杂的分析。因此&#xff0c;microeco包发表以来被学界广泛关注&#xff0c;截止2…...

flutter-Text等组件出现双层黄色下划线的问题

文章目录 1. 现象2. 原因3. 解决方法 1. 现象 这天我正在写Flutter项目的页面功能&#xff0c;突然发现我的 Text 文字出现了奇怪的样式&#xff0c;具体如下&#xff1a; 文字下面出现了双层黄色下划线文字的空格变得很大&#xff0c;文字的间距也变得很大 我百思不得其解&a…...

优化运营、降低成本、提高服务质量的智慧物流开源了

智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...

leetcode第二题

功能函数 typedef struct ListNode {int val;struct ListNode *next; } ListNode;struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {ListNode *dummy (ListNode *)malloc(sizeof(ListNode));ListNode *cur dummy;int carry 0; //carry是进位值…...

QT实现带快捷键的自定义 QComboBox 控件

在现代GUI应用程序中&#xff0c;用户界面的设计不仅要美观&#xff0c;还要提供高效的交互方式。本文将介绍一个自定义的QCComboBox类&#xff0c;它是一个基于Qt的组合框&#xff08;QComboBox&#xff09;&#xff0c;支持为每个下拉项添加快捷键。通过这些快捷键&#xff0…...

聊聊类模板

我们来聊聊类模板&#xff0c;从基础到实际例子&#xff0c;让你更容易理解。 什么是类模板&#xff1f; 类模板是一种模板&#xff0c;允许我们定义一个可以处理任意数据类型的类。简单来说&#xff0c;就是我们可以编写一个类的“蓝图”&#xff0c;然后在需要的时候使用不…...

使用Python进行AI图像生成:从GAN到风格迁移的完整指南

AI图像生成是一个非常有趣且前沿的领域&#xff0c;结合了深度学习和计算机视觉技术。以下是一些使用Python和相关库进行AI图像生成的创意和实现思路&#xff1a; 1. 使用GAN&#xff08;生成对抗网络&#xff09; 基本概念&#xff1a;GAN由两个神经网络组成&#xff1a;生成…...

Java 设计模式:外观模式详解

Java 设计模式&#xff1a;外观模式详解 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为复杂的子系统提供一个简化的统一接口&#xff0c;隐藏子系统的复杂性&#xff0c;使客户端更方便地使用系统。外观模式就像一个“门面”&#xff…...

微信小程序中实现某个样式值setData改变时从350rpx到200rpx的平滑过渡效果

方案一&#xff1a;使用 CSS Transition&#xff08;推荐简单场景&#xff09; WXSS /* 在对应组件的WXSS中添加 */ .transition-effect {transition: all 0.4s ease-in-out;will-change: bottom; /* 启用GPU加速 */ }WXML <!-- 修改后的WXML --> <view class"…...

LINUX基础 [四] - Linux工具

目录 软件包管理器yum Linux开发工具vim vim的基本概念 vim的三种常用模式 vim的简单配置 vim常用模式的基本操作 命令模式 底行模式 处理vim打开文件报错的问题 Linux编译器-gcc/g使用 为什么我们可以用C/C做开发呢&#xff1f; 预处理&#xff08;进行宏替换&#x…...

Spring Cloud之远程调用OpenFeign最佳实践

目录 OpenFeign最佳实践 问题引入 Feign 继承方式 创建Module 引入依赖 编写接口 打Jar包 服务提供方 服务消费方 启动服务并访问 Feign 抽取方式 创建Module 引入依赖 编写接口 打Jar包 服务消费方 启动服务并访问 服务部署 修改pom.xml文件 观察Nacos控制…...

【QT】 常用控件【输入类】

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Qt 目录 一&#xff1a;&#x1f525; 输入类控件 &#x1f98b; Line Edit -- 单行输入框&#x1f380; 录入个人信息&#x1f380; 正则表达式验证输入框数据&#x1f380; 验证两次输入密码一致…...

【Python】读取xyz坐标文件输出csv文件

Python读取xyz坐标文件输出csv文件 import sys import numpy as np import pandas as pd from tqdm import tqdm import cv2 import argparsedef read_xyz(file_path):with open(file_path, "r") as f: # 打开文件data f.readlines() # 读取文件datas []for …...

深度解析Redis过期字段清理机制:从源码到集群化实践 (一)

深度解析Redis过期字段清理机制&#xff1a;从源码到集群化实践 一、问题本质与架构设计 1.1 过期数据管理的核心挑战 Redis连接池时序图技术方案 ​​设计规范&#xff1a;​ #mermaid-svg-Yr9fBwszePgHNnEQ {font-family:"trebuchet ms",verdana,arial,sans-se…...

MapReduce实验:分析和编写WordCount程序(对文本进行查重)

实验环境&#xff1a;已经部署好的Hadoop环境 Hadoop安装、配置与管理_centos hadoop安装-CSDN博客 实验目的&#xff1a;对输入文件统计单词频率 实验过程&#xff1a; 1、准备文件 test.txt文件&#xff0c;它是你需要准备的原始数据文件&#xff0c;存放在你的 Linux 系…...

【中大厂面试题】腾讯云 java 后端 最新面试题

腾讯云&#xff08;一面&#xff09; 1. spring 和 springboot的区别是什么&#xff1f; 配置方式的区别&#xff1a;Spring 应用的配置较为繁琐&#xff0c;通常需要编写大量的 XML 配置文件或者使用 Java 注解进行配置。例如&#xff0c;配置数据源、事务管理器等都需要手动…...

Redis存储“大数据对象”的常用策略及StackOverflowError错误解决方案

Hi&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 在一些功能的开发中&#xff0c;我们一般会有一些场景需要将得到的数据先暂时的存储起来&#xff0c;以便后面的接口或业务使用&#xff0c;这种场景我们一般常用的场景就是将数据暂时存储在缓存中&#xff0c;之后再…...