您好,登錄后才能下訂單哦!
這篇文章主要講解了“Spring MVC重定向與轉發的介紹以及redirect和forward的區別”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring MVC重定向與轉發的介紹以及redirect和forward的區別”吧!
重定向和轉發
常用處理方式
String 重定向
ModelAndView 重定向
RedirectView 重定向
帶參跳轉
redirect 和 forward 的區別
重定向經過客戶端,而轉發沒有,因此相對來說轉發更快速。但有時采用重定向更方便,如:
重定向到外部網站;
避免用戶重新加載頁面時再次調用同樣的動作。
return "redirect:/view/"+saveUser.getId();
這里使用重定向來防止當前用戶重新加載頁面時'''saveUser'''被二次調用。
但是使用重定向無法輕松地給目標頁面傳值,因此,在Spring3.1后提供了Flash屬性,詳情見后文。
Controller 視圖方法間的跳轉,無非就是帶參跳轉和不帶參跳轉。常用的方法有通過 String 映射 RequestMapping 實現重定向,或者通過 ModelAndView 對象,又或者是 RedirectView 對象,下面逐一說明。
是 return 映射到另一個 Controller 方法的字符串。如果有請求參數,就拼接在 RequestMapping 映射的字符串后面。
// 返回字符串映射的方式 @RequestMapping("hello") public String hello(HttpServletRequest req, HttpServletResponse resp) { doSomething(); return "redirect:/bye"; // return "redirect:/bye?username=sudoz"; }
另一種方法是通過返回 ModelAndView 對象來實現跳轉。類似的,如果有請求參數,也可以通過類似 GET 參數拼接的方式:
// 返回 ModelAndView 對象 @RequestMapping("hello") public ModelAndView hello(HttpServletRequest req, HttpServletResponse resp) { doSomething(); return new ModelAndView("redirect:/bye"); // return new ModelAndView("redirect:/bye?username=sudoz"); }
還有一種方法是通過返回 RedirectView 對象實現跳轉,該方法和上面的不同之處在于,RedirectView 對象不需要設置 redirect 前綴:
// 返回 RedirectView 對象 @RequestMapping("hello") public RedirectView hello() { doSomething(); return new RedirectView("/bye"); // return new RedirectView("bye?username=sudoz"); }
Model在重定向時會丟失攜帶的消息
在做方法跳轉時,如果要把參數帶給下一個方法,像上面代碼里通過拼接 URL 參數的方法有時候并不實用。因為參數不一定都是是字符串,而且瀏覽器對 URL 的長度是有限制的。RedirectAttributes 對象可以用來保存請求重定向時的參數。利用 RedirectAttributes 改寫上面的代碼:
@RequestMapping("/") public RedirectView hello(RedirectAttributes attrs) { attrs.addAttribute("message", "hello"); attrs.addFlashAttribute("username", "world"); return new RedirectView("hello"); } @RequestMapping("hello") Map<String, String> hello(@ModelAttribute("message") String meaasge, @ModelAttribute("username") String username) { Map<String, String> map = new HashMap(); map.put("message", message); map.put("username", username); return map; }
上面的代碼中,調用 addAttribute() 和 addFlashAttribute() 方法往 RedirectAttributes 對象中插入了兩個值,如果看源碼,就能知道,RedirectAttributes 接口的實現類 RedirectAttributesModelMap 繼承了 ModelMap,本質上就是 HashMap 的子類,因此可以用來存儲 Key-Value 對。這兩個方法都很常用,使用上也必然存在不同:
addAttribute() 方法會把 Key-Value 作為請求參數添加的 URL 的后面;
addFlashAttribute() 方法會把 Key-Value 暫存在 session 中,在跳轉到目標方法后,即完成任務,會從 session 中刪掉;
用 curl 命令來測試:
curl -i http://localhost:8080/ HTTP/1.1 302 Set-Cookie: JSESSIONID=D1CC5E15FA8EF9474C4CED7D4F660E66;path=/;HttpOnly Location: http://localhost:8080/hello;jsessionid=D1CC5E15FA8EF9474C4CED7D4F660E66?username=sudoz Content-Language: en-US Content-Length: 0 Date: Thu, 16 Feb 2017 12:33:46 GMT
可以看到,通過 addAttribute() 添加的鍵值對變成了 URL 后面的參數,addFlashAttribute() 方法添加的鍵值對則沒有出現在 URL 上,而是存儲在了 session 中。跳轉的目標方法通過 @ModelAttribute("key")注解指定接收的參數。
上面列出的 3 種方法,其實都是 Spring MVC 在處理請求時的重定向,即 redirect 跳轉。另一種分發請求的方式是轉發,即 forward。二者的區別從 HTTP 的規范中就明確:
redirect 的 HTTP 返回碼是 302,且跳轉的新 URL 會存儲在 HTTP Response Headers 的 Location 字段中。客戶端在接收到 Response 后,會發起另一次請求,這次請求的 URL 就是重定向的 URL;
forward 的轉發過程只發生在服務端;Servlet 容器會直接把源請求打向目標 URL,而不會經由客戶端發起請求;因此客戶端接收到的響應是來自轉發后的目標方法,但是瀏覽器呈現的 URL 卻并不會改變,且 forward 不能將參數轉發出去。
感謝各位的閱讀,以上就是“Spring MVC重定向與轉發的介紹以及redirect和forward的區別”的內容了,經過本文的學習后,相信大家對Spring MVC重定向與轉發的介紹以及redirect和forward的區別這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。