Servlet中forward和redirect的区别

forward(转发)跳转,浏览器URL不会改变,可看做一次请求。redirec(重定向)t跳转,浏览器URL发生改变,可看做两次请求。

举例

   A页面跳转到B页面  

   跳转中A页面有传值行为:request.setAttribute("aaa","from JSPA");

 通过Response.forward();方法跳转到B页面,可以通过request.getAttribute("aaa")得到存aaa象。

 通过Response.redirect();方法跳转到B页面,aaa对象将会消失。

如果既想通过redirect();跳转,又想去的参数,可以通过session.setAttribute("aaa","from JSPA");设置,过多的属性存储在session中会加重session的负担。

究其原因:

  forward是服源,服器直接访问地址的URL,把那个URL的响内容来,然后把些内容再发给浏览器,浏览器根本不知道服送的内容是从哪儿来的,所以它的地址是原来的地址。
redirect
就是服端根据逻辑,送一个状态码,诉浏览器重新去求那个地址,一般来说浏览器会用求的所有参数重新求,所以session,request参数都可以取。

前者是容器中控制向,在客浏览器地址中不会示出向后的地址;后者是完全的跳浏览器将会得到跳的地址,并重新接。这样,从浏览器的地址中可以看到跳后的接地址。所以,前者更加高效,在前者可以足需要,尽量使用forward()方法,并且,这样也有助于实际接。在有些情况下,比如,需要跳到一个其它服器上的源,使用sendRedirect()方法。

两者的访问方式和路径对比

       response.sendRedirect("/a.jsp");路径为绝对路径,

sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:response.sendRedirect("http://www.baidu.com");跳转后浏览器地址栏变化。这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。

这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。


RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");

dispatcher .forward(request, response);

页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。跳转后浏览器地址栏不会变化。

使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

这种方式是在服务器端作的重定向。服务器往client发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。

这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。

总结 二者的区别

1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。

2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。

3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。

4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp。而forward不能这样处理相对路径。


以上是本人搜集学习来的对于redirect和forWard的总结,希望能帮助到大家!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值