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无效。重定向后参数值只会出现一次,刷新页面后不再出现。