内部跳转外部跳转
总结归纳要点:
1、内部跳转的时候实际上是通过服务器端将请求转发到另外的页面或者servlet中,这个时候跳转到的目标页面或者servlet可以获取到请求对象,也可以获取到请求中的属性和参数。而外部跳转的时候实际上是第一次请求后,服务器端向客户端发送了一个指令,让客户端再次请求了一次服务器端,这个时候服务器第二次拿到的request对象已经不是第一次请求的request对象了,所以无法获取到第一次请求里的参数和属性。
2、内部跳转的url地址栏不会发生变化,外部跳转url则会发生变化。
3、内部跳转无法跳转到工程以外的jsp或者servlet,外部跳转则可以。
4、内部跳转实现的方法:
Java代码 收藏代码
request.getRequestDispatcher("XXX.jsp或者servlet").forward(request, response),
而外部跳转实现的方法:
Java代码 收藏代码
response.sendRedirect("XXX.jsp或者servlet")。
=======================
Servlet:
当然,在servlet中,一般跳转都发生在doGet, doPost等方法里面。
一、原理
1) redirect 方式
response.sendRedirect("/a.jsp");
页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于本web应用中,如:
response.sendRedirect("http://www.ycul.com");
跳转后浏览器地址栏变化。
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。
这种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html; charset=UTF-8");
response.sendRedirect("/index.jsp");
}
2) forward方式
RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher .forward(request, response);
页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。
跳转后浏览器地址栏不会变化。
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute
这种方式是在服务器端作的重定向。服务器往client发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。如果在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用,这一点应该特别注意。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType("text/html; charset=UTF-8");
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher("/index.jsp");
rd.forward(request, response);
}
二、区别.
1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
4、sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect("login.jsp"),则会从当前servlet 的URL路径下找login.jsp: http://10.1.18.8:8081/dms/servlet/Servlet 重定向的URL: http://10.1.18.8:8081/dms/servlet/login.jsp,如果为response.sendRedirect("/login.jsp")则会从当前应用径下查找url:http://10.1.18.8:8081/login.jsp。而forward不能这样处理相对路径。
java
他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
RequestDispatcher.forward则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和response信息发送到下一页面)。由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。
JSP:
1) response.sendRedirect();
和servlet的response.sendRedirect()方式一样。
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
...
跳转后浏览器地址栏变化
如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了;
如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
2) response.setHeader("Location","");
此语句前不允许有out.flush(),如果有,页面不会跳转。
跳转后浏览器地址栏变化
此语句后面的语句执行完成后才会跳转
3) <jsp:forward page="" />
此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: forward() not allowed after buffer has committed.
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:134)
at com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:101)
at com.caucho.jsp.PageContextImpl.forward(PageContextImpl.java:836)
...
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
分享到:
相关推荐
本文将详细介绍请求转发和重定向的概念、实现方式以及它们之间的区别,帮助初学者更好地理解和掌握这两项技术。 #### 二、请求转发 请求转发是一种在同一应用程序内部不同资源之间传递控制的方式。当服务器接收到...
其次,重定向可以跳转到外部网站,而转发只能在同一个应用内部进行。 在实际应用中,**转发**适合用于以下场景: 1. 保持请求状态:比如,用户登录后,需要根据其权限显示不同的页面。 2. 整合多个资源:将多个请求...
在Web应用开发中,请求转发和重定向是两种常见的页面跳转方式,它们在处理用户请求时起到关键作用,但工作原理和效果有所不同。这里我们将深入探讨这两种技术的区别。 首先,我们来理解请求转发(Request Forward)...
1. **转发(Forward)**:转发是一种服务器端的跳转方式,指的是当前请求被服务器处理后,服务器内部将请求转交给另一个资源进行处理。转发过程中客户端浏览器的地址栏不会发生变化,即URL保持不变,因此用户可能...
这两种机制都是用于在Web应用程序内部或跨应用程序之间导航和控制请求流程的关键手段,但它们在实现方式、对客户端的影响以及对服务器资源的处理上存在显著区别。 #### 一、重定向(Redirect) 重定向是通过HTTP...
三、请求转发与重定向的区别 请求转发和重定向都是实现页面跳转的机制,但是它们有着不同的实现机制和应用场景。 请求转发: * 请求地址不会发生改变 * 在同一个Controller中实现 * 使用forward关键字 重定向: ...
在Spring MVC框架中,请求转发和...总的来说,请求转发通常用于在同一应用内部进行页面间的导航,而重定向则常用于外部链接、登录重定向或防止表单重复提交等情况。在实际开发中,开发者应根据具体需求选择合适的方法。
5. **应用场景**:转发常用于内部页面间的跳转,重定向常用于外部链接、防止重复提交等。 理解这些区别有助于我们在实际开发中合理选择使用转发或重定向,以实现更高效和安全的Web应用。同时,了解这些基础知识也能...
在Java Web开发中,转发(Forward)和重定向(Redirect)是两种常见的请求处理方式,它们在处理客户端请求和服务器响应时有着不同的机制和应用场景。 1. **转发(Forward)** - **原理**:转发是在服务器端内部...
### JSP页面转向和页面转发的区别 在Java Web开发中,页面转向(重定向)与页面转发是两个非常重要的概念,它们主要用于实现不同页面之间的跳转。这两种方式虽然都能达到跳转的效果,但在实际应用中有着不同的应用...
- `forward`:服务器端重定向,它会清除当前响应的内容,然后将请求转发到另一个内部资源。如果在`forward`之前有大量输出,可能会导致缓冲区满,这时内容会被发送到客户端,`forward`将不再有效。 - `sendRedirect`...
页面跳转主要有两种方式:请求转发(Request Forwarding)和重定向(Redirecting)。 1. 请求转发(Request Forwarding): 请求转发发生在服务器端,使用`RequestDispatcher`的`forward()`方法。在这种情况下,...
在Django中,转发和重定向是两种常见的HTTP响应策略,它们在处理用户请求和页面跳转时起着关键作用。 **转发(内部重定向)**: 转发(内部重定向)在Django中通常指的是视图函数内部的请求处理流程,不改变浏览器...
当一个Web请求被提交给服务器后,服务器在处理这个请求的过程中,如果发现需要跳转到另一个资源(比如另一个页面或者servlet),服务器会直接调用内部的方法在容器内部完成请求处理和转发动作,而不会通过客户端...
易优URL链接外链跳转插件是一款专为易优CMS(EyouCMS)设计的扩展工具,旨在帮助网站管理员更好地管理和控制网站上的外部链接。通过这个插件,你可以实现对外部URL的统一管理和定向跳转,提升用户体验,同时也有助于...
标题“ip成功跳转”和描述“ip跳转”暗示了我们讨论的核心是关于网络IP地址的重定向或转换技术。IP(Internet Protocol)地址是互联网上的唯一标识符,用于定位网络上的设备。当我们谈论“ip跳转”或“ip成功跳转”...
总结,Laravel提供了多种方式来处理页面跳转,无论是简单的`a`标签点击跳转,还是通过表单或Ajax请求后的动态跳转,或者是控制器内部的逻辑跳转,都能确保用户体验的流畅性和安全性。理解和掌握这些跳转方式是开发...
它允许开发者直接在JSP页面内部实现页面的转发功能,无需编写额外的Java代码。 **代码示例**: ```jsp ``` **注意事项**: - 使用`jsp:forward`同样不能转发到其他Web应用或者外部站点。 - 由于它是基于`...
在实际使用中,"redirect"更适合用于外部资源的跳转,如跳转到第三方网站或服务器上的静态资源。而"redirectAction"则适用于内部Action间的跳转,它更灵活,可以携带Action级别的参数。 在提供的压缩包文件"ch2_...
- **重定向**适合于跨域跳转、登录验证成功后跳转到首页、页面重定向至外部网站等情况。 五、实际项目中的使用 在实际开发中,我们可能会结合Servlet来处理请求,例如在Servlet中进行业务处理后,根据情况决定是...