springmvc請求轉發和重定向(攜帶參數和不攜帶參數)

請求轉發的三種方式

SpringMVC請求轉發區別於重定向,請求轉發地址欄不會發生改變、只發送一次請求、能攜帶原有的參數,但只可以在同一個服務器中進行轉發。

  1. 傳統的請求轉發

    @RequestMapping("/forwardCommon")
    public  forwardCommon(HttpServletRequest request,HttpServletResponse response){
      request.getServletDispatcher("/WEBINF/pages/success.jsp").forward(request,response);
    }
    
  2. 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");
    }
    
  3. 請求轉發經過視圖解析器

    其實很多人並不知道經過視圖解析器的路由轉發也是請求轉發

    @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下的資源(可重定向後再進行一次請求轉發)。

  1. 傳統的重定向

    @RequestMapping(value="/testredirect",method = { RequestMethod.POST, RequestMethod.GET })  
    public void testredirect(HttpServletResponse response){  
        response.sendRedirect("/index");
    }
    
  2. 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;
    }
    
  3. 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";
      }
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章