forward:是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect:就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取
所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。
调用方法:
Servlet中
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp
不同点
1.语句不同
转发: request.getRequestDispatcher("/login2/login.jsp").forward(request,response);
重定向 response.sendRedirect("/login2/success.jsp");
2.跳转后地址栏路径不同
转发:跳转之前的地址
重定向:跳转之后的地址 success.jsp
3.是否可以共享同一个request的数据
转发:可以共享
重定向:无法共享
4.原理不同
转发:110 呼叫转移
重定向:114 忘记带手机
5.效率的高低
转发的效率高
6.跳转的范围不同
转发:同一个项目(最大也就是当前服务器)
重定向:不同的服务器
7.路径的不同
转发
绝对路径:不支持
根路径: 不写上下文路径 因为只能在当前项目中跳转 /代表当前项目的根目录 /myservlet/
相对路径:只能相对于当前文件自身,不能相对于base基准路径
重定向
绝对路径:支持 可以跳转到互联网的任意位置
根路径:需要写上下文路径 ,可以跳转到当前服务器的所有项目
相对路径:只能相对于当前文件自身,不能相对于base基准路径
到底使用哪种路径
1.如果要跳转到其他服务器,只能使用绝对路径,并且只能使用重定向
2.如果要跳转到当前服务器的其他项目,建议使用根路径,并且只能使用重定向
3.如果要跳转到当前服务器的当前项目,建议使用根路径。根据简单
转发:/admin/login.jsp /代表当前项目的根目录
重定向:/myservlet/admin/success.jsp /代表当前服务器的根目录
request.getContextPath()+"/admin/success.jsp" 建议动态获取上下文路径
转发和重定向的选择
1.某些情况下,无可选择
希望前后两个组件共享request数据,使用转发
跳转到同一个应用的WEB-INF目录下只能用转发
跳转到不同的应用只能使用重定向
使用Cookie存储数据需要使用重定向
2.跳转到同一个应用,哪种方式更好
使用转发效率高,尽量使用转发
使用转发需要解决重复提交问题,尤其是添加操作
注销之后一般用重定向
连续表单页面之间建议使用重定向,避免属性冲突