SpringMVC重定向与请求转发

SpringMVC重定向与请求转发

一,请求转发

  • ①请求转发地址栏不会发生改变
  • ②请求转发只发送一次请求、能携带原有的参数
  • ③请求转发只可以在同一个服务器中进行转发
  • ④实际上视图解析器的转发本质也是请求转发

SpringMVC中请求转发有三种方式:
Ⅰ,原生Selvlet请求转发:

@RequestMapping("/forward")
    public void toXXX(HttpServletRequest request,HttpServletResponse response){
        try {
            request.getRequestDispatcher("//WEB-INF/pages/test.jsp").forward(request,response);
        } catch (ServletException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Ⅱ,使用视图解析器

   @RequestMapping("/forward")
    public ModelAndView toXXX(ModelAndView modelAndView){
        modelAndView.setViewName("test");
        return modelAndView;
    }
    @RequestMapping("/forward2")
    public String toXXX2(){
        return "test";
    }

Ⅲ,不使用视图解析器

    @RequestMapping("/forward")
    public String toXXX(){
        return "forward:/WEB-INF/templates/test.jsp" ;
    }
    @RequestMapping("/forward2")
    public ModelAndView toXXX2(){
        ModelAndView modelAndView1 = new ModelAndView();
        modelAndView1.setViewName("forward:/WEB-INF/templates/test.jsp");
        return modelAndView1;
    }

二,重定向

  • 重定向是两次请求、两次响应
  • 重定向前后,浏览器的地址栏地址会发生变化。(因为两次请求都是通过浏览器发起,浏览器知道这个跳转的过程,因此地址栏地址会变化)
  • 重定向前后的request对象不是同一个(因为重定向是两次请求,服务器会根据两次请求创建两个不同的request对象,request对象不是同一个,也就不能在重定向时通过request带数据到目的地。)
  • 重定向前后的两个资源可以是来自不同的web应用,甚至可以是来自不同的服务器。(进行跳转的两个资源之间没有限制)

Ⅰ,原生Servlet实现重定向

@RequestMapping(value="/testredirect")
    public void doRedirect(HttpServletResponse response){
        try {
            response.sendRedirect("/index");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Ⅱ,SpringMVC整合后的不带参数的重定向

    @RequestMapping(value="/testredirect")
    public String doRedirect(){
        return "redirect:/index";
    }
    @RequestMapping(value="/testredirect")
    public ModelAndView doRedirect2(){
        ModelAndView mv=new ModelAndView();
        mv.setViewName("redirect:/index");
        return mv;
    }

Ⅲ,SpringMVC整合后的带参数的重定向
-redirectAttributes.addAttributie(“prama”,value); 在重定向url上拼接参数

@RequestMapping("/test")
    private String doTest(RedirectAttributes ra) {
        ra.addAttribute("param", 1);
        return "redirect:/templates/test";
    }

-rectAttributes.addFlashAttributie(“prama”,value);这种方法不在url上拼接,可以使用@ModelAttribute注解接受。

@RequestMapping("/test")
    private String doTest(RedirectAttributes ra) {
        ra.addFlashAttribute("param", 1);
        return "redirect:/templates/test";
    }
    
接受参数
@RequestMapping("/test")
    private void doTest(@ModelAttribute("param") String param) {
    }

三,关于重定向带参数,是否隐藏问题

  • 使用addAttribute方法传参,参数会自动拼接在URL后面。
  • 使用addFlashAttribute方法会把参数值暂存于session,待重定向URL获取该参数后从session中移除,这里的redirect必须是方法映射路径,jsp无效。重定向后参数值只会出现一次,刷新页面后不再出现。

你可能感兴趣的:(教程,常见疑问,java,spring,开发语言)