使用SpringMVC在redirect重定向的時候攜帶參數(shù)的問題
在redirect重定向的時候攜帶參數(shù)問題
SpringMVC 中常用到 redirect來實現(xiàn)重定向。但使用場景各有需求,如果只是簡單的頁面跳轉(zhuǎn)顯然無法滿足所有要求,比如重定向時需要在 url 中拼接參數(shù),或者返回的頁面需要傳遞 Model。SpringMVC 用 RedirectAttributes 解決了這兩個需要。
首先,在 Controller 中做 redirect 中可用如下方式實現(xiàn):
return new ModelAndView(“redirect:/index”);
或
return “redirect:/index”;
此時,如果只是重定向至某一 URL 或者比較簡單地址,也可以不用 RedirectAttributes,直接拼接,如:return “redirect:/index?param1=value1″;
但是這樣似乎有點過于簡單粗暴,而且參數(shù)多了很容易使代碼可讀性變差。使用 RedirectAttributes 來設置重定向頁面的參數(shù),SpringMVC 會自動拼接 url。
接下來主要介紹該對象的兩個方法:
1. addAttribute
@RequestMapping("/save") public String save(User user, RedirectAttributes redirectAttributes) { ? ? redirectAttributes.addAttribute("param", "value1"); ? ? return "redirect:/index"; }
請求 /save 后,跳轉(zhuǎn)至/index,并且會在url拼接 ?param=value1。
2. addFlashAttribute
@RequestMapping("/save") public String save(User user, RedirectAttributes redirectAttributes) { ? ? redirectAttributes.addFlashAttribute("param", "value1"); ? ? return "redirect:/index"; }
請求 /save 后,跳轉(zhuǎn)至 /index,并且可以在 index 對應的模版中通過表達式,比如 jsp 中 jstl 用 ${param},獲取返回值。該值其實是保存在 session 中的,并且會在下次重定向請求時刪除。
RedirectAttributes 中兩個方法的簡單介紹就是這樣。
redirect重定向3種方式(帶參數(shù))
Spring MVC中做form表單功能提交時,防止用戶客戶端后退或者刷新時重復提交問題,需要在服務端進行重定向跳轉(zhuǎn),其中redirect是直接跳轉(zhuǎn)到其他頁面,有以下3種方法進行重定向。
redirect重定向流程
客戶發(fā)送一個請求到服務器,服務器匹配servlet,這都和請求轉(zhuǎn)發(fā)一樣,servlet處理完之后調(diào)用了sendRedirect()這個方法,這個方法是response的方法,所以,當這個servlet處理完之后,看到response.senRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再發(fā)送一個請求,去訪問test.jsp,緊接著客戶端受到這個請求后,立刻發(fā)出一個新的請求,去請求test.jsp,這里兩個請求互不干擾,相互獨立,在前面request里面setAttribute()的任何東西,在后面的request里面都獲得不了??梢?,在sendRedirect()里面是兩個請求,兩個響應。
1. response.sendRedirect重定向跳轉(zhuǎn)
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) ? public ModelAndView testredirect(HttpServletResponse response){ ? ? ? response.sendRedirect("/index"); ? ? return null;? }
2. ViewResolver直接跳轉(zhuǎn)
不帶參數(shù)
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) ? public ?String testredirect(HttpServletResponse response){ ? ? ? return "redirect:/index"; ? }?
帶參數(shù)
@RequestMapping("/testredirect") public String testredirect(Model model, RedirectAttributes attr) { ?? ?attr.addAttribute("test", "51gjie");//跳轉(zhuǎn)地址帶上test參數(shù) ? ? attr.addFlashAttribute("u2", "51gjie");//跳轉(zhuǎn)地址不帶上u2參數(shù) ?? ?return "redirect:/user/users"; }
使用RedirectAttributes的addAttribute方法傳遞參數(shù)會跟隨在URL后面,如上代碼即為http:/index.action?test=51gjie
使用addFlashAttribute不會跟隨在URL后面,會把該參數(shù)值暫時保存于session,待重定向url獲取該參數(shù)后從session中移除,這里的redirect必須是方法映射路徑,jsp無效。你會發(fā)現(xiàn)redirect后的jsp頁面中b只會出現(xiàn)一次,刷新后b再也不會出現(xiàn)了,這驗證了上面說的,b被訪問后就會從session中移除。對于重復提交可以使用此來完成.
spring mvc設置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect=true,這樣可以提高效率,避免不必要的檢索。
3. ModelAndView重定向
不帶參數(shù)
@RequestMapping(value="/restredirect",method = { RequestMethod.POST, RequestMethod.GET }) ? public ?ModelAndView restredirect(String userName){ ? ? ? ModelAndView ?model = new ModelAndView("redirect:/main/index"); ? ? ? ? return model; ? }
帶參數(shù)
@RequestMapping(value="/toredirect",method = { RequestMethod.POST, RequestMethod.GET }) ? public ?ModelAndView toredirect(String userName){ ? ? ? ModelAndView ?model = new ModelAndView("/main/index"); ?? ? ? model.addObject("userName", userName); ?//把userName參數(shù)帶入到controller的RedirectAttributes ? ? return model; ? }
小結(jié)一下:
1.redirect重定向可以跳轉(zhuǎn)到任意服務器,可以用在系統(tǒng)間的跳轉(zhuǎn)。
2.Spring MVC中redirect重定向,參數(shù)傳遞可以直接拼接url也可以使用RedirectAttributes來處理,由于是不同的請求,重定向傳遞的參數(shù)會在地址欄顯示,所以傳遞時要對中文編碼進行處理。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringCloud讀取Nacos配置中心報錯及遇到的坑:Could?not?resolve?placehold
這篇文章主要介紹了SpringCloud讀取Nacos配置中心報錯:Could?not?resolve?placeholder?‘xxx’?in?value?‘${xxx},本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例
本文主要介紹了SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12一文詳解SpringBoot中CommandLineRunner接口
Spring Boot的CommandLineRunner接口是一個函數(shù)式接口,用于在Spring Boot應用程序啟動后執(zhí)行一些初始化操作,它提供了一個run方法,該方法在應用程序啟動后被調(diào)用,本文給大家詳細介紹了SpringBoot中CommandLineRunner接口,需要的朋友可以參考下2023-10-10SpringBoot2整合Redis多數(shù)據(jù)源步驟詳解
這篇文章主要介紹了SpringBoot2整合Redis多數(shù)據(jù)源步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03Java的Comparable,Comparator和Cloneable三大接口詳解
這篇文章主要為大家詳細介紹了Java的Comparable,Comparator和Cloneable的接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03Java并發(fā)編程之CountDownLatch源碼解析
這篇文章主要介紹了Java并發(fā)編程之CountDownLatch源碼解析,文中有非常詳細的代碼示例,對正在學習java并發(fā)編程的小伙伴們有很好的幫助,需要的朋友可以參考下2021-04-04