再看 forward 和 redirect 的区别及过程

来源:互联网 发布:数据库系统基础高级篇 编辑:程序博客网 时间:2024/06/05 14:41

之前知道 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)

  String username = request.getParameter("username");  String password = request.getParameter("password");  request.setAttribute("user", username);  if (username.equals(password)) {    getServletContext().getRequestDispatcher("/Success").forward(      request, response);    System.out.println("-----this is forward end-----");  } else {    response.sendRedirect("False");    System.out.println("---this is rederect end---");  } 

success(servlet)

  String username = (String) request.getAttribute("user");  out.println("");  out.println("");  out.println("Welcome you " + username);  out.println("");  out.println("");  System.out.println("---- this is success servlet end ----");

 

false(servlet)

       String username = (String)request.getAttribute("user");        out.println("");       out.println("");       out.println(username + "  password ERROR!");       out.println("");       out.println("");       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。其具体原因还有待研究。

 

原创粉丝点击