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");即可。