主要探討了SpringMVC中的流程跳轉和不同形式的控制器之間的跳轉方式。首先回顧了JavaWeb中流程跳轉的核心代碼和頁面跳轉方式,並展示了在Web.xml中添加Servlet以及執行這些方式的示例。隨後,介紹了Spring MVC中的四種跳轉形式,包括控制器到JSP頁面的forward和redi... ...
第五章、SpringMVC控制器開發詳解 三
5.1 核心要點
3.流程跳轉
5.2 JavaWeb中流程跳轉的核心回顧
5.2.1 JavaWeb中流程跳轉的核心代碼
5.2.2 JavaWeb頁面跳轉方式回顧
5.2.3測試
在web.xml里添加Servlet然後執行
可以看到通過url拼接可以獲取傳遞的數據
5.3 Spring MVC的四種跳轉形式
- 四種跳轉指的是:在SpringMVC中控制器與JSP或者控制器與控制器之間的跳轉。
- Controller - - forward —> JSP
- Controller - - redirect—> JSP
- Controller - - forward —> Controller
- Controller - - redirect—> Controller
- SpringMVC的四種跳轉,底層上就是對Servlet跳轉的封裝。
- 預設情況下SpringMVC中控制器通過視圖解析器跳轉到JSP頁面,通過的是forward形式。
5.3.1 控制器forward頁面
-
編碼
// 方式1 結合ViewResolver進行拼接成完整頁面,併進行forward跳轉 @RequestMapping("view1") public String view1() { System.out.println("ViewController.view1"); **return "result";** } // 方式2 使用forward關鍵字,視圖解析器的拼接會失效,必須寫完整路徑 @RequestMapping("view1") public String view1() { System.out.println("ViewController.view1"); **return "forward:/result1.jsp";** }
5.3.2 控制器redirect頁面
-
編碼
// 使用了redirect關鍵字,視圖解析器的拼接會失效,也要寫完整路徑 @RequestMapping("view3") public String view3() { System.out.println("ViewController.view1"); **return "redirect:/result.jsp";** }
5.3.3 forward控制器相互跳轉
-
是否存在控制器間相互跳轉的需求
是的,例如下圖邏輯,登錄後進入展示信息的頁面,登錄邏輯和展示信息邏輯屬於兩個不同的Controller,所以控制器間需要相互跳轉
-
編碼
@Controller @RequestMapping("forwardController") public class ForwardController { @RequestMapping("forward1") public String forward1() { System.out.println("ForwardController.forward1"); return "forward:/forwardController/forward2"; } @RequestMapping("/forward2") public String forward2() { System.out.println("ForwardController.forward2"); return "result"; } } // 執行後控制台輸出結果與預期一致
5.3.4 redirect控制器相互跳轉
-
編碼
@Controller @RequestMapping("redirectController") public class RedirectController { @RequestMapping("redirect1") public String redirect1() { System.out.println("RedirectController.redirect1"); return "redirect:/redirectController/redirect2"; } @RequestMapping("/redirect2") public String redirect2() { System.out.println("RedirectController.redirect2"); return "result"; } } // 執行後控制台輸出結果與預期一致
5.4 Web作用域處理
5.4.1 JavaWeb中作用域回顧
-
三種作用域及其使用場景回顧
5.4.2 SpringMVC中作用域處理
-
基本使用方式及其存在的問題
@RequestMapping("view1") public String view1(HttpServletRequest request) { System.out.println("View2Controller.view2"); request.setAttribute("name","xiaojr"); return "result1"; } // 在result1.jsp中通過${name}獲取 //存在問題:與ServletAPI耦合,同時與視圖模板技術(jsp、ftl)耦合,在SpringMVC中不建議使用
-
SpingMVC中request作用域的處理
-
代碼
# 基於Model的方式 @RequestMapping("view2") public String view2(Model model) { // 等同於 request.addAttribute(); model.addAttribute("name", "suns"); return "result1"; } # 基於ModelMap的方式 同上 @RequestMapping("view3") public String view3(ModelMap modelMap) { modelMap.addAttribute("name", "suns2"); return "result1"; }
-
Model、ModelMap相關細節分析
-
通過Model、ModelMap進行作用域處理,可以解決視圖模板技術耦合的問題
因為SpringMVC通過視圖解析器區別JSP、FreeMaker,再將Model、ModelMap的數據放到request或root裡面運行。
-
SpringMVC中提供Model和ModelMap兩種方式處理request作用域,他們的區別是什麼
雖然兩者表現形式以及聲明的形參類型都不同,但是在運行時,SpringMVC會動態提供對應的實現類型,名字是BindingAwareModelMap。所以本質上兩者相同。
-
-
作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。