您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關SpringMVC如何重新定向redirect請求中攜帶數據方式的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
在控制器方法返回的視圖名稱中使用了redirect:前綴,這時返回的String不是用來尋找視圖,而是瀏覽器進行跳轉的路徑:
return “redirect:/spitter/” + spitter.getUsername();
當一個控制器返回的是一個redirect時,原來的request會終止,并且會開啟一個新的HTTP請求。原來request中所有的model數據都會清空。新的request不會有任何的model數據,如圖:
現在不能再redirect時使用model來傳遞數據了。但是還有其他方法用來從重定向的方法中獲取數據:
將數據轉換為路徑參數或者查詢參數
在flash屬性中發送數據首先來看一下Spring如何在路徑參數或者查詢參數中傳遞數據。
@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。
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}"/> ....
return "redirect:/page/second?param1=lay¶m2=lay2";
public String first(RedirectAttribute redirectAttribute){ redirectAttribute.addAttribute("param1", "lay"); return "redirect:/page/second"; }
@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"; } }
感謝各位的閱讀!關于“SpringMVC如何重新定向redirect請求中攜帶數據方式”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。