Flash屬性( flash attributes) 提供了一個(gè)請求為另一個(gè)請求存儲有用屬性的方法。這在重定向的時(shí)候最常使用,比如常見的 POST/REDIRECT/GET 模式。Flash屬性會(huì)在重定向前被暫時(shí)地保存起來( 通常是保存在session中) ,重定向后會(huì)重新被下一個(gè)請求取用并立即從原保存地移除。
為支持flash屬性,Spring MVC提供了兩個(gè)抽象。 FlashMap 被用來存儲flash屬性,而用 FlashMapManager 來存儲、取回、管理 FlashMap 的實(shí)例。
對flash屬性的支持默認(rèn)是啟用的,并不需要顯式聲明,不過沒用到它時(shí)它絕不會(huì)主動(dòng)地去創(chuàng)建HTTP會(huì)話( session) 。對于每個(gè)請求,框架都會(huì)“傳進(jìn)”一個(gè) FlashMap ,里面存儲了從上個(gè)請求( 如果有) 保存下來的屬性;同時(shí),每個(gè)請求也會(huì)“輸出”一個(gè) FlashMap ,里面保存了要給下個(gè)請求使用的屬性。兩個(gè) FlashMap 實(shí)例在Spring MVC應(yīng)用中的任何地點(diǎn)都可以通過 RequestContextUtils 工具類的靜態(tài)方法取得。
控制器通常不需要直接接觸 FlashMap 。一般是通過 @RequestMapping 方法去接受一個(gè) RedirectAttributes 類型的參數(shù),然后直接地往其中添加flash屬性。通過 RedirectAttributes 對象添加進(jìn)去的flash屬性會(huì)自動(dòng)被填充到請求的“輸出” FlashMap 對象中去。類似地,重定向后“傳進(jìn)”的 FlashMap 屬性也會(huì)自動(dòng)被添加到服務(wù)重定向URL的控制器參數(shù) Model 中去。
模擬這種場景:更一條信息后,跳轉(zhuǎn)到列表頁,并提示更新成功
代碼示例:
@RequestMapping(value = "/list")
public ModelAndView list(){
return new ModelAndView("list");
}
@RequestMapping(value = "/update")
public ModelAndView update(RedirectAttributes redirectAttributes){
redirectAttributes.addFlashAttribute("msg", "更新成功");
return new ModelAndView("redirect:list");
}
頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
msg:${msg}
</body>
</html>