forward和sendRedirect重定向的区别

本文详细解释了JSP中两种重定向方式:forward和sendRedirect的原理及其区别。forward是在服务器端实现的重定向,而sendRedirect则是在客户端实现。此外,文章还介绍了这两种方式在参数传递和路径处理方面的不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSP的重定向有两种: forward和sendRedirect,它们的原理以及区别是什么呢?
它们在使用上的区别有很多,那些都是表面现象,在理解了它们各自的原理以后,使用上的区别那就能容易掌握了。

一、 原理 .
1、 Forward
这种方式是在 服务器 端作的重定向。 服务器 往 client发送数据的过程是这样的:服务器 在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或 response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用 服务器 端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在 <JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。
Java代码 复制代码
  1. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException
  2. {
  3. response.setContentType("text/html;charset=UTF-8");
  4. ServletContextsc=getServletContext();
  5. RequestDispatcherrd=null;
  6. rd=sc.getRequestDispatcher("/index.jsp");
  7. rd.forward(request,response);
  8. }
public void doPost(HttpServletRequest request,HttpServletResponse response)  throws ServletException,IOException
{
       response.setContentType("text/html; charset=UTF-8");
       ServletContext sc = getServletContext();
       RequestDispatcher rd = null;
       rd = sc.getRequestDispatcher("/index.jsp");
       rd.forward(request, response);
也可以这样写
//req.getRequestDispatcher(forwardPath).forward(req, res);
}
这种方法可以将request的值传到重定向的页面。
2、 sendRedirect这种方式是在客户端作的重定向处理。该方法通过修改 HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL 提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Webcontainer在将它发送到客户端前会把它转换成一个绝对的URL。
Java代码 复制代码
  1. publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException
  2. {
  3. response.setContentType("text/html;charset=UTF-8");
  4. response.sendRedirect("/index.jsp");
  5. }
public void doPost(HttpServletRequest request,HttpServletResponse response)   throws ServletException,IOException
{
       response.setContentType("text/html; charset=UTF-8");
       response.sendRedirect("/index.jsp");
}
二、区别 .
1、 forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源, 重定向后浏览器地址栏 URL 不变 ,而 sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制, 重定向后浏览器地址栏 URL 改变
2、 forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。 forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“ login.jsp?param1=a”)。
4、 sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Webcontainer就认为它是相对于当前的请求URI 的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL 路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp ,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp 。而forward不能这样处理相对路径。


又一篇:HTML meta content-language 定义页面语言
refresh 属性值 -- 刷新与跳转(重定向)页面
  • refresh 用于刷新与跳转(重定向)页面
  • refresh出现在http-equiv 属性中,使用content 属性表示刷新或跳转的开始时间与跳转的网址
  • 引用网址:http://www.dreamdu.com/xhtml/refresh/

refresh示例

5秒之后刷新本页面:

Html代码 复制代码
  1. <metahttp-equiv="refresh"content="5"/>
<meta http-equiv="refresh" content="5" />

5秒之后转到梦之都首页:

Html代码 复制代码
  1. <metahttp-equiv="refresh"content="5;url=http://www.dreamdu.com/"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值