`

关于Java中redirect与forward的区别

阅读更多
在Servlet中两种实现:

forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request, response);

redirect方式:response.sendRedirect(“/somePage.jsp”);

forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客 户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。

forward 会将 request state , bean 等等信息带往下一个 jsp
redirect 是送到 client 端后再一次 request , 所以资料不被保留.
使用 forward 你就可以用 getAttribute() 来取的前一个 jsp 所放入的 bean 等等资料

forward是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,他是不会改变Request的值,如果你需要在下一个页面中能从中获取新的信息的话,你可以Request.setAttribute()来放置一些标志,这样从下一个页面中获取。
redirect是完全的跳转,浏览器将会得到跳转的地址, 并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,forward更加高效,在forward可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。forward与include共亨Request范围内的对象,而redirect则不行,即:如果一个javabean被声明为request范围的话,则被forward到的资源也可以访问这个javabean,而redriect则不行。
2、forward与include基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect(“http://www.mocuai.com”);forward 是服务器内部重定向,程序收到请求后重新定向到另一个程序,而客户机并不知晓;

forward会将   request  state、bean、等信息带到下一个jsp页面;

使用getAttribute()来取得前一个jsp所放的信息

redirect  是服务器收到请求后发送一个状态头给客户,客户将再次请求,就有两次网络通行的来往。

redirect 是送到客户端后再次request,因此上一个jsp的信息不被保留forward方式:request.getRequestDispatcher(“/somePage.jsp”).forward(request, response);

redirect方式:response.sendRedirect(“/somePage.jsp”);

redirect forward的区别
1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容

再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所

以redirect等于客户端向服务器端发出两次request,同时也接受两次response。

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

假如从a页面 到 b页面 在到c页面 如果用

在a页面中:

request.setAttribute(“a”,”aa”);

<jsp:forward page=”b.jsp”></jsp:forward>

在b页面中:

<jsp:forward page=”c.jsp”></jsp:forward>

跳转 在c页面用

request.getAttribute(“a”)

就可以得到a页面的值,或者用

request.getParameter(“name”)

也可以得到。

但是要用response.sendRedirect(“b.jsp”);

跳转的话就得不到a 页面的值和内容。
redirect:不能共享数据.

redirect不仅可以重定向到当前应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,

甚至是使用绝对URL重定向到其他站点的资源.

forward,方法只能在同一个Web应用程序内的资源之间转发请求.

forward 是服务器内部的一种操作.
redirect 是服务器通知客户端,让客户端重新发起请求.

所以,你可以说 redirect 是一种间接的请求, 但是你不能说”一个请求是属于forward还是redirect ”

3.从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

4.从效率来说
forward:高.
redirect:低.

5.jsp 语法

<jsp:forward page={“relativeurl” | “<%= expression %>”} />

或者这样写:

<jsp:forward page={“relativeurl” | “<%= expression %>”} >

<jsp:param name=”parametername” value=”{parametervalue | <%= expression %>}” />+

</jsp:forward>

6.例子

<jsp:forward page=”/servlet/login” />

<jsp:forward page=”/servlet/login”>

<jsp:param name=”username” value=”jsmith” />

</jsp:forward>

描述

<jsp:forward>标签从一个jsp文件向另一个文件传递一个包含用户请求的request对象.<jsp:forward>标签以下的代码,将不能执行.

你能够向目标文件传送参数和值,在这个例子中我们传递的参数名为username,值为scott,如果你使用了<jsp:param>标签的话,目标文件必须是一个动态的文件,能够处理参数.

如果你使用了非缓冲输出的话,那么使用<jsp:forward>时就要小心。
如果在你使用<jsp:forward>之前,jsp文件已经有了数据,那么文件执行就会出错.

属性

page=”{relativeurl | <%= expression %>}”
这里是一个表达式或是一个字符串用于说明你将要定向的文件或url.这个文件可以是jsp,程序段,或者其它能够处理request对象的文件(如asp,cgi,php).

<jsp:param name=”parametername” value=”{parametervalue | <%= expression %>}” />+
向一个动态文件发送一个或多个参数,这个文件一定是动态文件.

如果你想传递多个参数,你可以在一个jsp文件中使用多个<jsp:param>。name指定参数名,value指定参数值.

<jsp:forward>例子

<%@ page contentType=”text/html;charset=gb2312″ %>

<html>

<head>

<title>test</title>

</head>

<body>

<jsp:forward page=”forwardTo.jsp”>

<jsp:param name=”userName” value=”riso”/>

</jsp:forward>

</body>

</html>

forwardTo.jsp

<%@ page contentType=”text/html;charset=gb2312″ %>

<!–forwardTo.jsp–>

<%

String useName=request.getParameter(“userName”);

String outStr= “谢谢光临!”;

outStr+=useName;

out.println(outStr);

%>

redirect的例子:

譬 如:client 通过XXX/index.jsp?name=gauss&pwd=123访问index.jsp,而index.jsp中有< jsp:forward page=”login.jsp”/>,则在login.jsp中可以通过request.getParameter()得到name和pwd, 而<%response.sendRedirect(“login.jsp”);%>得不到。

总结:

A.Redirect等于客户端向服务器发出两次request,同时也接受到两次response

Forward却只是一次request一次response

相比之下,Forward性能更高。
B.Forward能够存储request Scope的Attribute而Redirect却不行。
C.Forward的同时URL并不会变。
D.Forward需要在Servlet中需要通过一个Dispatcher来实现。
E.Redirect能够防止某些情况下客户端Refresh造成的一些未知后果(例如连续删除)
分享到:
评论

相关推荐

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

    本文主要讲解了在JAVA面试中可能遇到的问题,即JAVA中Forward与Redirect两者之间的区别。文中详细介绍了两种请求转发方式的原理和区别,包括请求转发的含义、Forward转发请求的原理、Redirect转发请求的原理等。 ...

    java中dispcter和forward的区别

    在Java的Web开发中,`Dispatcher`通常指的是`RequestDispatcher`接口,它是Servlet API的一部分,提供了请求转发和包含的功能。而`forward()`方法是`RequestDispatcher`的一个关键方法,它用于在服务器端将请求转发...

    forward与redirect区别

    在Java Servlet中,通常通过`RequestDispatcher.forward()`方法实现。 - 浏览器向服务器发送请求后,服务器接收到请求并处理,然后直接将请求转发到指定的内部资源,如一个JSP页面或Servlet。 - 转发可以在同一个Web...

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

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

    Java面试题19.forward和redirect的区别.mp4

    Java面试题19.forward和redirect的区别.mp4

    jsp forward与redirect实探

    在Java Web开发中,JSP(Java...总之,理解并熟练掌握`jsp forward`和`redirect`对于开发高效、安全的Java Web应用至关重要。它们是构建动态网站结构的重要工具,合理运用可以优化用户体验并提高应用程序的灵活性。

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

    在Java的Servlet编程中,`转发`和`重定向`是两种不同的机制,用于在服务器端将客户端的请求导向不同的资源。它们的主要区别在于请求处理流程、URL改变以及数据共享方式。 1. 转发(Forward): - 使用`...

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

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

    java面试大全视频版

    Java面试题19.Servlet中forward和redirect的区别 Java面试题20.jsp和Servlet的相同点和不同点 Java面试题21.内置对象和四大作用域和页面传值 Java面试题22.Session和Cookie的区别和使用场景 Java面试题23.mvc模式和...

    Java面试题及答案

    2. 什么是 JAVA SERVLET API 中 forward() 与 redirect() 的区别? forward()是在容器内部对请求的转发,而 redirect()使用的是 HTTP 协议在应答中将客户端重新定向至所指定的 URL。 六、Java 数据库编程 1. 什么...

    JAVA试题题库与答案

    11. Jsp:forward与sendRedirect:forward在地址栏不变化,内部跳转;redirect地址栏变化,新请求,不能使用原request对象。forward效率高,redirect低,所以D描述错误。 12. HTTP请求:get是默认请求方式,处理数据...

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

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

    Java面试经典题目

    4. **Forward与Redirect的区别** - **Forward**:这是一种服务器端的跳转方式,它将请求从一个资源转发到另一个资源,客户端只知道最初的请求URL。这种跳转方式不会改变浏览器地址栏中的URL,并且可以传递请求参数...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ Java面试题19.forward和redirect的区别.mp4 │ Java面试题20.jsp和Servlet的相同点和不同点?.mp4 │ Java面试题21.内置对象和四大作用域和页面传值.mp4 │ Java面试题22.Session和Cookie的区别.mp4 │ Java面试...

    Struts2中实现页面的跳转

    `&lt;jsp:forward/&gt;`标签在JavaServer Pages (JSP)中用于将一个请求转发到另一个资源,比如从一个JSP页面跳转到另一个JSP页面或者一个Action。在Struts2框架下使用`&lt;jsp:forward/&gt;`进行页面跳转时,可能会遇到“404 Not...

    2024java面试题.pdf

    3. **转发(forward)与重定向(redirect)的区别:** - **转发**:服务器内部行为,客户端不知道数据是从哪个资源来的。 - **重定向**:服务器向客户端发送一个状态码(如 302),告知客户端重新请求另一个 URL。...

    java面试宝典

    187、JAVA SERVLET API中forward() 与redirect()的区别? 44 189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is ...

    web的java代码

    对于页面跳转,Java Web应用中常用的技术有JSP(JavaServer Pages)和Forward/Redirect。JSP是一种动态网页技术,允许开发者在HTML中嵌入Java代码,将业务逻辑和视图展示分离。在JSP中,可以通过使用`jsp:forward`或...

    Java面试题完整版(含参考答案).doc

    以下是基于题目提供的内容,对Java抽象类与接口、EJB与JavaBean的区别以及Servlet API中forward()与redirect()方法的差异的详细解析。 1. 抽象类与接口 抽象类和接口都是Java中实现抽象化的方式,但它们有着本质的...

    Java面试50题(含答案)

    3. Java Servlet API 中的 forward() 与 redirect(): - `forward()` 方法:服务器内部重定向,请求的生命周期仍在服务器端,不会改变URL。这种方法效率高,适合处理同一个服务器内的资源跳转。 - `redirect()` ...

Global site tag (gtag.js) - Google Analytics