您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)SpringMVC如何重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
在控制器方法返回的視圖名稱中使用了redirect:前綴,這時(shí)返回的String不是用來(lái)尋找視圖,而是瀏覽器進(jìn)行跳轉(zhuǎn)的路徑:
return “redirect:/spitter/” + spitter.getUsername();
當(dāng)一個(gè)控制器返回的是一個(gè)redirect時(shí),原來(lái)的request會(huì)終止,并且會(huì)開(kāi)啟一個(gè)新的HTTP請(qǐng)求。原來(lái)request中所有的model數(shù)據(jù)都會(huì)清空。新的request不會(huì)有任何的model數(shù)據(jù),如圖:
現(xiàn)在不能再redirect時(shí)使用model來(lái)傳遞數(shù)據(jù)了。但是還有其他方法用來(lái)從重定向的方法中獲取數(shù)據(jù):
將數(shù)據(jù)轉(zhuǎn)換為路徑參數(shù)或者查詢參數(shù)
在flash屬性中發(fā)送數(shù)據(jù)首先來(lái)看一下Spring如何在路徑參數(shù)或者查詢參數(shù)中傳遞數(shù)據(jù)。
@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中其他的原始值也會(huì)作為查詢參數(shù)添加到重定向URL中。例如,除了username,model同時(shí)也包括新建的Spitter對(duì)象的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屬性并沒(méi)有映射到URL中的占位符,它會(huì)自動(dòng)作為查詢參數(shù)。
如果username是habuma,spitterId是42,那么返回的重定向路徑將是/spitter/habuma?spitterId=42。
Spring提供了通過(guò)RedirectAttributes來(lái)設(shè)置flash屬性,RedirectAttributes作為Model的子接口,新增了一些方法用來(lái)設(shè)置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}"; }
在重定向執(zhí)行之前,所有的flash屬性都會(huì)復(fù)制到會(huì)話中。在重定向后,存在會(huì)話中的flash屬性會(huì)被取出,并從會(huì)話轉(zhuǎn)移到模型之中。處理重定向的方法就能從模型中訪問(wèn)Spitter對(duì)象了,就像獲取其他的模型對(duì)象一樣
@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對(duì)象將會(huì)傳遞到視圖中進(jìn)行渲染。但是如果模型中不包含spitter屬性的話,那么showSpitterProfile()將會(huì)從Repository中查找Spitter,并將其存放到模型中。
重新定向顯示數(shù)據(jù)
.... .... <%@ 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"; } }
感謝各位的閱讀!關(guān)于“SpringMVC如何重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。