欢迎各位大神予以指教

个人看法

由于我们专业的主要方向式webApp开发,所以不可避免的要接触到HTTP的servlet的知识,而servlet中的重定向与请求转发式比较让人比较迷惑的,我不想讨论技术的对错,技术不分好坏,只有人才分。
这两个技术各有千秋!但是在不考虑服务器的性能的情况下我还是更倾向于使用请求转发,因为它不会把url暴露出来。

调用方式区别

写过这么多的代码了,我想servlet中的调用转发、重定向的语句应该已经融入灵魂之中了吧!
虽然这么说,但是作为好人的我还是要将此代码公布与众,请求转发的语句是:

request.getRequestDispatcher("login.jsp").forward(request,response);

重定向是:

response.sendRedirect("login.jsp");

以上是在servlet中的代码,那么要是在jsp页面要该怎么办呢?其实也很简单,各位看官看好了,接下来的代码会让天地失色,大神瞪眼:

<jsp:forward page="login.jsp"/> //请求转发
<%response.sendRedirect("login.jsp");//重定向到new.jsp%>

相信各位大侠看到这可能会有所疑惑,那到底是什么啊?
哪还是来张图吧!毕竟一图顶千言啊!

请求转发图解

请求转发
美女A对帅哥B说,帮我取一下快递然后放到我桌子上呗,同学!
然后帅哥B又对美女C也说了同样的话,只不过是经过转述过的,A不知道是C帮她取的快递!
接着C将快递放到A指定的地方!
这里A相当于浏览器,B/C都是浏览器。
图片说明

重定向图解

重定向

故事讲解

假如你需要办理某种商品,
请求转发版式:你先去了A公司,A公司的人说我们不生产这种商品,你应该去隔壁的B公司,然后你就自己去B公司购买了商品
重定向版式:你先去A公司,A公司知道自己公司不生产这种商品而B公司生产,A公司不想失去你这个客户也不想让你知道,所以B公司偷偷的联系B公司,让他们把货送来。

本质区别

还是来介绍一下他们的本质区别吧
一句话,转发是服务器的行为,重定向是客户端的行为。为什么这么说呢,之前已将讲过了,转发必须是同一个web容器下的url,不能转发到其他的web路径下去,中间传递的是自己容器内的request。在客户浏览器路径栏显示的任然是第一次的url,也就是说用户感觉不到服务器做了转发。转发行为是浏览器只做一次访问请求。

重定向过程相对来说比较复杂:客户浏览器发送http请求--->web服务器接受后发送302状态码响应及对新的url给客户浏览器--->客户浏览器发现是302响应,则自动再发送一个新的http请求,请求的是新的url地址,在这里的路径可以是任意URL,在客户浏览器显示新的URL地址,重定向做了至少两次请求。

让我们用表格来终结这个知识点          

序号
问题
重定向
请求转发
1 第二次请求谁请求的?
 浏览器
  服务器
2 浏览器发送了几次请求?
2次以上
1次
3  servlet可以共享request吗?
不可以
可以
4 地址栏是否发生改变?

不是
5  浏览器地址栏显示的哪一次访问地址?
最后一次
第一次
6 可以跳转到什么资源?
任意资源
项目内部
7 第二次的请求路径是?
绝对路径
内部路径