转发和重定向的区别

来源:互联网 发布: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的请求和重定向的例子,简单的写了一下,放在附件中供大家,理解上面的所说的。

  • ForwardAndRedirect.rar (6.5 KB)
  • 下载次数: 3

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小班安全教案下雨打雷怎么办 幼儿园小班社会教案下雨打雷怎么办 两个月宝宝吃手怎么办 胳膊上长了个猴子怎么办 刚刚出壳的小鸡怎么办 南宁电动车牌被偷了怎么办 南宁电车车牌被偷了怎么办 电车车牌被偷了怎么办 上海电动车车牌被偷了怎么办 太子摩托车离合回的慢怎么办 指甲小月牙太少怎么办 牛仔裤用84泡了怎么办 蓝色的衣服晒红怎么办 厨房用的剪刀开合很紧怎么办 理发的剪刀钝了怎么办 小孩眼睛肿了怎么办才能消肿 柿子和螃蟹后要怎么办 柿子和螃蟹吃了怎么办 吃了没熟的虾怎么办 邻居小孩怕我家小狗怎么办 心里有一道坎过不去了怎么办 刚买的小狗怕人怎么办 一年级孩子字写不好怎么办 小狗三天没吃了怎么办 捡到一只流浪猫怎么办 仓鼠四肢红肿圈状怎么办 泰迪的鼻子干燥怎么办 小狗眼睛有白色浓稠物怎么办 流浪狗生了小狗怎么办 学生字写得很差怎么办 猫身上粘老鼠胶怎么办 抄东西抄的手疼怎么办 皮质物品被油性笔划了怎么办 在小区猫丢了怎么办 母猫把小猫丢了怎么办 小狗不吃东西没精神怎么办 小狗的鼻子烂了怎么办 狗老是在家拉尿怎么办 狗狗鼻子有点干怎么办 狗的鼻头不黑了怎么办 金毛鼻头不黑怎么办