文章目录
- 一、请求映射的艺术:RequestMapping深度解析
-
- [1. 多级路径配置](#1. 多级路径配置)
- [2. 六大核心属性](#2. 六大核心属性)
- [3. RESTful风格实践](#3. RESTful风格实践)
- 二、参数绑定黑科技
- 三、响应处理全攻略
-
- [1. 视图跳转三种模式](#1. 视图跳转三种模式)
-
- [2. JSON交互实践](#2. JSON交互实践)
- 四、文件操作实战
-
- [1. 上传配置三要素](#1. 上传配置三要素)
- [2. 上传下载核心代码](#2. 上传下载核心代码)
- 五、异常处理大师课
-
- [1. 异常处理金字塔](#1. 异常处理金字塔)
- [2. 全局异常处理方案](#2. 全局异常处理方案)
- 总结
一、请求映射的艺术:RequestMapping深度解析
1. 多级路径配置
c
@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" |
典型配置示例
java
@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风格实践
c
@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. 智能绑定机制
基础类型绑定
c
<!-- JSP表单 -->
<input type="text" name="age">
c
@PostMapping("/user")
public String createUser(int age) {
// 自动将age转换为int类型
}
对象嵌套绑定
c
public class User {
private Address address;
// getters/setters
}
public class Address {
private String city;
// getters/setters
}
c
<input type="text" name="address.city">
集合类型绑定
c
<!-- 绑定List集合 -->
<input type="text" name="accounts[0].accountNumber">
<input type="text" name="accounts[1].accountNumber">
2. 参数处理三剑客
注解 | 功能说明 | 应用场景 | 示例 |
---|---|---|---|
@RequestParam | 1. 绑定单个请求参数 2. 支持参数默认值设置 3. 可指定是否必传 | 1. 普通表单提交 2.GET请求参数获取 3.参数名与方法参数名不一致时 | @RequestParam("uname") String username @RequestParam(defaultValue="1") int page |
@PathVariable | 1. 绑定URI模板变量 2. 支持RESTful风格 3. 自动类型转换 | 1.RESTful API设计 2.资源定位场景 3.需要从URL路径提取参数 | @GetMapping("/users/{id}") public User getById(@PathVariable Long id) |
@RequestBody | 1. 绑定请求体内容 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 |
代码示例:
c
@PostMapping("/update")
public String updateUser(@RequestParam("uname") String username,
@PathVariable Long userId,
@RequestBody UserDTO dto) {
// 业务逻辑
}
三、响应处理全攻略
1. 视图跳转三种模式
响应方式 | 核心特点 | 典型应用场景 |
---|---|---|
ModelAndView | 1. 数据与视图统一封装 2. 支持链式编程 3. 显式控制视图渲染逻辑 | 需要同时传递数据和视图的场景 传统MVC模式开发 动态页面内容渲染 |
字符串返回 | 1. 简洁直观 2. 自动视图解析 3. 隐式数据绑定(配合Model对象) | 简单页面跳转 前后端轻度交互 Thymeleaf/FreeMarker模板渲染 |
Servlet API | 1. 直接操作原生响应对象 2. 完全控制响应流程 3. 绕过视图解析器 | 文件下载/上传 流式数据返回 自定义HTTP头/状态码设置 二进制数据响应 |
对比示例:
c
// 方式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交互实践
配置步骤:
- 添加Jackson依赖
- 启用注解驱动
- 使用@ResponseBody
AJAX交互示例:
c
$.ajax({
type: "POST",
url: "/api/users",
contentType: "application/json",
data: JSON.stringify({name: "John", age: 30}),
success: function(data) {
console.log("创建用户成功:", data);
}
});
c
@PostMapping(consumes = "application/json")
@ResponseBody
public User createUser(@RequestBody User user) {
return userService.save(user);
}
四、文件操作实战
1. 上传配置三要素
c
<!-- 配置文件解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760" /> <!-- 10MB -->
</bean>
<!-- 静态资源放行 -->
<mvc:resources mapping="/uploads/**" location="/uploads/"/>
2. 上传下载核心代码
c
@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. 全局异常处理方案
c
@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 API | 1. 直接控制HTTP响应 2. 完全掌控响应细节 3. 无需框架额外支持 | 1. 破坏MVC分层结构 2. 与Spring解耦思想冲突 3. 测试维护困难 |
总结
- 请求映射:合理使用多级路径规划API结构
- 参数绑定:善用Spring的智能绑定机制
- 响应处理:根据场景选择最佳响应方式
- 文件操作:注意安全性和性能优化
- 异常处理:建立统一的异常管理体系
性能优化小贴士:
- 使用@ResponseBody替代JSP视图
- 开启GZIP压缩减少数据传输量
- 对文件上传限制大小和类型
- 使用异步处理耗时操作
通过掌握这些核心技巧,您将能够构建出高效、健壮的Spring MVC应用系统。