SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)方式
SpringMVC 重新定向redirect請(qǐng)求中攜帶數(shù)據(jù)
- 在控制器方法返回的視圖名稱中使用了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ù)。
使用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中其他的原始值也會(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。
使用flash屬性
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}"/>
....
SpringMVC 幾種重定向攜帶數(shù)據(jù)方法
1.拼接字符串
return "redirect:/page/second?param1=lay¶m2=lay2";
2.采用RedirectAttribute來(lái)傳參數(shù)
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";
}
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringMVC詳解如何映射請(qǐng)求數(shù)據(jù)
- Java超詳細(xì)講解SpringMVC如何獲取請(qǐng)求數(shù)據(jù)
- 關(guān)于SpringMVC請(qǐng)求域?qū)ο蟮臄?shù)據(jù)共享問(wèn)題
- 使用springmvc的controller層獲取到請(qǐng)求的數(shù)據(jù)方式
- Springmvc獲取前臺(tái)請(qǐng)求數(shù)據(jù)過(guò)程解析
- Springmvc處理ajax請(qǐng)求并返回json數(shù)據(jù)
- SpringMVC 跨重定向請(qǐng)求傳遞數(shù)據(jù)的方法實(shí)現(xiàn)
- SpringMVC解析JSON請(qǐng)求數(shù)據(jù)問(wèn)題解析
- SpringMVC請(qǐng)求數(shù)據(jù)詳解講解
相關(guān)文章
學(xué)習(xí)Java九大內(nèi)置對(duì)象
學(xué)習(xí)Java九大內(nèi)置對(duì)象,從現(xiàn)在開(kāi)始,希望大家可以通過(guò)這篇文章可以真正的理解Java九大內(nèi)置對(duì)象,感興趣的朋友可以參考一下2016-05-05
淺談什么是SpringBoot異常處理自動(dòng)配置的原理
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著SpringBoot異常處理自動(dòng)配置展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
淺析Spring IOC bean為什么默認(rèn)是單例
單例的意思就是說(shuō)在 Spring IoC 容器中只會(huì)存在一個(gè) bean 的實(shí)例,無(wú)論一次調(diào)用還是多次調(diào)用,始終指向的都是同一個(gè) bean 對(duì)象,本文小編將和大家一起分析Spring IOC bean為什么默認(rèn)是單例,需要的朋友可以參考下2023-12-12
Java 14 發(fā)布了,你還會(huì)使用Lombok?
2020年3月17日發(fā)布,Java正式發(fā)布了JDK 14 ,目前已經(jīng)可以開(kāi)放下載。在JDK 14中,共有16個(gè)新特性,本文主要來(lái)介紹其中的一個(gè)特性:JEP 359: Records,需要的朋友可以參考下2020-04-04
Java實(shí)現(xiàn)從字符串中找出數(shù)字字符串的方法小結(jié)
這篇文章主要介紹了Java實(shí)現(xiàn)從字符串中找出數(shù)字字符串的方法,結(jié)合實(shí)例形式總結(jié)分析了Java查找數(shù)字字符串的常用技巧,需要的朋友可以參考下2016-03-03
Java打亂ArrayList生成一個(gè)隨機(jī)序列列表
有時(shí)候會(huì)需要將一個(gè)ArrayList或者數(shù)組中的數(shù)字打亂,方便后續(xù)使用,比如隨機(jī)出題、答案選項(xiàng)打亂、連線題打亂、抽獎(jiǎng)號(hào)碼打亂等等,把我自己寫(xiě)的一段代碼貼出來(lái)分享給大家。2016-08-08
詳解Kotlin和anko融合進(jìn)行Android開(kāi)發(fā)
本篇文章主要介紹了Kotlin和anko融合進(jìn)行Android開(kāi)發(fā),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
javaweb 實(shí)現(xiàn)文件下載的方法及實(shí)例代碼
這篇文章主要介紹了javaweb 實(shí)現(xiàn)文件下載的方法的相關(guān)資料,這里提供了實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-11-11

