之前知道 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。其具体原因还有待研究。
分享到:
相关推荐
- 在转发过程中,请求参数和对象可以在Servlet之间共享,因为它们属于同一个请求生命周期。 - 示例代码:`request.getRequestDispatcher("/a/a.jsp").forward(request, response);` 2. 重定向(Redirect): - ...
在Web开发中,"转发"(Forward)和"重定向"(Redirect)是两种常见的请求处理方式,它们在实现客户端和服务器之间的交互时起到至关重要的作用。了解它们的区别对于优化用户体验和提高应用性能至关重要。 首先,让...
### Forward与Redirect解析 在Web开发中,Forward(转发)与Redirect(重定向)是两种常见的页面跳转方式。它们虽然都可以实现从一个页面跳转到另一个页面的功能,但在实现机制、应用场景以及对用户浏览器地址栏的...
文中详细介绍了两种请求转发方式的原理和区别,包括请求转发的含义、Forward转发请求的原理、Redirect转发请求的原理等。 请求转发的含义 在JAVA web开发中,请求转发是指服务器端将用户的请求转发给其他信息资源...
当我们需要在不同的页面之间导航时,`forward`和`redirect`是两种常见的处理请求转发和重定向的方法。本文将深入探讨这两种机制及其区别。 首先,`forward`是通过服务器端内部跳转实现的。它使用`RequestDispatcher...
主要分为直接请求转发(Forward)和间接请求转发(Redirect)。这两种转发方式在处理请求时有着显著的区别。 直接请求转发(Forward): 直接请求转发是服务器内部的资源调度,用户在浏览器中只会看到最初的请求...
通过深入理解和正确配置上述元素,你可以有效地在Struts2框架中利用`<jsp:forward/>`标签实现页面的跳转,避免遇到“no found”的问题。同时,也要注意,在现代Web开发中,更多地使用`<s:redirect/>`标签进行重定向...
1. 请求重定向(Redirect): 请求重定向是通过`Response`对象来实现的,服务器在收到请求后,会返回一个状态码3xx(如301永久重定向,302临时重定向),并在响应头中设置`Location`字段,指示客户端应该去新的URL...
该文件主要涵盖了JavaWeb开发中的一些重要知识点,包括HTTPClient的超时设置、Servlet的生命周期、Forward和Redirect的概念、JSP和Servlet的区别、JSP的编译过程等。 1. HTTPClient超时设置 在使用HTTPClient访问...
Servlet 跳转可以分为两大类:Redirect 跳转和 Forward 跳转。 Redirect 跳转 Redirect 跳转是指将控制权转移到另一个资源,并将 URL 修改为新的资源的 URL。Redirect 跳转可以使用 response.sendRedirect() 方法...
八、Web 中的 forward 和 redirect 的区别 Web 中的 forward 和 redirect 是两种不同的重定向方式。Forward 是指服务器端的重定向,Redirect 是指客户端的重定向。 九、xml 中的 DOM 和 SAX 协议的区别 xml 中的 ...
【JavaWeb面试题】—— `forward` 和 `redirect` 的区别 在JavaWeb开发中,`forward` 和 `redirect` 是两种常用的请求处理方式,它们主要用于控制请求的流向。了解它们的区别对于理解Web应用程序的工作原理至关重要...
Forward 和 Redirect 的区别及应用场景 #### 直接转发方式(Forward) - **定义**:直接转发方式(Forward)是指在一个请求处理过程中,服务器端将当前请求转交给另一个资源进行处理的方式,整个过程中客户端只...
涵盖了 interface 和 abstract 的区别、HashMap 和 Hashtable 的区别、线程常用的方法、GC 的两种方法、Sleep() 和 wait() 的区别、Servlet 中 forward() 和 redirect() 的区别、EJB 和 JavaBean 的概念、EJB 的组成...
下面将详细讲解Struts1的开发过程。 首先,搭建Struts1的开发环境需要以下几个步骤: 1. 导入JAR包:从Struts1的发行版中找到lib目录下的所有JAR包,这些包包含了Struts框架的核心类库和其他依赖。通常包括struts....
这两种机制都是用于在Web应用程序内部或跨应用程序之间导航和控制请求流程的关键手段,但它们在实现方式、对客户端的影响以及对服务器资源的处理上存在显著区别。 #### 一、重定向(Redirect) 重定向是通过HTTP...
SpringMVC 转发和重定向的区别 SpringMVC 框架中,转发和重定向是两个常用的请求跳转方式,但它们之间有着本质的区别。本文将详细讲解 SpringMVC 中的转发和重定向的区别,并给出实践示例。 一、转发(Forward) ...