- 浏览: 1587111 次
- 性别:
- 来自: 吉林
文章分类
- 全部博客 (624)
- C/C++ (33)
- Java (181)
- 网络相关 (7)
- 我爱篮球 (3)
- 也爱足球 (4)
- 杂谈 (1)
- 系统架构 (3)
- Web Service (14)
- Framework (3)
- 系统命令 (8)
- 管理平台相关 (8)
- 其它 (35)
- Websphere (1)
- Struts2 (24)
- Hibernate (16)
- Spring (23)
- javascript (20)
- jquery (23)
- html/css/div (28)
- 数据库 (40)
- JavaWeb (27)
- 设计模式 (2)
- 文档编写 (3)
- SVN (5)
- Ant (1)
- Maven (13)
- 软件项目管理 (8)
- AOP (1)
- kindeditor (1)
- JSON (2)
- Servlt/JSP (4)
- WordXML (2)
- XML (12)
- 面试相关 (7)
- Tomcat (11)
- 性能与调优 (29)
- 职业发展 (2)
- 操作系统 (7)
- AJAX (2)
- DWR (1)
- Eclipse (12)
- 持续集成 (3)
- 批处理命令 (1)
- Mozilla Rhino (2)
- 新鲜技术 (18)
- Apache mina (2)
- 底层技术 (18)
- Linux (22)
- 新鲜技术,IT历史 (1)
- 敏捷开发 (1)
- 版本控制 (5)
- 较火技术 (7)
- 集群 (2)
- Web前端 (13)
- 报表工具 (3)
- 网站架构 (5)
- 大数据 (8)
- 分布式存储 (5)
- 云计算 (8)
- TCP/IP协议 (1)
- 负载均衡 (3)
- 硬件 (1)
- 表现层技术 (3)
- Velocity (3)
- jvm (6)
- 并发编程 (10)
- hadoop (8)
- 数据结构和算法 (12)
- 计算机原理 (1)
- 测试驱动开发-TDD (3)
- 开发技巧 (1)
- 分词器 (1)
- 项目构建工具 (2)
- JMX (4)
- RMI (1)
- 测试技术 (22)
- 网络完全 (1)
- Git (4)
- apache开源包 (4)
- Java常用 (1)
- mock (2)
- OSGi (2)
- MongoDB (1)
- JBPM (1)
- Storm (3)
- mysql (2)
- telnet (1)
- 正则表达式 (1)
- bootstrap (4)
- Apache ActiveMQ (1)
- redis (9)
- Nginx (2)
- rsync+inotify文件同步 (2)
- testng (1)
- 原型设计工具 (1)
- 工程能力 (1)
- 风险控制 (3)
- ibatis (1)
- 分布式 (4)
- 安全技术 (1)
- 计算机基础 (4)
- 消息中间件 (1)
- UML (2)
最新评论
-
u012236967:
java命令执行jar包(里面的main函数)的方式(包括依赖其它的jar包问题) -
世界尽头没有你:
Selenium自动化测试从入门到精通(Java版)百度网盘地 ...
自动化测试工具 Selenium WebDriver 入门教程(针对主流浏览器) -
小小西芹菜:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
dwr实现Reverse Ajax推送技术的三种方式 -
hellozhouqiao:
楼主,请教一点问题.现在我们需要在excel 的页脚里面加上图 ...
FreeMaker + xml 导出word(处理目录,图片和页眉页脚问题) -
乱在长安:
使用Timer会有各种各样的问题好嘛?!书上推荐使用Sched ...
DelayQueue (ScheduledThreadPoolExecutor调度的实现)
我们知道,在servlet中调用转发、重定向的语句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
<jsp:forward page="apage.jsp" />
当然也可以在jsp页面中实现重定向:
<%response.sendRedirect("new.jsp");//重定向到new.jsp%>
二、本质区别
解释一
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次request,
第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
例子:
请求转发是服务器内部把对一个request/response的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。
例子:
解释三
假设你去办理某个执照,
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
三、请求重定向与请求转发的比较
尽管HttpServletResponse.sendRedirect方法和RequestDispatcher.forward方法都可以让浏览器获得另外一个URL所指向的资源,但两者的内部运行机制有着很大的区别。下面是HttpServletResponse.sendRedirect方法实现的请求重定向与RequestDispatcher.forward方法实现的请求转发的总结比较:
(1)RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法不仅可以重定向到当前应用程序中的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于整个WEB站点的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
(2)调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
(3)HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的 访问请求,这个过程好比有个绰号叫“浏览器”的人写信找张三借钱,张三回信说没有钱,让“浏览器”去找李四借,并将李四现在的通信地址告诉给了“浏览器”。于是,“浏览器”又按张三提供通信地址给李四写信借钱,李四收到信后就把钱汇给了“浏览器”。可见,“浏览器”一共发出了两封信和收到了两次回复, “浏览器”也知道他借到的钱出自李四之手。RequestDispatcher.forward方 法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。这个过程好比绰号叫“浏览器”的人写信找张三借钱,张三没有钱,于是张三找李四借了一些钱,甚至还可以加上自己的一些钱,然后再将这些钱汇给了“浏览器”。可见,“浏览器”只发 出了一封信和收到了一次回复,他只知道从张三那里借到了钱,并不知道有一部分钱出自李四之手。
(4)RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。对于同一个WEB应用程序的内部资源之间的跳转,特别是跳转之前要对请求进行一些前期预处理,并要使用HttpServletRequest.setAttribute方法传递预处理结果,那就应该使用RequestDispatcher.forward方法。不同WEB应用程序之间的重定向,特别是要重定向到另外一个WEB站点上的资源的情况,都应该使用HttpServletResponse.sendRedirect方法。
(5)无论是RequestDispatcher.forward方法,还是HttpServletResponse.sendRedirect方法,在调用它们之前,都不能有内容已经被实际输出到了客户端。如果缓冲区中已经有了一些内容,这些内容将被从缓冲区中清除。
参考:孙卫琴 《精通Struts:基于MVC的Java Web设计与开发》
Web组件间存在三种关联关系:
- 请求转发
- URL重定向
- 包含
请求转发:
所谓的“请求转发”,就是转发“请求”。在HTTP Web中“请求”=“request”。所以请求转发,其实是一个request<-->response的问题。转发的范围是“同一个web应用”。简单的说就是yahoo的登陆不能“转发(登陆)”到sohu的页面。请求从源组件转发到目标组件,目标组件进行处理后在转发回给目标组件。
web client--->Servlet controller--->JSP(destination component) @
web client (view)<-----------JSP(destination component) @
转发源组件和目标组件在request范围内共享数据。
在Servlet中通过 javax.servlet.RequestDispatcher.forward( )方法来进行请求转发。
J2EE的API document是这样描述RequestDispatcher Interface的:
Defines an object that receives requests from the client and sends them to any resource (such as a servlet, HTML file, or JSP file) on the server. The servlet container creates the RequestDispatcher
object, which is used as a wrapper around a server resource located at a particular path or given by a particular name.
This interface is intended to wrap servlets, but a servlet container can create RequestDispatcher
objects to wrap any type of resource.
简单示例:
RequestDispatcher rd = request.getRequestDispatcher("destination component");
//Forward to requested URI
rd.forward(request,response);
在Jsp中通过标签<jsp:forward page="destination component">进行请求转发。
重定向:
重定向类似请求转发,但是他们之间却又有本质的区别:
- URL重定向可以定向到任何URL,不一定是“同一web应用”,比如yahoo上的链接,链接到sohu上的新闻。
- 重定向的源组件和目标组件不共享request数据,这个也是同请求转发的本质区别。
在servlet中通过sendRedirect( )方法来重定向:
request.sendRedirect( URL );
包含(略讲):
引用《精通struts...》:包含关系允许一个web组件聚集来自同一个web应用中其他web组件的输出数据,并使用被聚集的数据来创建响应结果。
如jsp标签<jsp:include page="title.jsp">
但是要注意jsp标签同include指令之间的区别
<% include file="title.jsp"%>
<jsp:include page="">可以包含动态文件,而include指令不行。
include指令include的文件已经编译就不能改变了,
但是<jsp:include>则不一样,它可以动态的向被包含的文件中传递参数:
<jsp:include page="test.jsp">
<jsp:param name="name" value="tomkoo"/>
</jsp>
发表评论
-
Java SE7新特性之二进制字面量
2016-12-14 22:53 825Java SE 7中, 整数类型(byte, shor ... -
浮点数为什么不精确?为什么银行的金额不能用浮点数计算
2016-12-14 22:52 2012浮点数为什么不精确? 其实这句话本身就不精确, 相对精确一 ... -
计算机是如何计算乘法除法的(实际上都是转换为二进制加法计算)
2016-12-14 22:46 6627http://blog.csdn.net/blues1021 ... -
什么是补码、反码、负数在计算中如何表示
2016-12-14 22:39 920负数在计算机中如何表 ... -
Math.abs()绝对值取到的数不一定是正数
2016-12-14 22:37 1261Math.abs() 注释:Note that if th ... -
用BigInteger实现大素数生成算法
2016-12-06 16:42 1863转自:http://www.cnblogs.co ... -
加密(AES)、公私钥(PKI)、摘要(DIGEST)、签名(SIGNATURE)、证书(CERT)的形象解释和组合用法
2016-09-15 18:19 94071.鲍勃有两把钥匙,一把是公钥,另一把是私钥。 ... -
RSA加密公私钥生成工具(openssl)
2016-09-15 13:00 1186https://www.openssl.org/source/ ... -
RPC原理详解
2016-06-23 20:47 577RPC 功能目标 RPC 的主要功能目标是让构建分布式计算 ... -
Java并发之CountDownLatch、CyclicBarrier和Semaphore
2016-06-23 20:36 1408这次说一下 JUC 中的同步器三个主要的成员:CountDo ... -
线程间协作的两种方式:wait、notify、notifyAll和Condition
2016-06-23 20:35 575在前面我们将了很多关于同步的问题,然而在现实中,需要线程之 ... -
The final local variable xxx cannot be assigned, since it is defined in an enclo
2016-04-24 17:42 1592本文就自己编程时候遇到的一个问题,简要描述一下,并提出解决 ... -
一个奇葩的excel中无法trim的“空格”的问题
2016-03-29 16:21 1925太奇怪了。打印出来的命名是空格,就是 trim() 不管用。 ... -
List深度复制
2016-02-17 09:34 2677昨天弄了一个类似List<Map<String, ... -
Eclipse导入 jar 源码乱码问题
2015-12-15 19:43 871http://blog.csdn.net/laiwenqian ... -
Java高并发编程的各种陷阱
2015-07-25 17:49 1000www.iteye.com/blogs/subjects/ja ... -
ASM介绍(java字节码操作利器)
2015-06-10 20:46 4358转自:http://www.ibm.com/de ... -
JDK 7 中的 Fork/Join 模式(并发处理)
2015-06-03 19:47 1001转自:http://www.ibm.com/dev ... -
Java常见内存溢出异常分析
2015-06-03 16:36 827转自:http://www.iteye.com/news/3 ... -
dom4j解析带有命名空间的xml
2015-04-09 21:23 5527Element rootEle = resultDoc.g ...
相关推荐
请求转发是将请求从一个Servlet转发到另一个Servlet,而重定向是将请求从一个Servlet重定向到另一个资源。 Overload和Override Overload是方法的重载,指的是在同一个类中定义多个同名的方法,但这些方法的参数...
十、Servlet 中请求的转发与重定向 Servlet 中请求的转发和重定向是两种不同的机制,转发是服务器端的跳转,重定向是客户端的跳转。 十一、Overload 与 Override Overload 是方法的重载,指的是在同一个类中具有...
源码可能包括HTTP请求和响应的处理、转发与重定向、JSP内置对象的使用,以及Servlet与JSP间的交互。 4. **13章JPA代码**:JPA(Java Persistence API)是Java平台的标准持久化框架,用于管理关系数据库中的数据。这...
- Redirect(重定向):客户端操作,请求发生两次,第二次请求不携带第一次请求的属性。 5. **J2EE核心概念**: - **JNDI**:Java命名和目录接口,用于查找和管理分布式资源,如数据库连接池。 - **JMS**:Java...
- **forward()**:请求转发,保留原始请求URL,客户端不知道转发过程。 - **redirect()**:重定向,客户端收到新的HTTP响应码302,并跳转到新位置。 #### 9. Java解析XML的方式 常用的解析XML的方法有: - **SAX**...
forward()方法在服务器端内部转发请求,保留原有请求对象,速度快,但用户无法看到实际跳转。redirect()方法发送一个HTTP重定向响应给浏览器,浏览器重新发起一个新的请求,原对象丢失,速度相对较慢。 9. **Java...
8. **Servlet API的forward()与redirect()**:`forward()`在服务器端内部转发请求,保持原请求对象;`redirect()`则是客户端重定向,创建新的请求。 9. **XML解析**:Java支持SAX(Simple API for XML)和DOM...
forward() 是将请求转发到另一个资源,而 redirect() 是将请求重定向到另一个资源。 7. EJB 和 JavaBean 的概念 EJB 是 Java 中的企业级 Bean,用于实现企业级应用程序,而 JavaBean 则是一个 Java 类,用于封装...
学员深入理解了Servlet生命周期,包括初始化、服务、销毁三个阶段,并掌握了如何处理HTTP请求和响应,以及在Servlet中进行会话管理和转发、重定向。 四、JSP简介 JSP是用于创建动态HTML页面的Java技术。通过JSP,...
- **资源跳转方式**:学习Servlet中的资源跳转机制,如转发和重定向。 - **数据源配置**:掌握在Tomcat中配置数据源的方法,实现数据库连接池的管理。 - **状态持久化技术**:学习Cookie、Session的使用,实现用户...
- **代理服务器/重定向服务器**:转发SIP请求到正确的目的地。 - **对话/会话管理**:维护会话状态,处理加入、离开、邀请等操作。 4. **用例分析** - **登录**:用户通过输入用户名和密码,向SIP服务器发送注册...
- **forward**:服务器端转发,请求在服务器内部完成,浏览器只发过一次请求,URL不会改变,适合内部页面间的跳转。 4. **UML中类之间的关系及说明** - UML类图中包括关联、聚合、组合、继承、依赖等关系,它们...
4. **Servlet和JSP**:Java Web开发的核心技术,包括请求响应模型、会话管理、转发与重定向、EL和JSTL标签库的应用。 5. **软件工程**:需求分析、设计模式、软件测试方法、UML统一建模语言的使用以及项目管理的...
8. **Servlet的forward()与redirect()**:forward()在服务器端完成请求转发,保留原有请求信息;redirect()则是客户端重定向,创建新的HTTP请求。 9. **XML解析**:Java提供SAX和DOM两种解析方式,SAX基于事件驱动...
- **forward()**:转发请求到另一个资源(Servlet/JSP),共享请求域中的数据,速度快。 - **redirect()**:重定向到另一个URL,不共享请求域中的数据,涉及客户端跳转。 #### 9. JAVA解析XML的方式 - **SAX**:...
- **forward()**:将请求转发到另一个Servlet或JSP页面,浏览器地址栏中的URL不变,且只经过一次请求。 - **redirect()**:重定向到另一个URL,浏览器地址栏中的URL会发生改变,涉及两次HTTP请求。 #### 9. Java中...
### 转发和重定向的区别 - **转发**:服务器内部跳转,客户端不知道。 - **重定向**:客户端重新发起请求。 ### HTTP状态码/Cookie和Session区别 - **状态码**:200表示成功,404表示未找到等。 - **Cookie**:...