Spring Web MVC ①
🚀 一、Spring MVC
-
MVC三层
-
Controller:乐团指挥,接收请求→调用模型→选择视图(
@Controller
) -
Model:乐手,处理业务逻辑与数据(POJO对象)
-
View:舞台展示,渲染用户界面(HTML/JSP)
比喻:去餐厅吃饭 → 服务员(View)接待 → 前厅(Controller)派单 → 后厨(Model)烹饪
-
ps. 2中提到的POJO,是说一个常规的、不受框架任何束缚或限制的对象。它除了要遵守语法之外,不应该继承预先设定的类、实现预先设定的接口或注解。可以认为,如果一个模块定义的对象都是pojo,那么他们只依赖JDK。
-
注解
-
@RequestMapping
:路由映射核心,定义URL入口 -
@RestController
=@Controller
+@ResponseBody
(纯数据响应) -
@ResponseBody
:强制返回数据而非视图(可修饰类/方法)
-
🔗 二、连接请求:路由的艺术
@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/sayHi")public String hello() { return "Hello, Spring MVC!";}
}
-
路由规则:
-
类路径 + 方法路径 = 完整URL(
/user/sayHi
) -
支持多层路径(
/user/ml/say/hi
) -
默认处理GET/POST,可通过
method=RequestMethod.POST
限定
-
📬 三、请求参数:九大接收姿势
传参方式 | 注解/写法 | 示例 |
---|---|---|
1. 单个参数 | 方法形参同名接收 | ?name=spring |
2. 多个参数 | 多个形参 | ?name=zhangsan&password=123 |
3. 对象绑定 | 自动属性填充 | Person对象?id=1&name=zhangsan |
4. 参数重命名 | @RequestParam("time") | ?time=2023 → createtime 接收 |
5. 数组 | String[] | ?arrayParam=A,B,C |
6. 集合 | @RequestParam List | ?listParam=A&listParam=B |
7. JSON数据 | @RequestBody | Body中传{"id":1,"name":"zhang"} |
8. 路径变量 | @PathVariable | /user/{id} → id 接收 |
9. 上传文件 | @RequestPart + MultipartFile | 表单文件上传 |
避坑指南:
基本类型参数必传(否则报500)→ 用包装类型
Integer
替代int
参数类型不匹配 → 自动返回400错误
📤 四、响应处理:六种返回策略
响应类型 | 实现方式 | Content-Type |
---|---|---|
1. 静态页面 | @Controller + 返回资源路径 | text/html |
2. HTML片段 | @ResponseBody 返回HTML字符串 | text/html |
3. JSON数据 | 直接返回对象/Map | application/json |
4. 设置状态码 | response.setStatus(401) | 自定义状态码 |
5. 设置Header | produces="application/json" | 控制响应头类型 |
6. 重定向/转发 | return "redirect:/path" | 跳转新页面 |
黄金法则:
前端分离时代,@RestController
是主流(纯数据交互),返回视图用@Controller
🍪 五、状态管理:Cookie与Session
// 获取Cookie
@GetMapping("/cookie")
public String getCookie(HttpServletRequest request) {Cookie[] cookies = request.getCookies(); // 解析逻辑
}// Session操作
@PostMapping("/login")
public boolean login(String user, HttpSession session) {session.setAttribute("user", user); // 存储return true;
}
-
Session本质:服务端哈希表(SessionID → 用户数据)
-
Cookie-Session联动:
-
登录成功 →
Set-Cookie: JSESSIONID=xxx
-
后续请求 →
Cookie: JSESSIONID=xxx
自动携带
-
安全警示:Cookie可伪造 → 服务端必须校验!
🏗️ 六、应用分层:高内聚低耦合
com.example.project ├── controller # 请求入口 (UserController) ├── service # 业务逻辑 (UserService) ├── dao # 数据访问 (UserDao) └── model # 数据模型 (User)
-
分层优势:
-
解耦:修改业务逻辑不影响控制器
-
复用:多个Controller调用同一Service
-
标准化:各司其职,代码清晰如乐谱🎼
-
经典比喻:
公司部门制 → 行政部(Controller)接待 → 技术部(Service)处理 → 财务部(Dao)存储数据
⚙️ 七、企业规范:优雅编码之道
-
类名:大驼峰 (
UserController
) -
方法/变量:小驼峰 (
getUserName
) -
包名:全小写 + 点分隔 (
com.example.service
) -
接口文档:前后端协作的“说明书”(URL、参数、响应格式)
🎯 八、实战四部曲
-
加法计算器:表单传参 → 后端计算 → 返回HTML结果
-
用户登录:Session存储用户 → 首页展示登录状态
-
留言板:
-
前端提交JSON → 后端
List
存储 -
使用
lombok
简化POJO(@Data
自动生成Getter/Setter)
-
-
图书管理系统:
-
分层开发(Controller/Service/Dao)
-
Mock数据模拟数据库操作
-
精髓总结:
掌握注解九式
+分层思维
+状态管理
= 解锁Spring MVC终极奥义!