Spring MVC Controller 處理請求的核心能力包括:參數接收(原生/註解/對象)、數據傳遞、Session 操作、視圖解析(轉發/重定向)。本文通過一個完整的 HelloController 示例,系統演示 11 種常見場景的代碼實現與最佳實踐。
@RequestMapping("/test1.do")
public ModelAndView test1(HttpServletRequest req) {
String userName = req.getParameter("userName");
String password = req.getParameter("password");
return new ModelAndView("jsp/hello");
}
@RequestMapping("/test2.do")
public ModelAndView test2(String userName, @RequestParam("password") String pwd) {
// 參數名與變量名一致可省略 @RequestParam
return new ModelAndView("jsp/hello");
}
@RequestMapping("/test3.do")
public ModelAndView test3(User user) {
// Spring 自動實例化 User,按名稱匹配請求參數設置屬性
return new ModelAndView("jsp/hello");
}
User 實體:標準 JavaBean,含 id、userName、password 及 getter/setter。
@RequestMapping("/test4.do")
public ModelAndView test4(User user) {
Map<String, Object> data = new HashMap<>();
data.put("user", user);
return new ModelAndView("jsp/hello", data); // request.setAttribute
}
@RequestMapping("/test5.do")
public ModelAndView test5(User user, ModelMap modelMap) {
modelMap.put("user", user);
return new ModelAndView("jsp/hello");
}
@RequestMapping("/test6.do")
public ModelAndView test6(@ModelAttribute("user") User user) {
// 自動將 user 放入 request 屬性鍵 "user"
return new ModelAndView("jsp/hello");
}
@ModelAttribute("age")
public Integer getAge() { return 22; } // 全局屬性,所有請求可用
@RequestMapping("/test7.do")
public ModelAndView test7(HttpServletRequest req) {
HttpSession session = req.getSession();
session.setAttribute("salary", 6000.0);
return new ModelAndView("jsp/hello");
}
或直接在方法簽名聲明 HttpSession session,Spring 自動注入。
@RequestMapping("/test8.do")
public String test8(User user, ModelMap model) {
model.addAttribute("user", user);
return "jsp/hello"; // InternalResourceViewResolver 拼接前綴/後綴
}
@RequestMapping("/test10")
public ModelAndView test10(User user) {
if ("123".equals(user.getUserName())) {
return new ModelAndView("jsp/hello"); // 轉發
} else {
return new ModelAndView(new RedirectView("test9.do")); // 重定向到 test9
}
}
@RequestMapping("/test11")
public String test11(User user) {
if ("123".equals(user.getUserName())) {
return "jsp/hello";
} else {
return "redirect:test9.do"; // 瀏覽器發起新請求
}
}
| 特性 | 轉發 | 重定向 |
|---|---|---|
| 請求次數 | 1 次 | 2 次(服務器 302 → 瀏覽器新請求) |
| URL 變化 | 不變 | 變為目標 URL |
| Request 域共享 | 是 | 否(新請求新 Request) |
| 適用場景 | 同一業務流程內跳轉 | 跨模塊、POST 後防重複提交、登錄檢查失敗 |
| 數據傳遞 | request.setAttribute | FlashMap / Session / URL 參數 |
String 返回視圖名 + Model/Map 參數,代碼簡潔。RedirectAttributes.addFlashAttribute,自動放入 FlashMap,目標請求可讀一次即銷毀。HttpServletResponse 輸出 JSON,改用 @RestController + 返回對象。@ModelAttribute 方法級用於全局數據(如菜單、用戶信息),參數級用於表單回顯。