转发和重定向的区别
来源:互联网 发布:java compare的用法 编辑:程序博客网 时间:2024/05/18 01:59
转发: request.getRequestDispatcher("/b").forward(request, response);
重定向: response.sendRedirect("forward.jsp");
转发:
两个jsp共享一个request请求 (这里页面之间的属性值是可以传递,并共享的。)
Forword不仅可以跳转到本应用中的另一个servlet,JSP,还可以跳转到另外一个文件,
甚至是WEB-INF下的 web.xml文件 Forward跳转是一种服务器端的跳转。
比如:
<input type="button" onclick='location="./a?destination=servlet"' value="跳转到servlet">
<input type="button" onclick='location="./a?destination=file"' value="跳转到web.xml">
<input type="button" onclick='location="./a?destination=jsp"' value="跳转到JSP">
当你点击第三个按钮的时候:浏览器地址栏会显示
http://localhost:8080/ForwardAndRedirect/a?destination=jsp
服务器端的响应为:
if("jsp".equals(destination)){
request.getRequestDispatcher("forward.jsp").forward(request, response);
}
很明显他跳转到了forward.jsp 但是经过服务器段跳转完成之后,浏览器上的地址栏依是:
http://localhost:8080/ForwardAndRedirect/a?destination=jsp
这是为什么呢? 很明显。JSP也是一种servlet这个跳转是发生在服务器端的,对与浏览器来讲是透明的,浏览器根本就
不知道 服务器到底跳到哪里去了,所以地址栏的地址是不会改变的。
我们在看重定向。
重定向:放弃当前request请求,重新生成一个新的请求
比如:同样以上面同样的例子加以说明:
<input type="button" onclick='location="./a?destination=servlet"' value="跳转到servlet">
<input type="button" onclick='location="./a?destination=file"' value="跳转到web.xml">
<input type="button" onclick='location="./a?destination=jsp"' value="跳转到JSP">
当你点击第三个按钮的时候:浏览器地址栏会显示
http://localhost:8080/ForwardAndRedirect/forward.jsp
服务器端的响应为:
f("jsp".equals(destination)){
response.sendRedirect("forward.jsp");
}
实际上sendRedirect方法封装了两个属性:
//返回给浏览器告诉浏览器一个状态码
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
// 返回给客户端告诉浏览器一个访问地址
response.setHeader("location", "http://localhost:8080/ForwardAndRedirect/forward.jsp");
很明显他跳转到了forward.jsp 但是经过服务器段跳转完成之后,浏览器上的地址栏却不是:
http://localhost:8080/ForwardAndRedirect/a?destination=jsp
而变成了: http://localhost:8080/ForwardAndRedirect/forward.jsp
这就不明白了,重定向跳转也是发生服务器端的呀,怎么浏览器却识别了服务器跳转的具体页面呢,
是不是与上面所说的矛盾了吗?
不要激动,不矛盾,是这样子的,重定向实际上浏览器开始是拿着这个"./a?destination=jsp"地址去请求服务器,
服务器不是马上发生了跳转,而是发给浏览器一个状态码,这个状态码是301或者302,和一新的访问地址,而这个新
的 访问地址恰恰就是http://localhost:8080/ForwardAndRedirect/forward.jsp 浏览器拿着这个地址,
再一次向服务器发送一次请求,请求forword.jsp的资源。
所以这里是服务器会响应两次请求,应此存放在request中的属性数据会丢失。如果没有页面之间是属性值需要传递,
那么我们方可使用重定向。比如还没有注册的用户 将其重定向到注册的页面,比如注销之后,消除session中的user状
态在重定向到登录页面。 事实是上一般没有强烈要求,我们不太推荐使用重定向。用重定向实现的跳转我们都可以使用
Forward跳转来实现。
最后我把Forwar的请求和重定向的例子,简单的写了一下,放在附件中供大家,理解上面的所说的。
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 重定向和转发的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别!
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- JSP转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- 转发和重定向的区别
- (转) 转发和重定向的区别
- iphone调用Twitter相应api
- Android学习过程中问题记录
- C++ primer死循环
- encodeURI
- 孙鑫视频教程第十课——图形的绘制、颜色对话框、字体对话框、改变控件的字体及颜色、在对话框中显示位图
- 转发和重定向的区别
- 乔布斯的经营理念
- apue(2)
- Android下动态链接库.so调用的简单例子
- Tortoise SVN 客户端 基本用法
- JAVA基础------IO操作(二)
- 关于typedef的用法总结
- (转)Linux技巧:让进程在后台可靠运行的几种方法
- JS收集·