forward()和sendRedirect()执行后,后面的代码是否还继续执行?


之前知道 forward后地址栏地址不变,redirected后地址栏地址会变化,举个登陆的例子:

 

login.jsp ---> check (servlet) ---> 成功success(servlet),失败false(servlet)login.jsp

 

  <form action="CheckUser" method="post">
        username:<input type="text" name="username" /><br>
        password:<input type="password" name="password" /><br>
        <input type="submit" value="submit" />
        <input type="reset" value="reset" />
  </form>

 

check (servlet)

Java代码   收藏代码
  1.   String username = request.getParameter("username");  
  2.   String password = request.getParameter("password");  
  3.   
  4.   request.setAttribute("user", username);  
  5.   
  6.   if (username.equals(password)) {  
  7.     getServletContext().getRequestDispatcher("/Success").forward(  
  8.       request, response);  
  9.     System.out.println("-----this is forward end-----");  
  10.   } else {  
  11.     response.sendRedirect("False");  
  12.     System.out.println("---this is rederect end---");  
  13.   }   

success(servlet)

Java代码   收藏代码
  1.   String username = (String) request.getAttribute("user");  
  2.   
  3.   out.println("");  
  4.   out.println("");  
  5.   out.println("Welcome you " + username);  
  6.   out.println("");  
  7.   out.println("");  
  8.   System.out.println("---- this is success servlet end ----");  

 

false(servlet)

Java代码   收藏代码
  1. String username = (String)request.getAttribute("user");  
  2.   
  3. out.println("");  
  4. out.println("");  
  5. out.println(username + "  password ERROR!");  
  6. out.println("");  
  7. out.println("");  
  8. System.out.println("---- this is false servlet end ----");  

 

这个程序主要看 forward 或 redirect 完后,会不会继续执行 check之后的代码。

 

经测试:


    redirect后,先继续执行 check下面的 "this is rederect end",然后再执行 false(servlet)代码而 forward 后,先执行 success(servlet) 的代码,然后再执行 check下面的"this is forward end"还有就是: redirect 后,false(servlet) 取不到 user 的值,而 forward 后,success(servlet) 则可以。换句话说 forward 后,success(servlet) 的 request 与 check(servlet) 的 request 所指向的对象是一个。也就是 getServletContext().getRequestDispatcher("/Success").forward(request, response) 这句把当前的 request 和 response 的引用作为参数 forward 到 success(servlet)

 

总结:

 

    redirect 后,确认了要跳转的页面的 url,继续执行 redirect 下面的代码;执行完后,断开当前的与

用户所发出的请求连接,即断开 request 的引用指向,因此 request 里存放的 username 信息也会丢失

;然后再与用户建立新的请求连接,即创建新的 request 对象,这样 false 页面的通过

request.getAttribute("user") 就会得到一个 null 值;最终显示的是页面是 false 页面,所以地址栏

的 url 内容会发生变化。

    forward 后,确认了要跳转的页面的 url,现在停止继续执行后面的代码,而是先执行 success

(servlet) 里的代码,执行完后再回来继续执行 check 后面的代码;在这期间 check 和 success 共享

一个 request 和 response 对象,所以 success 页面通过 request.getAttribute("user") 便可以取到

值;这个过程最后执行的还是 check 页面(即使 forward 后面没有任何代码),所以地址栏的 url 内容

不会发生变化。

续:

 

有时候会出现这样的两种错误:

 

1:
    java.lang.IllegalStateException
    org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)

2:
    java.lang.IllegalStateException: Cannot forward after response has been committed

 

    通过上面介绍,不难理解其原因是:前者是 forward 后面的代码还要执行 redirect,后者是 redirect

后面还要执行 forward。其具体原因还有待研究。

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值