Spring MVC请求与响应全解析:从参数绑定到异常处理

news2025/3/28 7:42:00

文章目录

  • 一、请求映射的艺术:RequestMapping深度解析
    • 1. 多级路径配置
    • 2. 六大核心属性
    • 3. RESTful风格实践
  • 二、参数绑定黑科技
    • 1. 智能绑定机制
      • 基础类型绑定
      • 对象嵌套绑定
      • 集合类型绑定
    • 2. 参数处理三剑客
  • 三、响应处理全攻略
    • 1. 视图跳转三种模式
      • 2. JSON交互实践
  • 四、文件操作实战
    • 1. 上传配置三要素
    • 2. 上传下载核心代码
  • 五、异常处理大师课
    • 1. 异常处理金字塔
    • 2. 全局异常处理方案
  • 总结


一、请求映射的艺术:RequestMapping深度解析

1. 多级路径配置

@Controller
@RequestMapping("/order")  // 一级路径
public class OrderController {
    
    @GetMapping("/create")  // 二级路径
    public String createOrder() {
        return "order/create";
    }
}

访问路径:/order/create

2. 六大核心属性

属性名作用说明示例值
value定义请求路径(默认属性),支持多路径配置@RequestMapping("/user/list")
@RequestMapping({"/list", "/all"})
method限制HTTP请求方法类型method = RequestMethod.POST
method = {GET, POST}
params要求请求必须包含指定参数(支持表达式)params = "userId"
params = "!age"
params = "type=admin"
headers校验请求头信息(支持正则匹配)headers = "Content-Type=text/*"
headers = "!X-Custom-Header"
consumes限制请求的媒体类型(Content-Type)consumes = "application/json"
consumes = "multipart/form-data"
produces指定响应内容的媒体类型(Accept)produces = "text/html"
produces = "application/pdf"

典型配置示例

@RestController
@RequestMapping(value = "/api/v1/products", 
                produces = MediaType.APPLICATION_JSON_VALUE)
public class ProductController {
    
    @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
                 headers = "X-Request-Source=WEB")
    public ResponseEntity<Product> createProduct(
        @RequestParam("file") MultipartFile file,
        @RequestParam("name") String productName
    ) {
        // 业务逻辑...
    }
}

3. RESTful风格实践

@RestController
@RequestMapping("/api/products")
public class ProductController {
    
    @GetMapping("/{id}")
    public Product getProduct(@PathVariable Long id) {
        return productService.findById(id);
    }
    
    @PostMapping
    public ResponseEntity<Product> createProduct(@RequestBody Product product) {
        Product saved = productService.save(product);
        return ResponseEntity.created(URI.create("/products/"+saved.getId()))
                           .body(saved);
    }
}

二、参数绑定黑科技

1. 智能绑定机制

基础类型绑定

<!-- JSP表单 -->
<input type="text" name="age">

@PostMapping("/user")
public String createUser(int age) { 
    // 自动将age转换为int类型
}

对象嵌套绑定

public class User {
    private Address address;
    // getters/setters
}
public class Address {
    private String city;
    // getters/setters
}
<input type="text" name="address.city">

集合类型绑定

<!-- 绑定List集合 -->
<input type="text" name="accounts[0].accountNumber">
<input type="text" name="accounts[1].accountNumber">

2. 参数处理三剑客

注解功能说明应用场景示例
@RequestParam1. 绑定单个请求参数
2. 支持参数默认值设置
3. 可指定是否必传
1. 普通表单提交
2.GET请求参数获取
3.参数名与方法参数名不一致时
@RequestParam("uname") String username
@RequestParam(defaultValue="1") int page
@PathVariable1. 绑定URI模板变量
2. 支持RESTful风格
3. 自动类型转换
1.RESTful API设计
2.资源定位场景
3.需要从URL路径提取参数
@GetMapping("/users/{id}")
public User getById(@PathVariable Long id)
@RequestBody1. 绑定请求体内容
2. 支持JSON/XML解析
3. 与HttpMessageConverter配合
1. 接收JSON请求体
2. 复杂对象传输
3.前后端分离项目数据交互
@PostMapping @RequestBody UserDTO user
@RequestBody List<Item> items

核心特性对比

特性@RequestParam@PathVariable@RequestBody
参数位置URL查询字符串URL路径请求体
数据格式键值对简单类型JSON/XML
是否必传可配置必传通常必传
默认值支持✔️
适合请求方法GET/POST所有方法POST/PUT

代码示例

@PostMapping("/update")
public String updateUser(@RequestParam("uname") String username,
                        @PathVariable Long userId,
                        @RequestBody UserDTO dto) {
    // 业务逻辑
}

三、响应处理全攻略

1. 视图跳转三种模式

响应方式核心特点典型应用场景
ModelAndView1. 数据与视图统一封装
2. 支持链式编程
3. 显式控制视图渲染逻辑
需要同时传递数据和视图的场景
传统MVC模式开发
动态页面内容渲染
字符串返回1. 简洁直观
2. 自动视图解析
3. 隐式数据绑定(配合Model对象)
简单页面跳转
前后端轻度交互
Thymeleaf/FreeMarker模板渲染
Servlet API1. 直接操作原生响应对象
2. 完全控制响应流程
3. 绕过视图解析器
文件下载/上传
流式数据返回
自定义HTTP头/状态码设置
二进制数据响应

