SpringMVC Redirect 跳轉後保存Model中的數據

在作項目編碼時,幾乎都不可避免的要用到Redirect跳轉並保存其中的參數。例以下面的需求:html

在用戶的列表頁面刪除一個用戶,在刪除後仍停留在列表頁面,可是要顯示刪除成功或者相應的錯誤信息。java

以上這種狀況在後臺咱們通常都分紅2個controller,一個刪除的controller和一個查詢列表的controller,這時候咱們就須要用到Redirect跳轉,在刪除成功後進行跳轉進行列表查詢,(在struts2中是action到action的跳轉)。spring

參考以下代碼:session

 
/**
* 用戶列表
*
* @return
*/
@RequestMapping(value = "list-user", method = RequestMethod.GET)
public String listUser(UserVo user, ModelMap modelMap) {
Pager pager = userService.queryPageList(user);
modelMap.put("pager", pager);
return "admin/list-user";
}
/**
* 刪除用戶
*
* @param userId the user id
* @param modelMap the model map
* @return string
*/
@RequestMapping(value = "delete-user", method = RequestMethod.POST)
public String deleteUser(Long[] userId, ModelMap modelMap) {
userService.deleteUser(userId);
modelMap.put("resultMsg", "刪除成功");
return "redirect:list-user.shtml";
}

咱們發現,當刪除成功後跳轉到list-user這個controller時,「刪除成功」這個消息丟失了。固然你能夠在刪除用戶後再加入查詢用戶列表的代碼而不進行controller之間的redirect跳轉,但顯然這不夠優雅,有沒有什麼好的解決辦法呢?mvc

有需求確定就會有解決辦法,在這裏我總結一下我的認爲比較好用的、經常使用的方法,以及spring爲咱們封裝的方法(推薦):app

方式一:本身手動拼接url

 
return "redirect:list-user.shtml?param1="+value1+"&param2="+value2;

這個方式比較麻煩並且有個弊端,就是參數是中文的時候很難處理。框架

方式二:本身封裝一個類

本身進行一些封裝,包括中文的處理,轉碼解碼等,好處是能夠根據本身想要的自由實現,壞處是增長了工做量。在一些沒有提供現成工具的框架中(例如strut2,我的所知貌似提供了action之間的傳值,和url傳值相似,中文就會杯具。若是有好的處理,歡迎拍磚。),適合用此方法。ide

代碼:略。工具

方式三:使用spring mvc提供的現成工具類

這也是本人推薦的實現方式,固然前提是你用了spring mvc。性能

在spring mvc中,咱們經常使用的是ModelMap,可是它還提供了一個RedirectAttributesModelMap類,該類實現了RedirectAttributes接口,提供一個閃存存儲方案,使屬性可以在重定向時依舊生存而不用嵌入到url,如下是官方文檔的介紹:

A ModelMap implementation of RedirectAttributes that formats values as Strings using a DataBinder. Also provides a place to store flash attributes so they can survive a redirect without the need to be embedded in the redirect URL.

有了這個,咱們處理起來就簡單多了,參考以下代碼:

 
@RequestMapping(value = "delete-user", method = RequestMethod.POST)
public String deleteUser(Long[] userId, RedirectAttributesModelMap modelMap) {
userService.deleteUser(userId);
modelMap.addFlashAttribute("resultMsg", "刪除成功");
return "redirect:list-user.shtml";
}

發現進行redirect跳轉後,「刪除成功」的消息仍舊爲咱們保持着。

其實最底層仍舊是兩種跳轉,只不過spring又進行了封裝而已,原理是把屬性放到session中,在跳到頁面後又在session中立刻移除對象,因此在刷新一下後這個值就會丟掉。

相關文章
相關標籤/搜索