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


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

以上這種情況在后台我們一般都分成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+"&param2="+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中馬上移除對象,所以在刷新一下后這個值就會丟掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM