JSP的Forward及sendRedirect方法区别

问题:JSP的Forward及sendRedirect方法都实现了页面的跳转。却有以下不同之处:
 
forward跳转:<jsp:forward page="跳转页面地址" />: a.服务器端跳转,地址栏不改变;b.执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源);c.request设置的属性在跳转后的页面仍可以使用;d.使用<jsp:param name="参数名" value="参数值" />传递参数。
 
sendRedirect跳转:response.sendRedirect("跳转页面地址"): a.客户端跳转,地址栏改变;b.所有代码执行完毕后跳转;c.跳转后的页面不能使用上一个页面的request属性;d.使用地址重写传递参数(response.sendRedirect("URL?参数名=参数值"))。

Response.sendRedirect是两个不同的request,是在客户端跳转,浏览器显示的是跳转后的页面的名字。因为它是从客户端跳转到第二个页面的。
 
JSP的Forward及sendRedirect方法原理 - 无殇 - 禅茶一味
 
JSP的Forward及sendRedirect方法原理 - 无殇 - 禅茶一味
 
 
使用forward时,由于只是发送一次request请求,request设置的属性(setAttribute)依然能保留在下一个页面。
使用sendRedirect时,由于发送两次request请求,所以在下一个不能获取request属性。但可以通过重写URL的方式
内容传递过去。
下面举例说明:
tian.jsp   
<%request.setAttribute("river","redwater");
    request.setAttribute("country","daguaiwan");
%>
<jsp:forward page="fengshan.jsp" />
 
donglan.jsp   
<%request.setAttribute("river","redwater");
    request.setAttribute("country","daguaiwan");
%>
<a href="fengshan.jsp">fengshan</a>
 
bama.jsp   
<%request.setAttribute("river","redwater");
    request.setAttribute("country","daguaiwan");
    response.sendRedirect("fengshan.jsp");
%>
 
fengshan.jsp
<%=request.getAttribute("river")%><br/>
<%=request.getAttribute("country")%>
 
http://localhost:8080/ForwardRedirect/tiane.jsp 跳转后结果为: 
redwater 
daguaiwan 
  
http://localhost:8080/ForwardRedirect/donglan.jsp 跳转后结果为: 
null 
null 
  
http://localhost:8080/ForwardRedirect/bama.jsp 跳转后结果为: 
null 
null
 
结果分析: tiane.jsp是通过forward跳转到fengshan.jsp的,这两个页面享用的是同一个request,故fengshan.jsp可以接收到tiane.jsp通过 request设置的属性。而donglan.jsp是通过href发送了另外的request请求,bama.jsp是通过sendRedirect跳转,用的也是另外的request请求,故fengshan.jsp不可以接收到这两个页面通过 request设置的属性。 Jsp和Servlet之间的跳转:从Jsp跳转Servlet可以使用或者response.sendRedirect(URL)都可以,它们之间的区别上面已经说明了。 从Servlet跳转Jsp: getRequestDispatcher的forward(request, response)方法,这里也只是发送了一次请求,可以在下一个页面接受request设置的属性。 ? response.sendRedirect(URL),这里发送了两次请求,不可以在下一个页面接受request设置的属性。
例子如下:
servlettiane.jsp 
<%request.setAttribute("river","redwater");  
    request.setAttribute("country","daguaiwan");  
%>  
<jsp:forward page="/tiane" />  
 
servletbama.jsp     
<%request.setAttribute("river","redwater");  
    request.setAttribute("country","daguaiwan");  
    response.sendRedirect("/ForwardRedirect/tiane");  
%> 
 
Tiane.java
public class Tiane extends HttpServlet {  
 
  public void doGet(HttpServletRequest request, HttpServletResponse response)  
      throws ServletException, IOException {  
//    response.sendRedirect("/ForwardRedirect/fengshan.jsp");  
    this.getServletConfig().getServletContext()  
            .getRequestDispatcher("/fengshan.jsp").forward(request, response);  
  }  
 
  public void doPost(HttpServletRequest request, HttpServletResponse response)  
      throws ServletException, IOException {  
    doGet(request, response);  
  }     
再在web.xml中配置servlet:  
<servlet>  
  <servlet-name>tiane</servlet-name>  
  <servlet-class>com.dvnchina.test.Tiane</servlet-class>  
  </servlet>  
  <servlet-mapping>  
  <servlet-name>tiane</servlet-name>  
  <url-pattern>/tiane</url-pattern>  
</servlet-mapping> 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值