forward和redirect的区别

Servlet中forward和redirect的区别 (2010-10-17 08:44:55)转载
标签: servlet it 分类: J2SE
forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response);
redirect方式:response.sendRedirect("/somePage.jsp");
forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的来往。当然forward也有缺点,就是forward的页面的路径如果是相对路径就会有些问题了。 forward 会将 request state , bean 等等信息带往下一个 jsp
redirect 是送到 client 端后再一次 request , 所以资料不被保留.
使用 forward 你就可以用 getAttribute() 来取的前一个 jsp 所放入的 bean 等等资料

在网上看到一些帖子,总结了一些区别,可以从以下几个方面来看:

1.从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次response。

2.从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.
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" />

<jsp:forward page="/servlet/login.jsp">

<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");%>得不到。

--------------------------------------------------------------------------------------------------

在Java Web开发中,经常会用到跳转页面的方法,一般有下面两种方法。
Java代码
HttpServletResponse response = new HttpServletResponse();
response.sendRedirect(location);
RequestDispatcher rd = new RequestDispatcher();
rd.forward(request, response);
跳转方式
http://localhost:8080/Test应用
运用forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以让你重定向到任何URL。
表单form的action= “/uu “;sendRedirect( “/uu “);表示相对于服务器根路径。如http://localhost:8080/Test应用(则提交至http://localhost:8080/uu);
Forward代码中的 “/uu “则代表相对与WEB应用的路径。如http://localhost:8080/Test应用(则提交至http://localhost:8080/Test/uu);
(运用RequestDispatcher接口的Forward)方法
forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,
同时forward()无法在后面带参数传递,比如servlet?name=frank,这样不行,可以程序内通过response.setAttribute( “name “,name)来传至下一个页面.
重定向后浏览器地址栏URL不变.
只有在客户端没有输出时才可以调用forward方法。如果当前页面的缓冲区(buffer)不是空的,那么你在调用forward方法前必须先清空缓冲区。
“/ “代表相对与web应用路径
RequestDispatcher rd = request.getRequestDispatcher( “/ooo “);
rd.forward(request, response);提交至http://localhost:8080/Test/ooo
RequestDispatcher rd = getServletContext().getRequestDispatcher( “/ooo “);
rd.forward(request, response);提交至http://localhost:8080/Test/ooo
RequestDispatcher rd =getServletContext().getNamedDispatcher( “TestServlet “);(TestServlet为一个 <servlet-name> )
rd.forward(request, response);提交至名为TestServlet的servlet
如果在 <jsp:forward> 之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。
另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交
从http://localhost:8080/Test/gw/page.jsp中转发
<jsp:forward page= “OtherPage.jsp “/> 在JSP页面被解析后转换成pageContext.forward( “OtherPage.jsp [...]

--------------------------------------------------------------------------------------------------
清空当前缓存:
在之前撰写JSP的例子中,实用了out这个对象,这个对象您不用事先宣告,就可以在JSP网页中使用,这是JSP所提供的隐含对象
(Implicit Object),在转译为Servlet之后,out会转换为对应于javax.servlet.jsp.JspWriter型态的对象。
JspWriter直接继承自java.io.Writer,您可以使用println()、print()方法将指定的数据以字符的方式传送至客户端,println()会
在送出数据之后进行换行,而print()则否,注意换行指的是在HTML原始码中设定换行字符,而不是输出<br>标签使得在网页中可以
换行。
out(JspWriter)具有缓冲区功能,HTTP的特性是为了要取得一份资源,就进行一份协议沟通,如果资源数目很多(例如一份HTML文件
还包括了许多的小图片),而每份资源的容量实际上很小,那么为了要取得完整的资源,将会花费很多通讯在协议往来上,假设如果
out(JspWriter)不具有缓冲功能,则每一次out.println(),就会直接将数据送出至客户端,那么单要完成一个完整网页的传送,就
会花费不少的网络资源,每一个JSP网页预设上都会具有缓冲,您可以使用page指令元素的autoFlush属性来设定是否使用缓冲区功能
。
在Tomcat5上,预设为每一个JSP网页备有8192字节的缓冲区(您可以使用page指令元素的buffer属性来自缓冲区的大小),在缓冲区还
没有满之前,数据不会真正被送出至客户端,在这之前,您还有机会重设送出的数据,如果缓冲区满了,数据将会被清出并送至客户
端,可以使用下面这个程序来示范:
buffer.jsp
<%@page contentType="text/html;charset=Big5"%>
<%
out.println("预设缓冲区大小:" + out.getBufferSize() + "<br>");
out.flush();
//下面的文字不会出现在客户端
out.println("您看的到这段文字吗?");
out.clearBuffer();
out.println("这段您可以看到!");
%>
您可以使用flush()直接清出缓冲区的内容,而clearBuffer()会将缓冲区的内容清除,所以第二段文字不会出现在客户端的网页上,
而最后一段会整个JSP网页执行完整后自动送出至客户端,执行结果如下:
预设缓冲区大小:8192
这段您可以看到!
您可以使用page指令元素的autoFlush来设定JSP页面是否使用缓冲区自动清出功能,out(JspWriter)以一种方式与
HttpServletResponse的PrintWriter建立关系,两者之间的行为关系取决于是否使用缓冲区自动清出,如果使用缓冲区自动清出,则
在缓冲区满之前,或是使用flush()之前不会建立PrintWriter对象来对客户端进行输出,如果不使用缓冲区自动清出,则写入out
(JspWriter)对象的数据会直接写入PrintWriter对象,然后在指定flush()之后输出至客户端。
如果您将autoFlush设定为false,则您必须明确的使用flush()来输出数据,否则缓冲区满了的话,就会发生IOException例外,使用
缓冲区有其好处,但由于缓冲区在满之前,数据并不会真正送出客户端,所以会有响应延迟的问题,如果您要实时性将结果响应至客
户端,则可以关闭缓冲区。
下面这个程序测试缓冲区关闭之后,如果缓冲区满了,会有什么结果:
buffer.jsp
<%@page contentType="text/html;charset=Big5" %>
<%
for(int i=0; i<2000; i++){
out.println("test");
//out.flush();
}
%>
如果没有移开out.flush()的批注符号,则会响应一下的错误讯息:
HTTP Status 500 -
type Exception report
message
description The server encountered an internal error() that prevented it from fulfilling this request.
exception
java.io.IOException: Error: JSP Buffer overflow
......
3D扩散模型的构建与优化:多模态融合在三维物体生成中的作用【附核心代码实例】 随着技术的发展,基于扩散模型的3D内容生成已经成为一个激动人心的领域。通过不断优化扩散模型的结构和算法,结合多模态信息、视角控制和高效网络架构,未来的3D生成技术将不仅能够生成逼真的物体,还能满足虚拟现实、游戏设计、电影制作等行业对高质量、实时生成的需求。 阅读详情

相关推荐

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 877

页面的跳转——请求重定向和请求转发

页面请求重定向和转发

zg0601的博客 1万+

告别视频广告:OpenWrt下luci-app-adbyby plus/lite的完整配置与避坑手册

本文详细介绍了在OpenWrt路由器上配置Adbyby Plus/Lite广告屏蔽工具的完整流程与优化方案。从环境准备、规则文件手动配置到高级性能调优,帮助用户有效拦截视频前贴片广告和弹窗广告,提升家庭网络浏览体验。特别针对官方源停止维护的问题,提供了实用的规则更新解决方案。

weixin_29306011的博客 742

页面跳转和重定向

比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面,这种就是暂时性重定向。而像京东之前的网站时360buy.com(现在已经不用了),你之前访问这个网站他会给你自动跳转到现在的京东首页,这个叫永久性重定向。注意,这里name = request.args.get('name')是访问字符串的方式获得参数,前面我们讲的获取参数的方式是在url加上,其中var表示我们的参数。代码表示,如果我们获得了参数,我们就在页面上返回这个参数。参数=值,比如这里的?

qq_55621259的博客 2842

java.sql.SQLIntegrityConstraintViolationException: #23000

java.sql.SQLIntegrityConstraintViolationException: #23000**异常信息****异常原因****解决方法** 异常信息 ### Cause: java.sql.SQLIntegrityConstraintViolationException: #23000 ; #23000; nested exception is java.sql.SQLIntegrityConstraintViolationException: #23000] with root c

123 4355

【RH850/U2A】:HSM与APP通信(中断方式)

HSM与APP通信(中断方式)

1994

Forward和redirect的区别

redirect用于客户端浏览器访问不同的资源,控制权转移,性能较低。forward用于在同一个应用内跳转到其他资源,控制权不转移,性能较高。在实际应用中,可以根据具体需求选择合适的方式。如果需要客户端浏览器访问不同的资源,应使用redirect;如果需要在同一个应用内跳转到其他资源,应使用forward。

thehateyou的博客 839

YOLO11涨点优化:卷积魔改 | DCNv2升级版本,助力检测

在DCN的基础上,增加了2个创新点,分别是调制模块和使用多个调制后的DCN模块,从形成了DCN的升级版本——DCNv2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 967

页面跳转的四种方式以及forward和redirect的区别

页面跳转方式可以分为四种 — — 请求转发、重定向、表单、超链接。 目录 页面跳转的四种方式 1、表单方式 表单 相对路径: 表单 绝对路径: 2、超链接跳转方式 超链接 相对路径: 超链接 绝对路径: 3、请求转发跳转的方式 4、重定向跳转方式 forward和redirect的区别 我们先要了解一下根目录的概念: 服务器的站点根目录:以Tomcat服务器为例,Tomc...

zl_StepByStep的博客 1万+

win10锁屏或登录时会自动弹出触摸按键的问题解决办法

本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。日期:2023年5月17日作者:任聪聪。

任聪聪的博客 1万+

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

Servlet中forward和redirect的区别

个人博客:小景哥哥 Servlet有两种跳转方式,forward方式和redirect方式。 ​ forward是服务器内部的重定向,服务器直接访问目标地址的URL,把那个URL的响应内容读取出来,而客户端并不知道,因此在客户端浏览器的地址栏里不会显示跳转后的地址,还是原来的地址。由于在整个定向的过程中用的是同一个Request,因此FORWARD会将Request的信息带到被定向的JSP或Ser...

JingLisen的博客 1320

YOLOv8【第十一章:视频追踪与流处理篇·第6节】BoT-SORT 改进:结合相机运动补偿(CMC)提升追踪稳定性!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 718

Spring中redirect和forward的区别

页面转发区别: 在Servlet中两种实现: forward方式:request.getRequestDispatcher("/somePage.jsp").forward(request, response); redirect方式:response.sendRedirect("/somePage.jsp"); forward是服务器内部重定向,程序收到请求后重新定向到另一个程序,客户机并不知道;redirect则是服务器收到请求后发送一个状态头给客户,客户将再请求一次,这里多了两次网络通信的

qq_44959042的博客 3476

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

forward和redirect的区别是什么?

forward和redirect是什么?是servlet种的两种主要的跳转方式。forward又叫转发,redirect叫做重定向。两者的区别总结:1.从地址栏显示来说:1)forword是服务器内部的重定向,服务器直接访问目标地址的 url网址,把里面的东西读取出来,但是客户端并不知道,因此用forward的话,客户端浏览器的网址是不会发生变化的。2)redirect是服务器根据逻辑,发送一个...

