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

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

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

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

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

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

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

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

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

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

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

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

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

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

是否可转向本web应用之外的页面或网站
实际发生位置服务端客户端
用法request.getRequestDispatcher("/资源名").forward(request,response)(注意:转发时"/"代表的是本应用程序的根目录,比如"/web应用名")response.sendRedirect("/web应用/资源名") (重定向时"/"代表的是webapps目录,这个目录在tomcat那个目录下)
传送数据的类型转发的request对象可以传递各种类型的数据,包括对象重定向只能传递字符串,就是在路径后面加
跳转时间转发时:执行到跳转语句后就会立即跳转重定向:整个页面执行完成后才执行跳转,也就是说其后的代码有执行机会
在跳转前request对象setAttribute();的值是否会丢失不会
转向速度
地址栏不变
应用场景访问Servlet处理业务逻辑,然后forward到jsp显示处理结果提交表单,处理成功后redirect到另一个jsp,防止表单重复提交
05-11 22:09