文章目录
定义
请求重定向
客户端行为。从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变
response.sendRedirect("request.jsp")
请求转发
服务器行为。是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变
//将内置对象request与response转发到request.jsp中
request.getRequestDispatcher("request.jsp").forward(quest,response);
两者区别
跳转范围
重定向:还可以重新定向到同一站点不同应用程序中的资源甚至可以定向到一绝对的URL
请求转发:只能将请求发给同一个Web应用中的组件
URL
重定向:可以看到目标页面的URL
转发:只能看到第一次访问页面的URL
reqeust、response的区别
重定向:调用者和被调用者属于两个独立访问请求和响应过程
转发:调用者和被调用者之间共享相同的request和response对象
注意
重定向:跳转后必须加上return,不然页面虽然跳转了,但是还会执行跳转后面的语句
转发:是执行了跳转页面,下面代码就不会执行了
前端实现
<!-- 自动跳转-->
<meta http-equiv="Refresh" content="1;url=home"/>
JS文件中实现
重定向
//第一种
window.location.href="href.PHP?backurl="+window.location.href;
//第二种
window.history.back(-1); //返回上一个页面
//第三种
window.navigate("href.php");
//第四种
self.location='href.php';
//第五种
top.location='href.php';
转发
//获得表单内容并转发
var doc = document.getElementById("document");
doc.action = "${pageContext.request.contextPath}/documentManager/save";
doc.method = "post";
doc.submit();
后端Java实现
重定向
request.sendRedirect("request.jsp")
转发
request.getRequestDispatcher("request.jsp").forward(quest,response);
SpringMVC实现
重定向
不带参数
//方案一:
return new ModelAndView("redirect:/toList");
//方案二:
return "redirect:/toList";
带参数
-
url传参
new ModelAndView("redirect:/toList?param1="+value1+"¶m2="+value2);
-
带参数不拼接url页面
原理:放到session中,session在跳转页面后马上移除,刷新一下值丢失;用EL获取@RequestMapping(value="/redirect",method=RequestMethod.GET) public String testRedirect(RedirectAttributes attr){ attr.addAttribute("a", "a"); attr.addFlashAttribute("b", "b"); return "redirect:/index.action"; }
转发
-
返回ModelAndView
@RequestMapping(value="/model",method=RequestMethod.GET) public ModelAndView testForward(ModelAndView model,@RequestParam(value="id",defaultValue="1",required=false)Long id){ User u = getBaseService().get(User.class, id); model.addObject("user", u); model.setViewName("forward:index.jsp"); return model; }
-
返回string
@RequestMapping(value="/forward",method=RequestMethod.GET) public String testForward(){ return "forward:/index.action"; }