Spring MVC中redirect重定向3種方式(帶參數)

轉自:https://blog.csdn.net/weixin_39973810/article/details/84847922

Spring MVC中做form表單功能提交時,防止用戶客戶端後退或者刷新時重複提交問題,需要在服務端進行重定向跳轉,其中redirect是直接跳轉到其他頁面,有以下3種方法進行重定向。

redirect重定向流程

客戶發送一個請求到服務器,服務器匹配servlet,這都和請求轉發一樣,servlet處理完之後調用了sendRedirect()這個方法,這個方法是response的方法,所以,當這個servlet處理完之後,看到response.senRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再發送一個請求,去訪問test.jsp,緊接着客戶端受到這個請求後,立刻發出一個新的請求,去請求test.jsp,這裏兩個請求互不干擾,相互獨立,在前面request裏面setAttribute()的任何東西,在後面的request裏面都獲得不了。可見,在sendRedirect()裏面是兩個請求,兩個響應。

1. response.sendRedirect重定向跳轉

@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public ModelAndView testredirect(HttpServletResponse response){  
    response.sendRedirect("/index");
    return null; 
}

 

2. ViewResolver直接跳轉

不帶參數

@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public  String testredirect(HttpServletResponse response){  
    return "redirect:/index";  
} 

帶參數

@RequestMapping("/testredirect")
public String testredirect(Model model, RedirectAttributes attr) {
	attr.addAttribute("test", "51gjie");//跳轉地址帶上test參數
        attr.addFlashAttribute("u2", "51gjie");//跳轉地址不帶上u2參數
	return "redirect:/user/users";
}
  • 使用RedirectAttributes的addAttribute方法傳遞參數會跟隨在URL後面,如上代碼即爲http:/index.action?test=51gjie

  • 使用addFlashAttribute不會跟隨在URL後面,會把該參數值暫時保存於session,待重定向url獲取該參數後從session中移除,這裏的redirect必須是方法映射路徑,jsp無效。請求 /testredirect 後,跳轉至 /user/users,並且可以在users 對應的模版中通過表達式,比如 jsp 中 jstl 用 ${param},獲取返回值。

  • spring mvc設置下RequestMappingHandlerAdapter 的ignoreDefaultModelOnRedirect=true,這樣可以提高效率,避免不必要的檢索。
     

3. ModelAndView重定向

不帶參數

@RequestMapping(value="/restredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public  ModelAndView restredirect(String userName){  
    ModelAndView  model = new ModelAndView("redirect:/main/index");    
    return model;  
}

帶參數

@RequestMapping(value="/toredirect",method = { RequestMethod.POST, RequestMethod.GET })  
public  ModelAndView toredirect(String userName){  
    ModelAndView  model = new ModelAndView("/main/index");   
    model.addObject("userName", userName);  //把userName參數帶入到controller的RedirectAttributes
    return model;  
}

重定向傳值el表達式要加param.變量名。  eg:userName:${param.userName} 

總結

1, redirect重定向可以跳轉到任意服務器,可以用在系統間的跳轉。
2, Spring MVC中redirect重定向,參數傳遞可以直接拼接url也可以使用RedirectAttributes來處理,由於是不同的請求,重定向傳遞的參數會在地址欄顯示,所以傳遞時要對中文編碼進行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章