【SSH商城】Http中的转发和重定位

一、转发:一站式服务(服务端)

   Servlet中:request.getRequestDispatcher("cart.jsp").forward(request,reponse);

   Jsp:<jsp:forward page="list.jsp"/>

   当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。


  过程

  当你发送一个请求到服务器端,服务器端发现匹配的servlet,并指定它去执行,当这个servlet执行完之后,它要调用getRequestDispacther()方法,把请求转发给指定的cart.jsp,整个流程都是在服务器端完成的,而且是在同一个请求里面完成的,因此servlet和jsp共享的是同一个request,在servlet里面放的所有东西,在cart中都能取出来,因此,cart能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回给客户端。整个过程是一个请求,一个响应

  相对重定位来说,转发更快,而且能够保持request内的对象。但是由于转发浏览器URL始终指向的是开始的页面,当页面重现加载时,开始页面会重新加载。


二、重定位:(客户端)

   Servlet:response.sendRedirect("cart.jsp");

   Jsp:<%response.sendRedirect("list.jsp");%>

  重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。

 过程

  发送一个请求到服务器,服务器匹配servlet,这都和请求转发一样,servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个servlet处理完之后,看到response.senRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端你必须要再发送一个请求,去访问cart.jsp,紧接着客户端受到这个请求后,立刻发出一个新的请求,去请求cart.jsp,这里两个请求互不干扰,相互独立,在前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。


  总结:

 转发和重定位区别

  

  


 1.首先我们使用转发和重定位方法,在调用方法之前是不能有内容已经输出到客户端。若是缓存区中已存在,会被从缓冲区中清除。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,应该使HttpServletResponse.sendRedirect 方法。


 2.RequestDispatcher.forward方法只能转发给同一个web应用的组件,HttpServletResponse.sendRedirect不仅能重定位到同站点的其他应用程序资源,甚至是使用绝对URL重定到任意站点。在HttpServletRespose.sendRedirect在URL中"/",相当于整体web站点的根目录,创建RequestDispatcher相对URL中"/"相当于当前的web站点的根目录。


 3.调用HttpServletResponse.sendRedirect 方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用 RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。


 4.HttpServletResponse.sendRedirect 方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求。

  举个例子:

 重定位过程:有个姓浏叫览器的人刚入职。先去后勤找负责人赵某,回复说让人事安排,并给了人事钱某的地址联系方式,钱某了解后,安排工位给浏览器。由此可知,浏先生发出两次请求,收到了两次回复。浏先生也知道了是人事安排的座位。

 转发方法在将请求转发给人事,浏览器只知道发出了请求并得到了响应结果,并不知道在后勤和人事发生了转发行为。“浏览器”只 发出了一封信和收到了一次回复,只知道是后勤安排的,却不知是人事批准的。

 5.RequestDispatcher.forward 方法的调用者与被调用者之间共享相同的request 对象和response 对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect 方法调用者与被调用者使用各自的request 对象和response 对象,它们属于两个独立的访问请求和响应过程。

评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值