`
xinklabi
  • 浏览: 1591787 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

请求转发与UML重定向的区别

    博客分类:
  • Java
阅读更多


我们知道,在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笔试题1

    请求转发是将请求从一个Servlet转发到另一个Servlet,而重定向是将请求从一个Servlet重定向到另一个资源。 Overload和Override Overload是方法的重载,指的是在同一个类中定义多个同名的方法,但这些方法的参数...

    软通动力Java笔试题2011,大家可要把握好机会哦。

    十、Servlet 中请求的转发与重定向 Servlet 中请求的转发和重定向是两种不同的机制,转发是服务器端的跳转,重定向是客户端的跳转。 十一、Overload 与 Override Overload 是方法的重载,指的是在同一个类中具有...

    MyEclipse 6 中文教程中的项目源码

    源码可能包括HTTP请求和响应的处理、转发与重定向、JSP内置对象的使用,以及Servlet与JSP间的交互。 4. **13章JPA代码**:JPA(Java Persistence API)是Java平台的标准持久化框架,用于管理关系数据库中的数据。这...

    j2ee面试大全

    - Redirect(重定向):客户端操作,请求发生两次,第二次请求不携带第一次请求的属性。 5. **J2EE核心概念**: - **JNDI**:Java命名和目录接口,用于查找和管理分布式资源,如数据库连接池。 - **JMS**:Java...

    Java程序员面试题

    forward()方法在服务器端内部转发请求,保留原有请求对象,速度快,但用户无法看到实际跳转。redirect()方法发送一个HTTP重定向响应给浏览器,浏览器重新发起一个新的请求,原对象丢失,速度相对较慢。 9. **Java...

    J2EE 面试题综合.doc J 2EE 面试题综合.doc

    【Servlet转发与重定向】 8. Servlet中的forward()方法将请求内部传递到另一个资源,保留原有请求对象。而redirect()方法向客户端发送一个新的URL,浏览器发起新的请求。 【XML解析】 9. Java中解析XML有SAX...

    java 面试问题实用

    - **forward()**:请求转发,保留原始请求URL,客户端不知道转发过程。 - **redirect()**:重定向,客户端收到新的HTTP响应码302,并跳转到新位置。 #### 9. Java解析XML的方式 常用的解析XML的方法有: - **SAX**...

    java面试题(20211007014846).pdf

    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 类,用于封装...

    JAVA培训总结XXXX1214.docx

    学员深入理解了Servlet生命周期,包括初始化、服务、销毁三个阶段,并掌握了如何处理HTTP请求和响应,以及在Servlet中进行会话管理和转发、重定向。 四、JSP简介 JSP是用于创建动态HTML页面的Java技术。通过JSP,...

    J2EE软件工程师全部培训课程总结

    - **资源跳转方式**:学习Servlet中的资源跳转机制,如转发和重定向。 - **数据源配置**:掌握在Tomcat中配置数据源的方法,实现数据库连接池的管理。 - **状态持久化技术**:学习Cookie、Session的使用,实现用户...

    基于SIP聊天室系统

    - **代理服务器/重定向服务器**:转发SIP请求到正确的目的地。 - **对话/会话管理**:维护会话状态,处理加入、离开、邀请等操作。 4. **用例分析** - **登录**:用户通过输入用户名和密码,向SIP服务器发送注册...

    新东方在线1

    - **forward**:服务器端转发,请求在服务器内部完成,浏览器只发过一次请求,URL不会改变,适合内部页面间的跳转。 4. **UML中类之间的关系及说明** - UML类图中包括关联、聚合、组合、继承、依赖等关系,它们...

    accp6.0 S2 历届 笔试题 2011-2013

    4. **Servlet和JSP**:Java Web开发的核心技术,包括请求响应模型、会话管理、转发与重定向、EL和JSTL标签库的应用。 5. **软件工程**:需求分析、设计模式、软件测试方法、UML统一建模语言的使用以及项目管理的...

    Java 最新 面试 全集

    8. **Servlet的forward()与redirect()**:forward()在服务器端完成请求转发,保留原有请求信息;redirect()则是客户端重定向,创建新的HTTP请求。 9. **XML解析**:Java提供SAX和DOM两种解析方式,SAX基于事件驱动...

    java面试题总结

    - **forward()**:转发请求到另一个资源(Servlet/JSP),共享请求域中的数据,速度快。 - **redirect()**:重定向到另一个URL,不共享请求域中的数据,涉及客户端跳转。 #### 9. JAVA解析XML的方式 - **SAX**:...

    Java面试问题 TXT格式

    - **forward()**:将请求转发到另一个Servlet或JSP页面,浏览器地址栏中的URL不变,且只经过一次请求。 - **redirect()**:重定向到另一个URL,浏览器地址栏中的URL会发生改变,涉及两次HTTP请求。 #### 9. Java中...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    ### 转发和重定向的区别 - **转发**:服务器内部跳转,客户端不知道。 - **重定向**:客户端重新发起请求。 ### HTTP状态码/Cookie和Session区别 - **状态码**:200表示成功,404表示未找到等。 - **Cookie**:...

Global site tag (gtag.js) - Google Analytics