java中的重定向:forward/redirect

1、假如想要从一个servlet到另一个servlet,有两种方法进行重定向:

  • forward (或称dispatch) - 服务器端重定向

  • redirect - 客户端重定向


2、forward

  •     服务器端从一个servlet转向另外一个Servlet

  •     在一个servlet中可以通过setAttribute往request中传递一些值

  •     在另一个servlet中可以通过getAttribute从request中取值

  •     两个服务器中访问到的request的数据一样(同一个request)

    

       服务器端重定向就是不让客户端知道后台的重定向动作,无论服务器端forward重定向多少次,客户端都不会知道。在服务器端发送重定向的请求,只需要给服务器提供那个servlet的地址(即url-pattern)就可以了,方法是:request.getRequestDispatcher("Url-Pattern").forward(request,response);


3、redirect

  • 服务器实际上已经向客户端返回一个响应(302号响应)

  • 客户端(就是浏览器)根据HTTP HEAD中包含的redirect地址,向服务器重新发起一个请求(用GET方式)

  • 后面的请求与前一个不是同一个请求,所以在前一个调用setAttribute放进去的数据已经丢失

   

       客户端重定向,会在第一个servlet中给客户端一个response告诉他需要重定向到另一个地址,然后客户端会再根据所给的地址发出另一个请求,也就是说客户端知道重定向的事情。这时servlet程序中用redirect进行客户端重定向时,需要先获得centextPath才能进行重定向,即使用String contextPath = request.getContextPath();获得,再执行redirect.sendRedirect(contextPath + "Url-Pattern");

 

4、请求周期

     浏览器发起请求——>服务器响应请求——>浏览器解释响应,这算是一个请求周期。

  •      对于forward而言:

       浏览器请求Servlet1->Servlet1 forward到Servlet2->Servlet2 forward到Servlet3->Servlet3响应,浏览器解释响应,这是一个请求周期。在这个请求周期中,request中的数据不会丢失。

  •     对于redirect而言

    

       浏览器请求Servlet1->Servlet1 redirect 到Servlet2 (实际过程是:Servlet1向浏览器响应,  浏览器根据响应自动的再次向服务器发起请求道Servlet2->Servlet2向浏览器响应->浏览器解释响应)。所以这是两个请求周期,这意味着,在服务器端,这是两个不同的request请求,所以request中的数据就丢失了。

        要想在使用redirect进行重定向时可以传输数据,就需要这样:执行redirect.sendRedirect(contextPath + "Url-Pattern?name=xxx&passwd=xxx");    接受时参数时使用request.getParameter("name"); 和request.getParameter("passwd");即可。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值