`
scorpionqxq
  • 浏览: 50532 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

再看 forward 和 redirect 的区别及过程

阅读更多

之前知道 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。其具体原因还有待研究。

 

分享到:
评论

相关推荐

    转发和重定向的区别 forward和redirect的区别

    - 在转发过程中,请求参数和对象可以在Servlet之间共享,因为它们属于同一个请求生命周期。 - 示例代码:`request.getRequestDispatcher("/a/a.jsp").forward(request, response);` 2. 重定向(Redirect): - ...

    forward转发与redirect重定向的区别.zip

    在Web开发中,"转发"(Forward)和"重定向"(Redirect)是两种常见的请求处理方式,它们在实现客户端和服务器之间的交互时起到至关重要的作用。了解它们的区别对于优化用户体验和提高应用性能至关重要。 首先,让...

    forward与redirect!转发和重定向 解析

    ### Forward与Redirect解析 在Web开发中,Forward(转发)与Redirect(重定向)是两种常见的页面跳转方式。它们虽然都可以实现从一个页面跳转到另一个页面的功能,但在实现机制、应用场景以及对用户浏览器地址栏的...

    JAVA面试题之Forward与Redirect的区别详解

    文中详细介绍了两种请求转发方式的原理和区别,包括请求转发的含义、Forward转发请求的原理、Redirect转发请求的原理等。 请求转发的含义 在JAVA web开发中,请求转发是指服务器端将用户的请求转发给其他信息资源...

    jsp forward与redirect实探

    当我们需要在不同的页面之间导航时,`forward`和`redirect`是两种常见的处理请求转发和重定向的方法。本文将深入探讨这两种机制及其区别。 首先,`forward`是通过服务器端内部跳转实现的。它使用`RequestDispatcher...

    直接请求转发(Forward)和间接请求转发(Redirect)两种区别.docx

    主要分为直接请求转发(Forward)和间接请求转发(Redirect)。这两种转发方式在处理请求时有着显著的区别。 直接请求转发(Forward): 直接请求转发是服务器内部的资源调度,用户在浏览器中只会看到最初的请求...

    Struts2中实现页面的跳转

    通过深入理解和正确配置上述元素,你可以有效地在Struts2框架中利用`&lt;jsp:forward/&gt;`标签实现页面的跳转,避免遇到“no found”的问题。同时,也要注意,在现代Web开发中,更多地使用`&lt;s:redirect/&gt;`标签进行重定向...

    request和response实现跳转和重定向的区别

    1. 请求重定向(Redirect): 请求重定向是通过`Response`对象来实现的,服务器在收到请求后,会返回一个状态码3xx(如301永久重定向,302临时重定向),并在响应头中设置`Location`字段,指示客户端应该去新的URL...

    联合永道java面试题.pdf

    该文件主要涵盖了JavaWeb开发中的一些重要知识点,包括HTTPClient的超时设置、Servlet的生命周期、Forward和Redirect的概念、JSP和Servlet的区别、JSP的编译过程等。 1. HTTPClient超时设置 在使用HTTPClient访问...

    servlet跳转的几种情况

    Servlet 跳转可以分为两大类:Redirect 跳转和 Forward 跳转。 Redirect 跳转 Redirect 跳转是指将控制权转移到另一个资源,并将 URL 修改为新的资源的 URL。Redirect 跳转可以使用 response.sendRedirect() 方法...

    用友自动化测试面试题目大全2

    八、Web 中的 forward 和 redirect 的区别 Web 中的 forward 和 redirect 是两种不同的重定向方式。Forward 是指服务器端的重定向,Redirect 是指客户端的重定向。 九、xml 中的 DOM 和 SAX 协议的区别 xml 中的 ...

    [新版]JavaWeb口试题.doc

    【JavaWeb面试题】—— `forward` 和 `redirect` 的区别 在JavaWeb开发中,`forward` 和 `redirect` 是两种常用的请求处理方式,它们主要用于控制请求的流向。了解它们的区别对于理解Web应用程序的工作原理至关重要...

    经典面试题-答案.docx

    Forward 和 Redirect 的区别及应用场景 #### 直接转发方式(Forward) - **定义**:直接转发方式(Forward)是指在一个请求处理过程中,服务器端将当前请求转交给另一个资源进行处理的方式,整个过程中客户端只...

    亚信面试题,不错的总结,很有用处

    涵盖了 interface 和 abstract 的区别、HashMap 和 Hashtable 的区别、线程常用的方法、GC 的两种方法、Sleep() 和 wait() 的区别、Servlet 中 forward() 和 redirect() 的区别、EJB 和 JavaBean 的概念、EJB 的组成...

    Struts1的开发过程

    下面将详细讲解Struts1的开发过程。 首先,搭建Struts1的开发环境需要以下几个步骤: 1. 导入JAR包:从Struts1的发行版中找到lib目录下的所有JAR包,这些包包含了Struts框架的核心类库和其他依赖。通常包括struts....

    重定向和转发的区别

    这两种机制都是用于在Web应用程序内部或跨应用程序之间导航和控制请求流程的关键手段,但它们在实现方式、对客户端的影响以及对服务器资源的处理上存在显著区别。 #### 一、重定向(Redirect) 重定向是通过HTTP...

    简单谈谈SpringMVC转发和重定向的区别

    SpringMVC 转发和重定向的区别 SpringMVC 框架中,转发和重定向是两个常用的请求跳转方式,但它们之间有着本质的区别。本文将详细讲解 SpringMVC 中的转发和重定向的区别,并给出实践示例。 一、转发(Forward) ...

Global site tag (gtag.js) - Google Analytics