forward,include,redirect学习

本文详细解析了Servlet中forward、include和redirect三种不同类型的请求转发方式,包括它们的API实现、区别、优势和局限性,并讨论了在不同场景下选择使用哪种方法的最佳实践。

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

查了一下API, 
forward: 
有两个接口带有RequestDispatcher getRequestDispatcher(String path)方法 
Java代码   收藏代码
  1. javax.servlet.ServletContext.getRequestDispatcher(String path)  
  2. javax.servlet.ServletRequest.getRequestDispatcher(String path)  

javax.servlet.RequestDispatcher有两个方法: 
Java代码   收藏代码
  1. void include(ServletRequest request, ServletResponse response)   

其中这里的path必须开始为"/",即这里的path必须相对于context的root. 
Java代码   收藏代码
  1. void forward(ServletRequest request, ServletResponse response)   

这里的path可以为相对路径,如果path开始为"/",则也认为是从context的root开始的 

redirect 
Java代码   收藏代码
  1. javax.servlet.http.HttpServletResponse.sendRedirect(String location)  

Sends a temporary redirect response to the client using the specified redirect location URL. 

区别: 
1、forward与include访问获取Request范围内的对象,而sendRedirect只能获取URL后面带的参数,不能获取Request范围其它的对象(例如bean),因为forward是这样传递参数的: 
Java代码   收藏代码
  1. <jsp:useBean id="ub" class="UserBean" scope="request"/>  
  2. <jsp:setProperty name="ub"  property="UserName" value="sa"/>  
  3. <jsp:setProperty name="ub"  property="Password" value="123"/>  
  4. <jsp:forward page="index.jsp">  
  5. </jsp:forward>  

当然,如果Bean的作用域是Session的话,用sendRedirect也能取到的。 

2、forward与include只能访问应用(站点)内的资源,而sendRedirect可以访问内部和外部的资源;貌似forward与include比sendRedirect更安全一些; 
3、forward到下一个页面时,客户端不清楚,保留原来的request;而使用sendRedirect时,客户端要再发送一个request来,这样sendRedirect会导致服务器端要处理两个request,效率有点差;但如果是表单提交,完成之后使用forward,就会导致页面内容虽然变了,但浏览器上地址栏地址没有变,再一刷新的话,会有重复的数据产生; 

综上:  
1、需要使用上一个页面的request的时候,使用forward比较好;而一个业务处理完成,那么使用sendRedirect比较好; 
2、当两个页面之间没什么关系,或者需要降低耦合的时候,建议使用sendRedirect,还有就是sendRedirect能够防止刷新和方便用户将页面加入收藏夹,这也是为什么sendRedirect比较流行使用的原因 
3、每个方法都有其适用的范围和环境,需求不同时应该使用不同的方法。

转载于:https://www.cnblogs.com/bestdqf/archive/2012/08/30/2664068.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值