Forward与Redirect
类别
|
概念
|
共享数据
|
应用
|
Redirect
|
URL重新定向:可以是任意的URL
|
不能共享request里面的数据
|
一般用于用户注销登录时返回主页面和跳转到其它的网站等等
|
Forward
|
页面的转发:只能是同一个Web应用程序的其他Web组件
|
转发页面和转发到的页面可以共性request里面的数据
|
一般用于用户登录的时候根据角色转发到相应的模块等等
|
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用
sendRedirect()方法。
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取
原文 : http://blog.sina.com.cn/s/blog_8df07b6f0100u0d1.html
http://www.jq-school.com/Show.aspx?id=270
forward 和redirect
1. forward方法使用
request.getRequestDispatcher(path).forward(request.response); 首先来看getRequestDispatcher方法,path必须是相对路径。
getRequestDispatcher
RequestDispatcher getRequestDispatcher(String path)
RequestDispatcher
object that acts as a wrapper for the resource located at the given path. A RequestDispatcher
object can be used to forward a request to the resource or to include the resource in a response. The resource can be dynamic or static.
The pathname specified may be relative, although it cannot extend outside the current servlet context. If the path begins with a "/" it is interpreted as relative to the current context root. This method returns null
if the servlet container cannot return a RequestDispatcher
.
The difference between this method and ServletContext.getRequestDispatcher(java.lang.String)
is that this method can take a relative path.
path
- a String
specifying the pathname to the resource. If it is relative, it must be relative against the current servlet.RequestDispatcher
object that acts as a wrapper for the resource at the specified path, or null
if the servlet container cannot return a RequestDispatcher
RequestDispatcher
, ServletContext.getRequestDispatcher(java.lang.String)
接着forward方法,
forward
void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException
For a RequestDispatcher
obtained via getRequestDispatcher()
, the ServletRequest
object has its path elements and parameters adjusted to match the path of the target resource.
forward
should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException
. Uncommitted output in the response buffer is automatically cleared before the forward.
The request and response parameters must be either the same objects as were passed to the calling servlet's service method or be subclasses of theServletRequestWrapper
or ServletResponseWrapper
classes that wrap them.
request
- a ServletRequest
object that represents the request the client makes of the servletresponse
- a ServletResponse
object that represents the response the servlet returns to the clientServletException
- if the target resource throws this exceptionIOException
- if the target resource throws this exceptionIllegalStateException
- if the response was already committed2.sendRedirect方法使用
HttpServletResponse中使用sendRedirect可以实现跳转,可以接受相对路径或者绝对路径。
sendRedirect
public void sendRedirect(java.lang.String location) throws java.io.IOException
If the response has already been committed, this method throws an IllegalStateException. After using this method, the response should be considered to be committed and should not be written to.
定位
- the redirect location URLjava.io.IOException
- If an input or output exception occursjava.lang.IllegalStateException
- If the response was committed or if a partial URL is given and cannot be converted into a valid URLServlet 跳转 redirect与forward跳转的区别
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)
...
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
来自:http://wenku.baidu.com/link?url=Z8dLJDFT1MX6-yDqajj71B3rc32Zx79iybgSkMoqg922FApVCTviGuYhflaWUiaMYhcAc-It1pKKq2Y127JCYp41U_y4sNsVpQ8AJ_vaEvS
相关推荐
在开发Web应用时,我们经常会遇到“forward”和“redirect”的概念,它们是两种不同的页面跳转方式。理解和掌握它们的区别对于优化用户交互和处理请求流至关重要。 **forward(转发)**: - 转发是由服务器端完成的...
在Web开发中,Forward(转发)与Redirect(重定向)是两种常见的页面跳转方式。它们虽然都可以实现从一个页面跳转到另一个页面的功能,但在实现机制、应用场景以及对用户浏览器地址栏的影响等方面存在显著差异。 ##...
它们的主要区别在于请求处理流程、URL改变以及数据共享方式。 1. 转发(Forward): - 使用`RequestDispatcher.forward()`方法实现。 - 请求转发是在服务器内部完成的,客户端浏览器并不知情。这意味着,浏览器的...
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response); } ``` 现在,当用户访问`/success`时,服务器会内部转发到`/WEB-INF/pages/success.jsp`,而不会暴露这个路径给用户。...
在Web开发中,"转发"(Forward)和"重定向"(Redirect)是两种常见的请求处理方式,它们在实现客户端和服务器之间的交互时起到至关重要的作用。了解它们的区别对于优化用户体验和提高应用性能至关重要。 首先,让...
在Java Web开发中,JSP(Java...总之,理解并熟练掌握`jsp forward`和`redirect`对于开发高效、安全的Java Web应用至关重要。它们是构建动态网站结构的重要工具,合理运用可以优化用户体验并提高应用程序的灵活性。
"JAVA面试题之Forward与Redirect的区别详解" 本文主要讲解了在JAVA面试中可能遇到的问题,即JAVA中Forward与Redirect两者之间的区别。文中详细介绍了两种请求转发方式的原理和区别,包括请求转发的含义、Forward...
3. **跳转(Redirect)与转发(Forward)**: - **Redirect**:Servlet可以通过`response.sendRedirect()`方法将客户端重定向到另一个URL。这种情况下,浏览器会发起一个新的HTTP请求,因此URL会显示在浏览器地址栏...
在Java Web开发中,转发(Forward)和重定向(Redirect)是两种常见的请求处理方式,它们在处理客户端请求和服务器响应时有着不同的机制和应用场景。 1. **转发(Forward)** - **原理**:转发是在服务器端内部...
3. 效率:`forward()`通常比`redirect()`更高效,因为它不需要浏览器再次发起请求。 4. 范围:`forward()`通常用于转发到应用程序内部的资源,而`redirect()`可以重定向到任何URL,包括外部站点。 5. 使用场景:`...
通过合理配置ActionForward,可以有效地管理应用程序的控制流和数据流,实现更加灵活和高效的Web应用开发。开发者应充分了解ActionForward的各项属性及其使用场景,以便在实际项目中发挥其最大效能。
3. 视图名以"forward:"或"redirect:"开头,分别表示内部转发和重定向。 4. 配置静态资源路径,让Spring MVC知道如何找到静态文件。 5. 如果需要自定义静态资源处理,可以实现WebMvcConfigurer接口。 理解并掌握这些...
Servlet 中 forward() 与 redirect() 的区别 Servlet 中有两种页面跳转方式:forward() 和 redirect()。 * forward():一次请求,在容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址。 * ...
主要分为直接请求转发(Forward)和间接请求转发(Redirect)。这两种转发方式在处理请求时有着显著的区别。 直接请求转发(Forward): 直接请求转发是服务器内部的资源调度,用户在浏览器中只会看到最初的请求...
Web 项目答辩中的重要知识点,涵盖了 CSS 和 DIV 开发的优势、页面间参数传递方式、hidden 表单域的作用、JSP 内置对象、Session 和 Application 对象的作用、JSP 动作、Java Servlet API 中 forward 和 redirect 的...
在Java Web开发中,"重定向"(Redirect)和"转发"(Forward)是两种常见的处理请求的方法,它们用于在服务器端控制用户浏览器的行为。理解并熟练掌握这两者对于Java初学者至关重要,因为它们在构建动态网站时起着...
在Web开发中,"forward"不同于"redirect"。重定向(Redirect)会发送一个新的HTTP响应到客户端,让浏览器加载不同的URL;而转发(Forward)则是在服务器端内部完成的,用户浏览器看到的仍然是原始请求的URL,但实际...
13. Forward和Redirect:Forward和Redirect是两种不同的请求转发机制。Forward是服务器端的请求转发,客户端的URL不变;Redirect是客户端的请求转发,客户端的URL会变换。 14. 事件:在JavaScript中,事件是指用户...