A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水云间 中级黑马   /  2013-5-28 22:16  /  2118 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学习Servlet时,我们学到了Request和Response这两个对象,其中有两个很重要又非常类似的方法,就是转发和重定向,如下代码所示:
  1. request.getRequestDispatcher().forward(request,response);
  2. response.sendRedirect(URL);
复制代码
请问这两个方法有区别吗?比如在开发购物车的时候,要从一个页面转到结账页面,用哪个方法更好呢?

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 赞一个!

查看全部评分

5 个回复

正序浏览
* 重定向和请求转发
                * 浏览器发送一次请求,可以涉及多个页面。
                * 请求的个数:
                        * 重定向:2次
                        * 请求转发:1次
                * 地址栏是否改变
                        * 重定向:改变
                        * 请求转发:不改变
                * api获得方式
                        * 重定向:response.sendRedirct(location)
                        * 请求转发:request.getRequestDispatcher(path).forward(...)
                * 是否可以共享request对象属性的值
                        * 重定向:不能获取,两个request对象
                        * 请求转发:可以获得,虽然是两个request对象,但第二个为第一个的克隆,数据相同。
                * 选择
                        * 重定向:多个资源,没有数据传递时。如果希望地址栏改变,肯定重定向。
                        * 请求转发:多个资源,request中有属性的传递时。如果资源在WEB-INF目录下,需要转发。
               
回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
转发重定向
URL变化
重新发出请求 不会
是否携带请求
目标URL要求 仅本WEB应用任意URL
以上是转发和重定向的区别。
在使用的时候,你要思考一下,是否需要在请求中携带针对于本次请求的数据?
如果答案为“是”,那么你就应该使用转发。
如果不需要在请求中携带数据就可以使用重定向。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
首先要明白什么时候用重定向,什么时候用转发,简单说:
如果 想改变地址栏的地址,使用重定向。不过此时request域中存的数据就没了
如果还想使用request域中的数据,建议使用转发,
例如此处的购物车案例,如果你使用session传递以前的购买状态,你可以使用转发,也可以使用重定向

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
使用sendRdirect()相当与资源重新请求,Request数据就全丢失了。  使用请求转发,Request的数据才能送到目标页面

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马