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

文章目录

  • 一、请求映射的艺术: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);}@PostMappingpublic 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.rhkb.cn/news/39354.html

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

相关文章

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

哪吒汽车:一边熬夜蹦迪,一边找药投医

两年前&#xff0c;威马CEO沈晖发了个短视频&#xff0c;内容是“活下去&#xff0c;像牲口一样活下去”。 如今最能体会沈晖当时心情的&#xff0c;估计就是方运舟了。 作为哪吒汽车创始人兼董事长&#xff0c;他连续多次被限高&#xff0c;为了让哪吒汽车活下去&#xff0c…

2025 cs144 Lab Checkpoint 1小白超详细版

cs144官网&#xff1a;https://cs144.github.io/ 我的github&#xff1a;https://github.com/Albert-tru/cs144-2025 文章目录 1 手动发送internet数据报协议号5、7&#xff1f;思路&#xff1f; 2 实现一个Reassembler类2.1 几个帮助理解代码的Q&AQ1&#xff1a;insert的参…

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用&#xff0c;而 OpenCV 作为一个强大的图像处理库&#xff0c;提供了丰富的函数来实现各类图像处理任务。形态学操作&#xff08;Morphological Operations&#xff09;是其中常用的技术&#xff0c;尤其适用于二值图像的处理。常见的…

单链表的查找和插入,删除操作

1.单链表的查找 snode* slistfind(snode* stlheap, stltype x) {while (stlheap){if (stlheap->data x){return stlheap;}stlheap stlheap->next;}return NULL; } 2.单链表的插入操作 2.1在指定位置之前插入节点 void slistinsert(snode** stlheap, snode* pos, stl…

一文速通Python并行计算:00 并行计算的基本概念

一文速通 Python 并行计算&#xff1a;00 并行计算的基本概念 摘要&#xff1a; 该文介绍了 Python 并行计算的核心概念、编程模型及其应用&#xff0c;并介绍了了并行程序的性能分析与优化方法&#xff0c;如并行效率、加速比及 Amdahl 定律。此外&#xff0c;该文介绍了共享…

vue中keep-alive组件的使用

keep-alive是vue的内置组件&#xff0c;它的主要作用是对组件进行缓存&#xff0c;避免组件在切换时被重复创建和销毁&#xff0c;从而提高应用的性能和用户体验。它自身不会渲染一个 DOM 元素&#xff0c;也不会出现在父组件链中。使用时&#xff0c;只需要将需要缓存的组件包…

Python Excel表格数据对比工具

【Excel对比工具】提升工作效率的神奇助手&#xff1a;基于PyQt5和Pandas的文件数据对比应用 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例…

注册登录表单

html登录页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个登录页面</t…

JAVA:Spring Boot @Conditional 注解详解及实践

1、简述 在 Spring Boot 中&#xff0c;Conditional 注解用于实现 条件化 Bean 装配&#xff0c;即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制&#xff0c;常用于实现模块化、可配置的组件加载。 本文将详细介绍 Conditional 相关的注解&…

Java高频面试之集合-17

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;JDK 8 对 HashMap 主要做了哪些优化呢&#xff1f;为什么要这么做&#xff1f; JDK 8 对 HashMap 的主要优化及原因 JDK…

力扣DAY24 | 热100 | 回文链表

前言 简单 √ 是反转链表的衍生题&#xff0c;很快写完了。不过没考虑到恢复链表结构的问题。 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

Unity跨平台构建快速回顾

知识点来源&#xff1a;人间自有韬哥在&#xff0c;豆包 目录 一、发布应用程序1. 修改发布必备设置1.1 打开设置面板1.2 修改公司名、游戏项目名、版本号和默认图标1.3 修改 Package Name 和 Minimum API Level 2. 发布应用程序2.1 配置 Build Settings2.2 选择发布选项2.3 构…

手敲NLP相关神经网络,熟悉神经网络的结构与实现!

一、NNLM 二、word2vec 三、TextCNN 四、TextRNN 五、TextLSTM 六、Bi-LSTM 七、seq2seq 八、seq2seq&#xff08;attention&#xff09;

Spring MVC 拦截器使用

javaweb过滤器和springmvc拦截器&#xff1a; 拦截器的概念 拦截器使用 1/创建拦截器类&#xff0c;类中实现 handler执行前&#xff0c;执行后与渲染视图后的具体实现方法 public class GlobalExceptionHandler implements HandlerInterceptor {// if( ! preHandler()){re…

数据库分类、存储引擎、介绍、Mysql、SQL分类

DAY17.1 Java核心基础 数据库 关系型数据库&#xff08;传统数据库&#xff0c;安全可靠&#xff0c;数据量大&#xff09;&#xff1a;Mysql、Oracle、SQLServer 非关系型数据库nosql&#xff08;缓存数据库&#xff0c;高并发项目中&#xff0c;存储热点数据&#xff0c;短信…

Extend module 01:Keyboard

目录 一、Keyboard &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;扫描原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、Keyboard接口函数封装 三、踩坑日记 &a…

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导&#xff0c;为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取&#xff0c;从而提供了更接近人类能力的抓取指导。 论文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…

解锁 AWX+Ansible 自动化运维新体验:快速部署实战

Ansible 和 AWX 是自动化运维领域的强大工具组合。Ansible 是一个简单高效的 IT 自动化工具&#xff0c;而 AWX 则是 Ansible 的开源 Web 管理平台&#xff0c;提供图形化界面来管理 Ansible 任务。本指南将带你一步步在 Ubuntu 22.04 上安装 Ansible 和 AWX&#xff0c;使用 M…

Vulhub-jangow-01-1.0.1通关攻略

第0步&#xff1a; 打开靶机&#xff0c;按下shift&#xff0c;出现下图界面 在此页面按下e键&#xff0c;进入如下界面&#xff0c; 将ro 替换为 rw signie init/bin/bash 替换完毕后&#xff0c;按下Ctrl键X键&#xff0c;进入如下页面 ip a查看网卡信息 编辑配置文件网卡信…