hongjie_lin 6万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JSP中Forward和Redirect之间的区别

Forward是服务端跳转,浏览器只发起一起请求,服务端接收到浏览器请求后,进行跳转,然后将结果返回至浏览器。浏览器不知道请求在服务端进行了跳转,故浏览器地址栏的地址不变 Redirect是浏览器端跳转,浏览器总共发起2次请求,服务端接收到第一次请求后,返回302状态码,浏览器将向响应头中Location属性值中保存的地址再次发起请求。由于是2次请求,故浏览器地址栏的地址会发生变化

怀揣梦想,努力前行 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

java 中 forward 和 redirect 区别

forward 与redirect的区别    1.使用 forward 重定向后浏览器地址栏URL不变. 而redirect 的地址栏将改变为跳转后的新地址.    2.forward跳转只能是同一个Web应用程序的其他Web组件,而 redirect 可以是任意的URL.    3.当客户(浏览器)请求一个使用 forward实现跳转的jsp时,客户(浏览器)与服务器只有一次

Code_cj的专栏 6194

php–redirect和forward的区别,thinkphp forward redirect 区别

好久没有写thinkphp的东西了,因为最近不忙的时候就很懒,不懒的时候就很忙,之前看的教程也不记得多少了。忽然间感觉只看教程貌似是不能解决啥问题的,还是得就着API来看源码,否则永远都是知其然而不知其所以然。刚正在看Action.class.php,里面有两个函数都是执行跳转用的,一个是forward 一个是redirect。那么二者到底有何区别呢?看了一下API,看了一下源码又翻了一下论坛,整...

