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) {}