转发和重定向的本质区别 简洁明了

本质区别:    
       一句话概括:重定向是客户端行为,转发是服务器行为.
     1.请求次数:
          重定向:重定向行为是做了两次请求,及产生了两个request对象,重定向会导致request对象信息丢失。
           请求转发:转发做了一次请求, 浏览器的地址栏一直是第一次请求的地址。转发是服务器内部request/response控制权的移交。
       2.请求资源地址:
          重定向:web组件可以将请求重定向到任意一个url,而不仅仅是同一个应用。
                         重定向的源组件与目标组件不共用同一个HttpServletRequest对象,因此不能在request范围内共享数据。
          请求转发:转发的源组件与目标组件必须在同一个应用中,两者可以在request范围内共享数据。
工作流程:
     1.重定向
          浏览器发出http请求   >> 服务器接受请求并发送302状态码和新的对应的url到浏览器   >>
          浏览器接收响应并自动请求新的url   >> 服务器接收请求并寻找客户所需的资源响应到浏览器

     
     2.转发
          浏览器发出http求其   >> 服务器接收请求   >> 服务器调用内部的一个方法在容器内完成请求处理和转发动作   >>
          将客户所需资源发送到浏览器
    
调用方式:
     1.重定向:
          1).response.sendRedict(url);
          2).response.setState(302);
               response.setHeader("location",url);
     2.转发:
          1).request.getRequestDispatcher(url).forward(request,response);
          2).request.getRequestDispatcher(url).include(request,response);
          3).<jsp:forward page=url />

以上来自:http://my.oschina.net/mlongbo/blog/76135

package  com .  control ;
import  java .  io .  IOException ;
import  java  . io  . InputStream  ;
import  java  . io  . PrintWriter  ;
import  javax .  servlet .  ServletException ;
import  javax  . servlet  . ServletInputStream  ;
import  javax .  servlet .  http .  HttpServlet ;
import  javax .  servlet .  http .  HttpServletRequest ;
import  javax .  servlet .  http .  HttpServletResponse ;
public   class  UserLoginServlet   extends   HttpServlet
{
       public   void   doGet  ( HttpServletRequest  request  ,   HttpServletResponse   response  )   throws   ServletException ,  IOException {
             this .  doPost  ( request  ,   response )  ;
       }
       public   void   doPost  ( HttpServletRequest  request  ,   HttpServletResponse   response  )   throws   ServletException ,  IOException {
             //http://localhost:8080/USerLogin
                  String   password  =  request .  getParameter  ( "password"  ) ;
                  String   username       =  request .  getParameter  ( "username"  ) ;
                  //1,转发、重定向之后的代码还会执行,不要对request、response进行操作以免影响结果,
//                   合理的做法应该什么都不要操作,因为请求已经移交到下一步了。(别管转发是服务器自己移交下一步,还是重定向告诉浏览器请求另一个资源)
//              request.getRequestDispatcher("MyHtml.html").forward(request, response);
//              response.sendRedirect("MyHtml.html");
//              System.out.println("111111");
                  if   ( username  .  equals (  password )){
                       //2,转发与重定向都可以使用 url?key=value的方式传值
//                   response.sendRedirect("loginOk2. jsp?name="+username +"2");
                       request .  getRequestDispatcher  ( "loginOk.jsp?name="  + username  + "2"  ) .  forward (  request ,  response  ) ;
                       //3,如果转发或者重定向到同一个地址,如果没有错误的情况下回进入死循环。
//                   转发:重复调用本 servlet,ruquest 可以传值,
//                   重定向:浏览器重复请求本 servlet(下图会有浏览器请求地址截图),但是由于request已经是另一个所以取不到值,上面的 username是null,所以if会报空指针
//                   response.sendRedirect("UserLoginServlet");
//                   request.getRequestDispatcher("UserLoginServlet").forward(request, response);
//                   4,其他1:另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交
//                     其他2:转发更加高效,在转发 可以满足需要时,尽量使用RequestDispatcher.forward()方法.
//                   其他3: 注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法
                  }   else  {
                       response .  sendRedirect  ( "loginFall.jsp?name="  + username  + "2"  ) ;
//                   
                  }
       }
}



实例代码:http://download.csdn.net/detail/zhanghongzheng3213/9557678

servlet 表单提交示意图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值