重定向和转发的区别

 

/*
*作者:呆萌老师
*☑csdn认证讲师
*☑51cto高级讲师
*☑腾讯课堂认证讲师
*☑网易云课堂认证讲师
*☑华为开发者学堂认证讲师
*☑爱奇艺千人名师计划成员
*在这里给大家分享技术、知识和生活
*各种干货,记得关注哦!
*vx:it_daimeng
*/

  

重定向

 A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己无法完成,就立即告诉A情况,并向A推荐C可以完成这项任务,于是A就找C帮忙,C最终完成这项工作,返回结果给A.

方式1:

String path= request.getContextPath();

response.setStatus(302); //重定向

response.setHeader("location", path+"/servlet/TestServlet");

方式2:          

response.sendRedirect(path+"/servlet/TestServlet");

           

        

转发

      A向B发送请求,想让B帮忙完成一项工作,当B接收到请求后发现自己完成不了,于是B请C帮忙,C接收到B的请求后最终完成了该项工作,并把最后的结果返回给A.此过程中A只发送了一次请求给B,至于 B是怎么完成的A并不关心,他只等待最终的结果.

 

方法:

request.getRequestDispatcher("/index.jsp?aa=2").forward(request, response)

request.getRequestDispatcher("/servlet/TestServlet").forward(request, response);

 

RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源调用的资源(例如,Servlet、HTML文件、JSP文件等),并可以通过其中的方法将客户端的请求转发给所包装的资源。

RequestDispatcher接口中定义了两个方法:forward方法和include方法。

forward和include方法接收的两个参数必须是传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象,或者是对它们进行了包装的ServletRequestWrapper 或ServletResponseWrapper对象。

获取RequestDispatcher对象的方法:

ServletContext.getRequestDispatcher (参数只能是以“/”开头的路径)

ServletContext.getNamedDispatcher

ServletRequest.getRequestDispatcher (参数可以是不以“/”开头的路径)

 

 

重定向和转发的区别:

RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。

 

转发可以保留请求对象,重定向则不能保留

 

如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。

 

调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。

 

HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

 

5.RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

 

怎么选择重定向还是转发:

   通常情况下,转发更快,而且能保持request内的对象。所以他是第一选择。但是由于在转发之后,浏览器中url仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果不想这样,则选择重定向。

 

posted @ 2022-08-19 21:06  呆萌老师  阅读(43)  评论(0编辑  收藏  举报