请求转发与重定向的区别
不同1:语法不同
请求转发:request.getRequestDispatcher("dis02").forword(request,response);
重定向:response.sentRedirect("red02");
不同2:请求不同
请求转发:是一个请求
重定向:是不同的请求
不同3:地址栏是否发生改变
请求转发:不变
重定向:变
不同4:请求参数能否携带
请求转发:可以
重定向:不可以, 但是可以手动设置携带参数:resp.sendRedirect("red2?uname="+req.getParameter("uname")+"&pwd=123");
不同5:执行效率不同
请求转发:服务器内部跳转,所以效率高啊
重定向:相对效率低
不同6:跳转范围不同
请求转发:只能在服务器内部跳转
重定向:既能跳转服务器内部资源,又能跳转服务器外部资源
不同7:表单是否发生重复提交
请求转发:会,指的是数据提交后,刷新页面,因为地址栏地址不变,每刷新一次都会重复请求一次,数据提交一次。如果刚好是个添加操作,每次都会添加一次。
重定向:不会
不同8:路径书写方式不同
(1)绝对路径 - 有协议、IP、端口 ,eg: http://www.baidu.com
请求转发:不支持
重定向:支持
(2)相对路径:相对servlet的url地址的路径 (不建议)
自行测试:将第一个servlet地址改为"/msb/s1",然后分别请求转发,重定向到第二个servlet,观看相对地址和运行结果
对于不加/,就是相对路径,相对servlet配置的url-pattern(请求地址),所以你要是url-pattern配置的是 /a 那么不加/ 没啥问题 ,但是url-pattern里面要是 /a/b/c 那么在访问jsp的时候 可能就出错了! 代码不加/就出错了!
(3)根路径: 资源路径加"/" (建议)
请求转发:到项目根目录下查找资源 http://localhost:8080/项目访问名/
重定向:到服务器根目录下查找资源 http://localhost:8080/
eg:resp.sendRedirect(req.getContextPath()+"/dis2");
转发和重定向使用场景
1、跳转前后是否需要共享request中数据
如果需要共享:转发
如果不需要共享:都可以
2、是否要跳转到服务器外部资源
如果需要跳出项目:重定向
如果不需要:都可以
3、是否涉及表单重复提交
重定向:不会造成表单重复提交
转发:会造成表单重复提交
评论区