SpringMVC中使用forward和redirect進行轉發和重定向以及重定向時如何傳參詳解
轉自:http://blog.51cto.com/983836259/1877188
2016-11-28 09:45:59如題所示,在SpringMVC中可以使用forward和redirect關鍵字在Controller中對原請求進行轉發或重定向到其他的Controller。比如可以這樣使用:
1 package cn.zifangsky.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping;5 import org.springframework.web.bind.annotation.RequestParam; 6 import org.springframework.web.servlet.ModelAndView; 7 8 import cn.zifangsky.model.User; 9 10 @Controller 11 public class TestController { 12 13 @RequestMapping("/user/index.html") 14 public ModelAndView userIndex() {15 return new ModelAndView("user/index"); 16 } 17 18 @RequestMapping("/testForward.html") 19 public ModelAndView testForward(@RequestParam("username") String username){ 20 ModelAndView mAndView = new ModelAndView("forward:/user/index.html"); 21 22 User user = newUser(); 23 user.setName(username); 24 mAndView.addObject("user", user); 25 26 return mAndView; 27 } 28 29 @RequestMapping("/testRedirect.html") 30 public ModelAndView testRedirect(@RequestParam("username") String username){ 31 ModelAndView mAndView = new ModelAndView("redirect:/user/index.html"); 32 33 User user = new User(); 34 user.setName(username); 35 mAndView.addObject("user", user); 36 37 return mAndView; 38 } 39 }
然後專案啟動後,在瀏覽器中訪問:http://localhost:9180/CookieDemo/testForward.html?username=forward
頁面顯示效果如下:
可以看出,在使用forward進行轉發時請求的URL連結是不會改變的
接著,在瀏覽器中訪問:http://localhost:9180/CookieDemo/testRedirect.html?username=redirect
頁面顯示效果如下:
可以看出,在使用redirect進行重定向時請求的URL連結發生了改變,並且在controller中放置的引數並沒有傳遞進行。那麼,如果想要在重定向時把引數也傳遞過去應該怎麼做呢?
方法一:常規做法,重定向之前把引數放進Session中,在重定向之後的controller中把引數從Session中取出並放進ModelAndView
示例程式碼如下:
1 @RequestMapping("/user/index.html") 2 public ModelAndView userIndex(HttpServletRequest request) { 3 ModelAndView mAndView = new ModelAndView("user/index"); 4 HttpSession session = request.getSession(); 5 6 mAndView.addObject("user", session.getAttribute("user")); 7 session.removeAttribute("user"); 8 9 return mAndView; 10 } 11 12 @RequestMapping("/testRedirect.html") 13 public ModelAndView testRedirect(@RequestParam("username") String username,HttpServletRequest request){ 14 ModelAndView mAndView = new ModelAndView("redirect:/user/index.html"); 15 16 User user = new User(); 17 user.setName(username); 18 request.getSession().setAttribute("user", user); 19 20 return mAndView; 21 }
方法二:使用RedirectAttributes類
示例程式碼如下:
1 @RequestMapping("/user/index.html") 2 public ModelAndView userIndex() { 3 return new ModelAndView("user/index"); 4 } 5 6 @RequestMapping("/testRedirect.html") 7 public ModelAndView testRedirect(@RequestParam("username") String username,RedirectAttributes redirectAttributes){ 8 ModelAndView mAndView = new ModelAndView("redirect:/user/index.html"); 9 10 User user = new User(); 11 user.setName(username); 12 // redirectAttributes.addAttribute("user", user); //URL後面拼接引數 13 redirectAttributes.addFlashAttribute("user", user); 14 15 return mAndView; 16 }
使用RedirectAttributes這個類來傳遞引數寫法就很簡單了,只需要在需要重定向的controller的方法引數中新增RedirectAttributes型別的引數,然後把需要重定向之後也能夠獲取的引數放進去即可
當然,據說RedirectAttributes本質上也是通過Session來實現的(PS:相關原始碼我沒看過,只能據說了)。實際上上面的程式碼是省略的寫法,因為重定向之後就直接返回頁面檢視了,如果經過幾次重定向的話估計上面那種寫法就獲取不到引數了,因此關於獲取引數一般還有以下兩種方式:
(1)使用@ModelAttribute註解獲取引數:
1 @RequestMapping("/user/index.html") 2 public ModelAndView userIndex(@ModelAttribute("user") User user) { 3 ModelAndView mAndView = new ModelAndView("user/index"); 4 mAndView.addObject("user", user); 5 6 return mAndView; 7 } 8
(2)使用RequestContextUtils類來獲取:
1 @RequestMapping("/user/index.html") 2 public ModelAndView userIndex(HttpServletRequest request) { 3 ModelAndView mAndView = new ModelAndView("user/index"); 4 5 Map<String, Object> map = (Map<String, Object>) RequestContextUtils.getInputFlashMap(request); 6 User user = (User) map.get("user"); 7 8 mAndView.addObject("user", user); 9 return mAndView; 10 } 11
總結,這兩種獲取方式都可以成功獲取到引數。但是還是略顯麻煩,如果只是一次重定向之後就返回頁面檢視的話推薦使用最簡單那種寫法