SpringMvc跳轉問題
SpringMvc的Controller每次處理完數據后都會返回一個邏輯視圖(view)和模型(model)
所以我們會看到原生的Controller是返回一個ModelAndView(內部包含了view和model)。
正常情況下(除非被@ModelAttribute
注解了的方法),否則最終
都會返回ModelAndView
。
當然有時候一個功能處理方法不一定要返回一個邏輯視圖,也可以重定向到另一個功能方法
服務器內部轉發到一個邏輯視圖或者另一個功能方法。
SpringMvc的強大之處在於它封裝了Servlet大量底層代碼,但是有沒有完全屏蔽用戶對Servlet API
的使用。所以SpringMvc中頁面跳轉也是分為兩大類:
-
使用Servlet API實現頁面跳轉
-
重定向方式: 由於重定向的本質是
要求瀏覽器重新發送一個請求
,SpringMvc里面的頁面一般是放到WEB-INF下,瀏覽器不可以直接訪問)
所以這里的重定向實質是重定向到另一個功能方法。 -
服務器內部請求轉發: 請求轉發為
服務器內部行為
,所以可以直接跳轉訪問一個jsp頁面也可以跳轉到另一個功能處理方法。//使用原生的ServletApi進行頁面跳轉 @RequestMapping("/c") public String test(HttpServletResponse response, HttpServletRequest request) throws ServletException, IOException { System.out.println("testC"); //跳轉到服務器內部的一個頁面 //request.getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request,response); //跳轉到服務器內部的一個功能處理方法 //request.getRequestDispatcher("/dispather/b").forward(request,response); //重定向一個功能方法 response.sendRedirect(request.getContextPath()+"/dispather/b"); return null; }
-
-
使用SpringMvc的API實現頁面跳轉
- 直接返回邏輯視圖名
@RequestMapping("/b") public String testB(){ System.out.println("testB"); //直接返回一個視圖 return "index"; }
- 返回自定義的ModelAndView: 自定義ModelAndView時,可以重定向或請求轉發
//Controller中使用ModelAndView進行跳轉和重定向 @RequestMapping("/e") public ModelAndView testE(){ System.out.println("testE"); //跳轉到服務器內部的一個頁面 //return "index"; //跳轉到服務器內部的一個功能處理方法 //return new ModelAndView("forward:/dispather/b"); //重定向一個功能方法 return new ModelAndView("redirect:/dispather/b"); }
- 直接返回邏輯視圖名