weixin_39631953的博客 388

thinkphp forward redirect 区别

呃,话说,好久没有写thinkphp的东西了,因为最近不忙的时候就很懒,不懒的时候就很忙,之前看的教程也不记得多少了。 忽然间感觉只看教程貌似是不能解决啥问题的,还是得就着API来看源码,否则永远都是知其然而不知其所以然。 刚正在看Action.class.php,里面有两个函数都是执行跳转用的,一个是forward 一个是redirect。 那么二者到底有何区别呢?看了一下API,看了一下源码又翻了一下论坛,整理如下。 有不同意见的欢迎拍砖。 首先看代码注释,二者的描述是不相

斯人博客|PHP高级教程|C++|Javascript 5168

java中forward和redirect_forward和redirect的区别?

forward:转发;redirect:重定向。区别如下:浏览器 url 地址显示不同服务端通过 forward 返回,浏览器 url 地址不会发生变化;服务器通过 redirect 返回,浏览器会重新请求, url 地址会发生变化前后台两者页面跳转的处理方式不同forward 跳转页面,是服务端进行页面跳转加载(include)新页面,直接返回到浏览器;redirect 跳转页面,是服务端返回新...

weixin_42356811的博客 1075

redirect和forward区别

啊

奔跑8蜗牛 397
上一篇: jbpm环境搭建
下一篇: 函数和过程
xia_andy
博客等级 码龄16年 0粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值