forward()与sendRedirect()区别

  说明:forward()就是转发。sendRedirect就是重定向。两者最大的区别其实是,forward()传输不会改变地址,不能在传输参数,只能在代码中设置参数;而sendRedirect是跳转到指定的url地址,会改变地址栏上的信息,且可以传递参数,例如:index?name=*

  也就是说:forward()仅是服务器端转发请求,sendRedirect()则是客户端浏览器重定向。

  最直观的区别:浏览器发出请求响应后,如果浏览器地址栏的地址改变,则是间接的请求转发(即:sendRedirect方式);否则是直接转发请求。

 具体讲解:

1、forward方法的调用者与被调用者之间共享Request和Response

  原理:使用forward重定向的过程,是浏览器先向目的的Servlet发送一次Rquest请求,然后再服务器段由Servlet再将请求发生发送到目的url,再由服务端Servlet返回Reponse到浏览器。浏览器和服务端一次请求响应。

  用途:Web应用程序大多会有一个控制器。由控制器来控制请求应该转发给那个信息资源。然后由这些信息资源处理请求,处理完以后还可能转发给另外的信息资源来返回给用户,这个过程就是经典的MVC模式。

代码:

......
    //Servlet里处理get请求的方法,RequestDispatcher类的forward()方法
 public void doGet(HttpServletRequest request , HttpServletResponse response){
     //获取请求转发器对象,该转发器的指向通过getRequestDisPatcher()的参数设置
   RequestDispatcher requestDispatcher =request.getRequestDispatcher("资源的URL");
    //调用forward()方法,转发请求      
   requestDispatcher.forward(request,response);    
}
......

过程展示:

 

解释:

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用forward()方法,在服务器端将请求转发给Servlet2;
  3. 最终由Servlet2做出响应。

参数传递

  request.setAttribute(“参数名称”,参数内容);

代码解释:

  1. request.getRequestDispatcher(url).forward(request,response)

直接将请求转发到指定的URL,所以该请求能够直接获得上一个请求的数据,也就是说采用请求转发,request对象始终存在,不会重新创建。

 2、sendRedirect方法由于两次浏览器服务器请求,所以有两个Request和Response。

   原理:使用sendRedirect转发的过程,浏览器先向目的Servlet发送一次请求,Servlet看到sendRedirect将目的url返回到浏览器,浏览器再去请求目的url,目的url再返回reponse到浏览器。浏览器和服务器两次请求响应。

用途:

  一般用于避免用户的非正常访问。例如:用户在没有登录的情况下访问后台资源,Servlet可以将该HTTP请求重定向到登录页面,让用户登录以后再访问。

代码

......
//Servlet中处理get请求的方法,HttpServletRequest类的sendRedirect()方法
public void doGet(HttpServletRequest request,HttpServletResponse response){
//请求重定向到另外的资源
    response.sendRedirect("资源的URL");
}
........

过程展示:

 

解释:

  1. 浏览器向Servlet1发出访问请求;
  2. Servlet1调用sendRedirect()方法,将浏览器重定向到Servlet2;
  3. 浏览器向servlet2发出请求;
  4. 最终由Servlet2做出响应。 

代码解释:

  1.而response.sendRedirect(url) 会新建request对象,所以上一个request中的数据会丢失。

  redirect会首先发一个response给浏览器,浏览器收到这个response后再发一个request给服务器,然后服务器新的response给浏览器,这时的页面收到的request是一个新从浏览器发来的。

 参数传递

  传递参数只有在url后加参数,如url?id=1。

 参考:

https://www.cnblogs.com/selene/p/4518246.html

https://blog.csdn.net/baidu_16859039/article/details/49208011

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值