請求轉發的三種方式
SpringMVC
請求轉發區別於重定向,請求轉發地址欄不會發生改變、只發送一次請求、能攜帶原有的參數,但只可以在同一個服務器中進行轉發。
-
傳統的請求轉發
@RequestMapping("/forwardCommon") public forwardCommon(HttpServletRequest request,HttpServletResponse response){ request.getServletDispatcher("/WEBINF/pages/success.jsp").forward(request,response); }
-
SpringMVC
中不經過視圖解析器的請求轉發@RequestMapping("/forwardView") public String forwardView(){ return "forward:/WEB_INF/pages/success.jsp"; }
@RequestMapping("/forwardView") public String forwardView(){ ModelAndView mv=new ModelAndView(); mv.setViewName("forward:/WEB_INF/pages/success.jsp"); }
-
請求轉發經過視圖解析器
其實很多人並不知道經過視圖解析器的路由轉發也是請求轉發
@RequestMapping("/shopmanagement") private String shopManagement(Model model) { return "shop/shopmanagement"; }
@RequestMapping("/shopmanagement") private ModelAndView shopManagement(Model model) { ModelAndView mv=new ModelAndView(); mv.setViewName("shop/shopmanagement");//也是請求轉發,會經過視圖解析器 return mv; }
上面的請求轉發只要在瀏覽器地址欄中輸入
localhost:8080/o2o/shopadmin/shopmanagement?shopId=53
,就可以訪問shopmanagement.html
這個頁面,並且我們可以嘗試在該頁面中引入一個js
文件,試圖查看請求轉發後的地址。$(function(){ var shopId=getQueryString("shopId");//獲取url中的參數 var url=window.location.href;//獲得請求url }) function getQueryString(name){ var reg=new RegExp("(^|&)"+name+"=([^&]*)(&|$)"); var r=window.location.search.substr(1).match(reg); if(r!=null){ return decodeURIComponent(r[2]); } return null; }
我們可以發現請求轉發後的地址和第一次請求的地址一樣, 連地址後面攜帶的參數都一樣。所以請求轉發不僅可以在請求體中攜帶參數(POST
請求),也可以在地址欄中攜帶參數(GET
請求),最後都可以在轉發後的頁面中獲得該參數的值。
重定向
傳統的重定向請求地址會改變(兩次請求)、不能傳遞參數,但是利用SpringMVC
的重定向可以攜帶和傳遞參數。重定向相比於請求轉發可以跨服,但是不能直接重定向訪問WEB-INF
下的資源(可重定向後再進行一次請求轉發)。
-
傳統的重定向
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) public void testredirect(HttpServletResponse response){ response.sendRedirect("/index"); }
-
SpringMVC
中不帶參數的重定向@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) public String testredirect(){ return "redirect:/index"; }
@RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET }) public ModelAndView testredirect(){ ModelAndView mv=new ModelAndView(); mv.setViewName("redirect:/index"); return mv; }
-
SpringMVC
中帶參數的重定向-
redirectAttributes.addAttributie("prama",value);
這種方法相當於在重定向鏈接地址上追加傳遞的參數@RequestMapping("/test") private String shopList(RedirectAttributes ra) { ra.addAttribute("param", 1); return "redirect:/shopadmin/shoplist"; } //相當於請求 http://localhost:8080/o2o/shopadmin/shoplist?param=1
-
redirectAttributes.addFlashAttributie("prama",value);
這種方法是隱藏了參數,鏈接地址上不直接暴露,用(@ModelAttribute(value = "prama")String prama)
的方式獲取參數。@RequestMapping("/test") private String shopList(RedirectAttributes ra) { ra.addFlashAttribute("param", 1); return "redirect:/shopadmin/shoplist"; }
接收參數
@RequestMapping("/shoplist") private String shopList(@ModelAttribute("param") String param) { System.out.println(param);//輸出1 return "shop/shoplist"; }
-