SpringMVC 重新定向redirect請求中攜帶數據方式
SpringMVC 重新定向redirect請求中攜帶數據
- 在控制器方法返回的視圖名稱中使用瞭redirect:前綴,這時返回的String不是用來尋找視圖,而是瀏覽器進行跳轉的路徑:
return “redirect:/spitter/” + spitter.getUsername();
當一個控制器返回的是一個redirect時,原來的request會終止,並且會開啟一個新的HTTP請求。原來request中所有的model數據都會清空。新的request不會有任何的model數據,如圖:
現在不能再redirect時使用model來傳遞數據瞭。但是還有其他方法用來從重定向的方法中獲取數據:
- 將數據轉換為路徑參數或者查詢參數
- 在flash屬性中發送數據首先來看一下Spring如何在路徑參數或者查詢參數中傳遞數據。
使用URL模版重定向
@RequestMapping(value="/register", method=POST) public String processRegistration(Spitter spitter, Model model) { spitterRepository.save(spitter); model.addAttribute("username", spitter.getUsername()); return "redirect:/spitter/{username}"; } @RequestMapping(value = "/{username}", method = RequestMethod.GET) public String showSpitterProfile(@PathVariable String username, Model model) { System.out.println("showSpitterProfile"); Spitter spitter = spittleRepository.findByUsername(username); model.addAttribute(spitter); return "Profile"; }
model中其他的原始值也會作為查詢參數添加到重定向URL中。例如,除瞭username,model同時也包括新建的Spitter對象的id屬性:
@RequestMapping(value="/register", method=POST) public String processRegistration(Spitter spitter, Model model) { spitterRepository.save(spitter); model.addAttribute("username", spitter.getUsername()); model.addAttribute("spitterId", spitter.getId()); return "redirect:/spitter/{username}"; }
但是由於model中的spitterId屬性並沒有映射到URL中的占位符,它會自動作為查詢參數。
如果username是habuma,spitterId是42,那麼返回的重定向路徑將是/spitter/habuma?spitterId=42。
使用flash屬性
Spring提供瞭通過RedirectAttributes來設置flash屬性,RedirectAttributes作為Model的子接口,新增瞭一些方法用來設置flash屬性。
@RequestMapping(value="/register", method=POST) public String processRegistration(Spitter spitter, RedirectAttributes model) { spitterRepository.save(spitter); model.addAttribute("username", spitter.getUsername()); model.addFlashAttribute("spitter", spitter); return "redirect:/spitter/{username}"; }
在重定向執行之前,所有的flash屬性都會復制到會話中。在重定向後,存在會話中的flash屬性會被取出,並從會話轉移到模型之中。處理重定向的方法就能從模型中訪問Spitter對象瞭,就像獲取其他的模型對象一樣
@RequestMapping(value = "/{username}", method = RequestMethod.GET) public String showSpitterProfile(@PathVariable("username") String username, Model model) { if (!model.containsAttribute("spitter")) { Spitter spitter = spitterRepository.findByUsername(username); model.addAttribute(spitter); } return "profile"; }
showSpitterProfile()方法所做的第一件事就是檢查是否存有key為spitter的model屬性。如果模型中包含spitter屬性,那就什麼都不用做瞭。這裡面包含的Spitter對象將會傳遞到視圖中進行渲染。但是如果模型中不包含spitter屬性的話,那麼showSpitterProfile()將會從Repository中查找Spitter,並將其存放到模型中。
重新定向顯示數據
.... .... <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> .... .... username:<c:out value="${spitter.username}"/><br/> firstName:<c:out value="${spitter.firstName}"/> lastName: <c:out value="${spitter.lastName}"/><br/> email:<c:out value="${spitter.email}"/> ....
SpringMVC 幾種重定向攜帶數據方法
1.拼接字符串
return "redirect:/page/second?param1=lay¶m2=lay2";
2.采用RedirectAttribute來傳參數
public String first(RedirectAttribute redirectAttribute){ redirectAttribute.addAttribute("param1", "lay"); return "redirect:/page/second"; }
3.RedirectAttribute—–addFlashAttribute()的用法
@Controller @RequestMapping("/page") public class redirectDemo{ @RequestMapping("/first") public String first(RedirectAttribute redirectAttribute){ redirectAttribute.addFlashAttibute("param1", "lay"); return "redirect:/page/second"; } @RequestMapping("/second") public String second(@ModelAttribute("param1") String param1){ System.out.println(param1); return "second"; } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 使用springmvc配置視圖解析器和重定向方式
- 基於spring mvc請求controller訪問方式
- SpringMVC 重定向參數RedirectAttributes實例
- SpringMVC數據頁響應ModelAndView實現頁面跳轉
- 詳細聊聊Spring MVC重定向與轉發