在用戶的列表頁面刪除一個用戶,在刪除后仍停留在列表頁面,但是要顯示刪除成功或者相應的錯誤信息。
以上這種情況在后台我們一般都分成2個controller,一個刪除的controller和一個查詢列表的controller,這時候我們就 需要用到Redirect跳轉,在刪除成功后進行跳轉進行列表查詢,(在struts2中是action到action的跳轉)。
/** * 用戶列表 * * @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跳轉,但顯然這不夠優雅,有沒有什么好的解決辦法呢?
有需求肯定就會有解決辦法,在這里我總結一下個人認為比較好用的、常用的方法,以及spring為我們封裝的方法(推薦):
方式一:自己手動拼接url
return "redirect:list-user.shtml?param1="+value1+"¶m2="+value2;
這個方式比較麻煩而且有個弊端,就是參數是中文的時候很難處理。
方式二:自己封裝一個類
自己進行一些封裝,包括中文的處理,轉碼解碼等,好處是可以根據自己想要的自由實現,壞處是增加了工作量。在一些沒有提供現成工具的框架中(例如 strut2,個人所知貌似提供了action之間的傳值,和url傳值類似,中文就會杯具。如果有好的處理,歡迎拍磚。),適合用此方法。
方式三:使用spring mvc提供的現成工具類
前提是你用了spring mvc。
在spring mvc中,我們常用的是ModelMap,但是它還提供了一個RedirectAttributesModelMap類,該類實現了RedirectAttributes接口,提供一個閃存存儲方案,使屬性能夠在重定向時依舊生存而不用嵌入到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中馬上移除對象,所以在刷新一下后這個值就會丟掉。