Spring MVC中有兩種重定向方式:
- 通過返回字符串,字符串必須以redirect:開頭;
- 通過返回ModelAndView;
重定向的時候如果需要給重定向目標方法傳參數,要分字符串參數和pojo對象參數兩種,先來總結一下通過返回字符串重定向的方式。
直接模擬一種場景:我在頁面點擊下一步按鈕,會跳轉到新的頁面,中間通過重定向傳遞一些參數,如下圖:
我的第一個頁面:

點擊右下角的下一頁按鈕之后,跳轉到下面的頁面:

將重定向傳遞過來的參數顯示在第一個方塊中指定的位置,這就是需要實現的功能,下面是編碼過程。頁面的代碼省略,只貼重要部分。
1、給按鈕綁定請求事件
// 點擊下一頁進行跳轉 $("#nextPage").click(function() { window.location.href = "../jump/ToNextPage"; });
2、創建控制器
第一步中的請求路徑是../jump/ToNextPage,所以首先需要創建一個控制器,它的訪問路徑為/jump,然后創建一個方法,它的訪問路徑為並ToNextPage ,並在此方法中實現重定向功能。
@Controller @RequestMapping("/jump") public class JumpController { /** * 通過返回字符串實現重定向 注意⚠️:通過Model傳遞字符串參數 * * @param model * @return */ @RequestMapping("ToNextPage") public String jumpToNextPage(Model model) { model.addAttribute("username", "Spring MVC"); model.addAttribute("msg", "Welcome to my house"); return "redirect:./nextPage"; } @RequestMapping("nextPage") public ModelAndView nextPage(String username, String msg) { ModelAndView mv = new ModelAndView(); mv.addObject("userName", username); mv.addObject("msg", msg); mv.setViewName("jump/jump"); return mv; } }
上面代碼中紅色加粗部分為重點:
- Model model:使用Model數據模型傳遞字符串參數;
- redirect:./nextPage:返回字符串,字符串以redirect:開頭時,Spring MVC會將它視為重定向處理;
- String username,String msg:重定向到的方法中接受參數時直接使用字符串接受,且參數名稱就是在數據模型Model中定義的key;
在重定向之后的方法中,將獲取到的參數渲染到了視圖jump中,這樣就能在視圖中獲取這兩個參數了。
3、在重定向頁面獲取傳遞的參數
<div class="simple public"> <p style="text-align: center;">字符串重定向</p> <p>Hello ${userName },${msg }</p> </div>
上面代碼中紅色加粗的部分就是獲取通過重定向傳遞過來的參數。
4、測試
上面傳遞的參數為
- username:Spring MCV
- msg:Welcome to my house
查看結果:

從上面的結果中可以看出:
- 點擊下一頁之后URL變成了重定向的路徑,並且帶有參數;
- 在之前要顯示參數的位置獲取到了傳遞過來的參數;
所以重定向成功。在上面的重定向過程中,傳遞的參數是個字符串,而且只能用Model數據模型傳遞,有時候需要傳遞一個pojo對象,但是HTTP的重定向參數是以字符串傳遞的,在Spring MVC中可以使用RedirectAttributes對象的addFlashAttribute傳遞pojo對象,它的原理是將數據保存在session中,重定向之后將其清除。
5、重定向傳遞POJO對象
還是上面的場景,只不過這次將重定向參數改為pojo對象,代碼如下:
@Controller @RequestMapping("/jump") public class JumpController { @RequestMapping("ToNextPage1") public String jumpToNextPage1(RedirectAttributes ra) { Param param = new Param(); param.setParamName("Spring MVC"); param.setParamDesc("歡迎加入"); ra.addFlashAttribute("param", param); return "redirect:./nextPage1"; } @RequestMapping("nextPage1") public ModelAndView nextPage(Param param) { ModelAndView mv = new ModelAndView(); mv.addObject("userName", param.getParamName()); mv.addObject("msg", param.getParamDesc()); mv.setViewName("jump/jump"); return mv; } }
上面代碼中紅色加粗的部分是重點:
- RedirectAttributes ra:通過這個對象的addFlashAttribute方法傳遞pojo對象參數;
- 在重定向后的方法中直接接受一個pojo對象即可;
看一下頁面跳轉情況

從結果可以看出,跳轉之后URL為重定向之后的路徑,雖然路徑中不帶有參數但是pojo參數傳遞成功了!
6、總結
上面的例子使用返回字符串的方式演示了Spring MVC中的重定向過程,以及重定向過程中傳遞參數的方法,需要注意以下幾點:
- 返回字符串重定向時,字符串中必須含有redirect,最好是以redirect開頭;
- 傳遞字符串參數使用Model數據模型;傳遞pojo參數使用RedirectAttributes類中的addFlashAttribute方法;
- 不能同時使用兩種方式傳遞參數;