对比示例

// 方式1:ModelAndView
public ModelAndView getUser() {
    ModelAndView mv = new ModelAndView();
    mv.addObject("user", userService.getCurrent());
    mv.setViewName("user/profile");
    return mv;
}

// 方式2:字符串返回
public String showPage(Model model) {
    model.addAttribute("data", fetchData());
    return "page/view";
}

// 方式3:Servlet API
public void download(HttpServletResponse response) {
    response.setHeader("Content-Disposition", "attachment;filename=file.txt");
    // 写入文件流
}

2. JSON交互实践

配置步骤

  1. 添加Jackson依赖
  2. 启用注解驱动
  3. 使用@ResponseBody

AJAX交互示例

$.ajax({
    type: "POST",
    url: "/api/users",
    contentType: "application/json",
    data: JSON.stringify({name: "John", age: 30}),
    success: function(data) {
        console.log("创建用户成功:", data);
    }
});
@PostMapping(consumes = "application/json")
@ResponseBody
public User createUser(@RequestBody User user) {
    return userService.save(user);
}

四、文件操作实战

1. 上传配置三要素

<!-- 配置文件解析器 -->
<bean id="multipartResolver" 
      class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="10485760" /> <!-- 10MB -->
</bean>

<!-- 静态资源放行 -->
<mvc:resources mapping="/uploads/**" location="/uploads/"/>

2. 上传下载核心代码

@PostMapping("/upload")
public String handleUpload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        String fileName = file.getOriginalFilename();
        file.transferTo(new File("/uploads/" + fileName));
        return "上传成功";
    }
    return "上传失败";
}

@GetMapping("/download")
public void downloadFile(HttpServletResponse response) {
    File file = new File("/uploads/report.pdf");
    response.setHeader("Content-Disposition", "attachment; filename=report.pdf");
    Files.copy(file.toPath(), response.getOutputStream());
}

五、异常处理大师课

1. 异常处理金字塔

       ┌──────────────┐
       │   Controller │
       └──────┬───────┘
              ↓
       ┌──────────────┐
       │    Service   │
       └──────┬───────┘
              ↓
       ┌──────────────┐
       │     DAO      │
       └──────┬───────┘
              ↓
       ┌──────────────┐
       │    异常处理器  │
       └──────────────┘

2. 全局异常处理方案

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(SysException.class)
    public ResponseEntity<String> handleCustomException(SysException ex) {
        return ResponseEntity.status(500)
                             .body("系统异常: " + ex.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public ModelAndView handleAllException(Exception ex) {
        ModelAndView mv = new ModelAndView("error/500");
        mv.addObject("errorMsg", "系统繁忙,请稍后再试");
        return mv;
    }
}

异常处理对比

处理方式优点缺点
局部处理1. 精准控制特定方法的异常处理逻辑
2. 处理逻辑与业务代码高度相关
1. 代码重复率高
2. 不利于统一异常格式
3. 维护成本随方法数量增加而上升
全局处理1. 统一管理所有异常
2. 减少重复代码
3. 便于维护异常处理策略
1. 需要合理设计异常体系
2. 对特定场景处理不够灵活
Servlet API1. 直接控制HTTP响应
2. 完全掌控响应细节
3. 无需框架额外支持
1. 破坏MVC分层结构
2. 与Spring解耦思想冲突
3. 测试维护困难

总结

  • 请求映射:合理使用多级路径规划API结构
  • 参数绑定:善用Spring的智能绑定机制
  • 响应处理:根据场景选择最佳响应方式
  • 文件操作:注意安全性和性能优化
  • 异常处理:建立统一的异常管理体系

性能优化小贴士

  • 使用@ResponseBody替代JSP视图
  • 开启GZIP压缩减少数据传输量
  • 对文件上传限制大小和类型
  • 使用异步处理耗时操作

通过掌握这些核心技巧,您将能够构建出高效、健壮的Spring MVC应用系统。

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

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

相关文章

SQLServer列转行操作及union all用法

1.创建测试表及数据sql如下 create table ScoresTable( Name varchar(50), ChineseScore int, MathScore int ) insert into ScoresTable values(小张,90,95) insert into ScoresTable values(小王,98,99) 2.表中查询结果如下 3.现需列转行显示&#xff0c;每行显示 姓名…

【GL010】C++

1.C中的const关键字有哪些用法&#xff1f; 1.修饰变量&#xff1a;表示变量的值不可修改。 const int a 10; 2.修饰指针&#xff1a; const int* p&#xff1a; // 指针指向的内容不可修改。 int* const p&#xff1a; // 指针本身不可修改。 const int* const…

(Arxiv-2025)MagicDistillation:用于大规模人像少步合成的弱到强视频蒸馏

MagicDistillation&#xff1a;用于大规模人像少步合成的弱到强视频蒸馏 paper是HKUST发布在Arxiv 2025的工作 paper title&#xff1a;MagicDistillation: Weak-to-Strong Video Distillation for Large-Scale Portrait Few-Step Synthesis Project page&#xff1a;地址 Abst…

Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表

目录 PowerQuery工具基础修改现有数据理规则PowerQuery抓取数据的两种方式多文件合并透视不同表结构多表追加数据透视追加与合并整理横向表格:逆透视 数据用拆分工具整理数据算账龄 不等步长值组合合并文件夹中所有文件PowerQuery处理CSV文件双行表头、带合并单元格如何做数据…

Simple-BEV的bilinear_sample 作为view_transformer的解析,核心是3D-2D关联点生成

文件路径models/view_transformers 父类 是class BiLinearSample(nn.Module)基于https://github.com/aharley/simple_bev。 函数解析 函数bev_coord_to_feature_coord的功能 将鸟瞰图3D坐标通过多相机&#xff08;针孔/鱼眼&#xff09;内外参投影到图像特征平面&#xff0…

同一个局域网的话 如何访问另一台电脑的ip

在局域网内访问另一台电脑&#xff0c;可以通过以下几种常见的方法来实现&#xff1a; ‌直接通过IP地址访问‌&#xff1a; 首先&#xff0c;确保两台电脑都连接在同一个局域网内。获取目标电脑的IP地址&#xff0c;这可以通过在目标电脑上打开命令提示符&#xff08;Windows系…

基于SpringBoot的名著阅读网站

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

Excel(实战):INDEX函数和MATCH函数、INDEX函数实战题

目录 经典用法两者嵌套查值题目解题分析 INDEX巧妙用法让数组公式&#xff0c;自动填充所有、有数据的行/列INDEX函数和SEQUENCE函数 经典用法两者嵌套查值 题目 根据左表查询这三个人的所有数据 解题分析 INDEX函数的参数&#xff1a;第1个参数是选定查找范围&#xff0c…

uniapp超简单ios截屏和上传app store构建版本方法

​ 假如使用windows开发ios的应用&#xff0c;上架的时候&#xff0c;你会发现&#xff0c;上架需要ios应用多种尺寸的ios设备的截图&#xff0c;和需要xcode等工具将打包好的ipa文件上传到app store的构建版本。 大部分情况下&#xff0c;我们的公司都没有这么多款ios设备来…

Netty源码—5.Pipeline和Handler一

大纲 1.Pipeline和Handler的作用和构成 2.ChannelHandler的分类 3.几个特殊的ChannelHandler 4.ChannelHandler的生命周期 5.ChannelPipeline的事件处理 6.关于ChannelPipeline的问题整理 7.ChannelPipeline主要包括三部分内容 8.ChannelPipeline的初始化 9.ChannelPi…

MySQL小练习

目录 一、单表查询 二、多表查询 一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…

检波、限幅、钳位电路

检波电路&#xff1a; 类似调制收音机信号&#xff1a;输入的基波和载波叠加成调制信号&#xff08;信号需要长距离里传输&#xff0c;频率要高&#xff0c;M级别的频率&#xff0c;所以要把低频信号叠在高频信号&#xff0c;才能把低频信号长距离传输&#xff0c;最后到达接收…

学习threejs,使用TextGeometry文本几何体

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.TextGeometry1.1.1 ☘…

Go红队开发—CLI框架(一)

CLI开发框架 命令行工具开发&#xff0c;主要是介绍开发用到的包&#xff0c;集成了一个框架&#xff0c;只要学会了基本每个人都能开发安全工具了。 该文章先学flags包&#xff0c;是比较经典的一个包&#xff0c;相比后面要学习的集成框架这个比较自由比较细化点&#xff0…

高效团队开发的工具与方法 引言

引言 在现代软件开发领域&#xff0c;团队协作的效率和质量直接决定了项目的成败。随着项目规模的扩大和技术复杂度的增加&#xff0c;如何实现高效团队开发成为每个开发团队必须面对的挑战。高效团队开发不仅仅是个人技术能力的简单叠加&#xff0c;更需要借助合适的工具和方…

【Java全栈进阶架构师实战:从设计模式到SpringCloudAlibaba,打造高可用系统】

&#x1f31f; 分享一个教程&#xff0c;助刚踏入IT行业、工作几年的老油条、或热爱学习的工作党们更上一层楼的&#xff01; &#x1f31f; ​适合人群&#xff1a;初中级Java开发者、求职面试备战者、技术提升党&#xff01; &#x1f4da; ​内容亮点&#xff1a; 1️⃣ ​…

[蓝桥杯 2023 省 A] 异或和之和

题目来自洛谷网站&#xff1a; 暴力思路&#xff1a; 先进性预处理&#xff0c;找到每个点位置的前缀异或和&#xff0c;在枚举区间。 暴力代码&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 1e520;int n; int arr[N…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点

vue数据重置

前言 大家在开发后台管理系统的过程中&#xff0c;一定会遇到一个表格的条件查询重置功能吧&#xff0c;如果说查询条件少&#xff0c;重置起来还算是比较简单&#xff0c;如果元素特别多呢&#xff0c;那玩意写起来可遭老罪喽&#xff0c;那今天就给大家整一个如何快速重置数…