常見的Request Controller 和 Response Controller 的區別
用餐廳點餐來理解
想象你去一家餐廳吃飯:
- Request Controller(接單員):負責處理你的點餐請求,記錄你的口味、桌號等信息。
- Response Controller(廚師+服務員):根據你的需求制作菜品,并把熱乎乎的菜端到你桌上。
它們的核心區別:
- Request Controller:專注?接收并解析用戶請求(比如拿參數、查Cookie、讀Session)。
- Response Controller:專注?構造并返回響應數據(比如返回網頁、JSON數據、設置狀態碼)
第一部分:RespController - 響應處理中心
(相當于快遞包裝流水線)
1. 地址導航員(返回頁面)
@RequestMapping("/r1")
public String returnPage(){return "/index.html";
}
作用:引導用戶訪問指定網頁
示例:類似點擊網頁導航鏈接
訪問地址
:http://localhost/resp/r1
響應結果
:顯示服務器上的index.html網頁文件
2. 文字快遞員(返回純文本)
@ResponseBody
@RequestMapping("/r2")
public String returnData(){return "我是前端需要的數據";
}
作用:向瀏覽器直接發送文字內容
示例:手機收到驗證碼短信
響應頭
:Content-Type: text/plain
響應內容
:直接顯示返回的字符串原文
3. HTML零件供應商
@ResponseBody
@RequestMapping("/r3")
public String returnHTML(){return "<h1>我是一級標題</h1>";
}
作用:發送HTML片段讓瀏覽器渲染
示例:網購時的商品描述模塊
響應頭
:Content-Type: text/html
前端顯示
:顯示為帶樣式的標題文字
4. 強制純文本模式
@ResponseBody
@RequestMapping(value = "/r4", produces = "text/plain")
public String returnTEXT(){return "<h1>我是一級標題</h1>";
}
作用:強制瀏覽器以純文本處理內容
示例:收到代碼截圖文檔
響應頭
:Content-Type: text/plain
前端顯示
:顯示原始代碼文本?<h1>...
5. JSON數據專員
(需要UserInfo類支持)
@ResponseBody
@RequestMapping("/r5")
public UserInfo returnJSON(){return new UserInfo(1, "zhangsan");
}
作用:發送結構化數據
示例:接收用戶信息表單
響應頭
:Content-Type: application/json
響應內容
:
{"id":1, "name":"zhangsan"}
6. 異常狀態標注員
@ResponseBody
@RequestMapping("/r6")
public UserInfo setStatus(HttpServletResponse response){response.setStatus(400);return new UserInfo(1, "zhangsan");
}
第二部分:RequestController??- 需求處理中心
1. 問詢接待員(基礎參數接收)
示例請求:
訪問:http://localhost/request/r1?keyword=手機
響應結果
:接收參數手機
2. 多重接待窗口
@RequestMapping("/r2")
public String r2(String name, String password) {return "usrname" + name + "password" + password;
}
示例請求:
訪問:http://localhost/request/r2?name=張三&password=123456
響應結果
:username張三 password123456
3. 數字檢查員(包裝類)
@RequestMapping("/r3")
public String r3(Integer age) {return "age" + age;
}
特點:
- 允許空值(如訪問時不帶age參數)
- 示例空請求響應:age null
4. 強制數字模式
@RequestMapping("/r4")
public String r4(int age) {return "age" + age;
}
特點:
- 基本類型必須有值
- 空請求時默認返回 age 0
5. 對象收集員
@RequestMapping("/r5")
public String r5(UserInfo userInfo) {return "userInfo" + userInfo.toString();
}
使用方式:
訪問:http://localhost/request/r5?id=2&name=李四
參數自動裝配
:轉換為UserInfo對象
6. 參數改裝員
@RequestMapping("/r6")
public String r6(@RequestParam("q") String keyword) {return "keyword" + keyword;
}
示例請求:
訪問:http://localhost/request/r6?q=筆記本電腦
功能
:把參數q映射到keyword變量
7. 批量收貨員
@RequestMapping("/r7")
public String r7(String[] arr) {return "arr" + Arrays.toString(arr);
}
示例請求:
訪問:http://localhost/request/r7?arr=蘋果&arr=香蕉
響應結果
:arr [蘋果, 香蕉]
8. 路徑解析員
@RequestMapping("/article/{type}/{articleId}")
public String article(@PathVariable String type, @PathVariable Integer articleId) {return "articleId" + articleId+"type"+type;
}
示例請求:
訪問:http://localhost/request/article/tech/1001
響應結果
:articleId1001 typetech
9. 包裹接收員(文件上傳)
@RequestMapping("r12")
public String r12(@RequestPart("file11") MultipartFile file) {file.transferTo(new File("C:\\temp\\"+file.getOriginalFilename()));return "文件上傳成功";
}
使用方式:使用Postman等工具上傳文件
表單字段名
:file11
保存路徑
:C盤temp目錄
10. 會員卡收集員
@RequestMapping("/r13")
public String r13(HttpServletRequest request) {Cookie[] cookies = request.getCookies();return "返回cookie成功";
}
功能:查看瀏覽器攜帶的所有Cookie
11. 精準會員卡讀取器
@RequestMapping("/r14")
public String r14(@CookieValue("java")String java) {return "Cookie中java的值:"+java;
}
要求:瀏覽器必須攜帶名為java的Cookie
12. 儲物柜管理員(Session操作)
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {HttpSession session = request.getSession();session.setAttribute("userName", "zhangsan");return "設置session成功";
}
效果:
創建類似保險箱的會話存儲空間,通過Cookie自動關聯用戶
13. 儲物柜檢查員(會話驗證)
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute("userName") String userName){return "登錄用戶為" + userName;
}
使用場景對比表
功能需求 | 對應控制器 | 典型方法示例 |
---|---|---|
需要給瀏覽器返回網頁 | RespController | returnPage() (/r1) |
開發RESTful API接口 | RequestController | returnJSON()(/r5) |
用戶登錄狀態保持 | RequestController | setSession()相關方法 |
處理復雜的表單參數 | RequestController | r5(UserInfo對象接收) |
需要控制響應頭信息 | RespController | setHeader() (/r7) |
上傳用戶頭像文件 | RequestController | r12()文件上傳方法 |
移動端接口開發 | RequestController | 所有帶@RestController的方法 |