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";
      }
      
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章