sendRedirect()和forward()方法的区别

2020-07-06 15:11:59 浏览数 (1)

之前好像曾经整理过,但忘了放在哪里了,好像压根就没整理过?,博客里也没有,故今天重新整理一下。

我们知道页面之间的跳转有两种方式:重定向与转发

跳转:顾名思义,就是页面跳转。

虽然二者都可以实现获取相应的url资源,但首先要注意的是,重定向由sendRedirect来实现,请求转发由forward来实现。

在跳转范围上forward方法只能重定向到同一个web应用程序中的一个资源,仅仅局限在同一个服务器内;而sendRedirect方法不仅可以在位于同一主机上的不同web应用程序之间进行重定向,而且可以将客户端重定向到其它服务器上的web应用程序资源。

先给出sendRedirect方法的工作原理图:

描述一下上图的过程:浏览器先向servlet1发送一次request请求,servlet1让servlet2为客户端服务,servlet1调用sendRedirect方法,将客户端的request请求重定向到servlet2(告诉浏览器servlet2的位置,让浏览器重新访问servlet2,这样就会发现地址栏会发生相应变化,这也是和forward的一个重要区别)。最后servlet2对请求做出响应。上图中产生了两次请求。

下面再给出forward方法的工作原理图:

描述一下上图的过程:浏览器先向servlet1发送请求,servlet1让servlet2为客户端服务,servlet1调用forward方法,将客户端的请求转发给servlet2处理(这里浏览器地址栏是不会变化的,因为没告诉浏览器),servlet2对请求做出响应。

对重定向和请求转发的使用分别举个实例,如下:

代码语言:javascript复制
//重定向到index.jsp页面
response.sendRedirect("/ServletStudy/index.jsp");
//如果你不想写前面的项目名,可以写成下面这样
response.sendRedirect(request.getContextPath()   "/index.jsp");
代码语言:javascript复制
//获取到requestDispatcher对象,跳转到index.jsp
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/index.jsp");
//调用requestDispatcher对象的forward实现转发,传入request和response方法
requestDispatcher.forward(request,response);

把上面这些话用一个表格表示,如下:

区别

forward

sendRedirect

是否可转向本web应用之外的页面或网站

实际发生位置

服务端

客户端

用法

request.getRequestDispatcher("/资源名").forward(request,response)(注意:转发时"/"代表的是本应用程序的根目录,比如"/web应用名")

response.sendRedirect("/web应用/资源名") (重定向时"/"代表的是webapps目录,这个目录在tomcat那个目录下)

传送数据的类型

转发的request对象可以传递各种类型的数据,包括对象

重定向只能传递字符串,就是在路径后面加

跳转时间

转发时:执行到跳转语句后就会立即跳转

重定向:整个页面执行完成后才执行跳转,也就是说其后的代码有执行机会

在跳转前request对象setAttribute();的值是否会丢失

不会

转向速度

地址栏

不变

应用场景

访问Servlet处理业务逻辑,然后forward到jsp显示处理结果

提交表单,处理成功后redirect到另一个jsp,防止表单重复提交

0 人点赞