`
菜菜土人
  • 浏览: 11289 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入理解Servlet转发和重定向 深入理解Servlet转发和重定向

 
阅读更多

出处:http://blog.csdn.net/kobejayandy/article/details/13762043


深入理解Servlet转发和重定向

分类:Java 精华文章942人阅读评论(0)收藏举报
一、转发

<wbr><wbr><wbr><wbr><wbr><wbr>转发的原理,可以通过下图展示:</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr>浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响应(当然,也可以继续向其他组件“传递”),这个传递的过程称之为“转发”。整个过程只涉及一次浏览器和服务器之间的“请求-响应”,转发过程中的组件共享同一个请求(request)和响应(response)对象。</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr>转发的意义在于可以实现组件的“分工”。在基于MVC,多层结构的Web应用中,经常需要多个组件协同完成一次“请求-响应”工作,例如:用户要获取“设备列表信息”,提交请求至控制器组件(Servlet),该Servlet调用适当的JavaBean获取了“设备列表”数据然后再转发至JSP组件去显示信息。</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr>RequestDispatcher对象封装了转发操作。通过request的getRequestDispatcher(String path)方法获得RequestDispatcher对象,其中String类型参数path表示要转发到的地址。调用Dispacther对象的forward(request, response)方法实现转发。关于转发的具体操作,有如下几点需要注意:</wbr></wbr></wbr></wbr><wbr><wbr></wbr></wbr>

1、转发只能在同一个应用的组件之间进行,不可以转发给其他应用的地址。<wbr><wbr></wbr></wbr>

2、转发的地址可以用“相对地址”方式,也可以用“绝对地址”方式。但需要注意的是:用绝对地址方式时,应从应用名后(Context path)开始。例如:要转发到的地址为:http://192.168.5.100/tst/jsp/somewhere.jsp<wbr><wbr>(其中tst为应用名),对应的绝对地址为:“/jsp/somewhere.jsp”。这是很好理解的,因为转发只能转到本应用内的地址,所以绝对地址是没有必要包含应用名的。</wbr></wbr><wbr><wbr></wbr></wbr>

3、组件之间通过转发来分工协作,势必涉及数据的传递,可以通过request对象传递数据。request对象的setAttribute和getAttribute分别用于以“名称-对象对”的形式存取数据。

4、在一个组件转发给另外一个组件之前,通过response输出的响应内容是没有意义的。在转发之前的通过out对象输出的内容最终不会输出到浏览器,这是由于RequestDispatcher在转发之前清空了输出缓冲区。但如果在转发之前输出的信息超出了缓冲区,或者调用了out对象的flush()方法,此响应内容已经输出到了客户端(称之为响应信息已提交),此时如果实施转发操作会抛出运行时异常:java.lang.IllegalStateException。

二、重定向

重定向的含义可以由下图说明:

<wbr><wbr><wbr><wbr><wbr><wbr>浏览器向某组件发出请求信息,组件向浏览器发回一个重定向响应信息,该响应信息不包含具体的数据内容,只是在响应头信息中包含了需要重定向到的地址信息,该地址可以是任何有效的URL。浏览器收到该重定向响应后会自动的向响应信息头中所指示的地址发出请求。整个重定向的过程涉及两次“请求-响应”。</wbr></wbr></wbr></wbr></wbr></wbr>具体的重定向响应格式如下所示:

HTTP/1.1302Moved Temporarily

Server: Apache-Coyote/1.1

Location:http://192.168.5.100:8080/tst/jsp/somewhere.jsp

Content-Length: 0

Date: Mon, 30 Jun 2008 03:52:54 GMT

<wbr><wbr></wbr></wbr>

注意:重定向响应中包含重定向地址的部分。

重定向可以通过response的sendRedirect(String url)方法来实现,注意String类型的参数url表示重定向到的地址,需要注意的是,如果表示重定向到本应用内的一个绝对地址时,要从应用名前开始,例如:tst应用中的某个组件要重定向到本应用内的/jsp/somewhere.jsp,则重定向的绝对地址应该是:“/tst/jsp/somewhere.jsp”这一点和转发中的绝对地址表示是不同的。

关于重定向的具体操作,有如下几点需要注意:
1、使用response.sendRedirect时,前面不能有HTML输出。
这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
2、.response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。

三、本质区别

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

一、转发

<wbr><wbr><wbr><wbr><wbr><wbr>转发的原理,可以通过下图展示:</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr>浏览器的请求发送给组件1,组件1经过一些处理之后,将request和response对象“传递”给组件2,由组件2继续处理,然后输出响应(当然,也可以继续向其他组件“传递”),这个传递的过程称之为“转发”。整个过程只涉及一次浏览器和服务器之间的“请求-响应”,转发过程中的组件共享同一个请求(request)和响应(response)对象。</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr>转发的意义在于可以实现组件的“分工”。在基于MVC,多层结构的Web应用中,经常需要多个组件协同完成一次“请求-响应”工作,例如:用户要获取“设备列表信息”,提交请求至控制器组件(Servlet),该Servlet调用适当的JavaBean获取了“设备列表”数据然后再转发至JSP组件去显示信息。</wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr>RequestDispatcher对象封装了转发操作。通过request的getRequestDispatcher(String path)方法获得RequestDispatcher对象,其中String类型参数path表示要转发到的地址。调用Dispacther对象的forward(request, response)方法实现转发。关于转发的具体操作,有如下几点需要注意:</wbr></wbr></wbr></wbr><wbr><wbr></wbr></wbr>

1、转发只能在同一个应用的组件之间进行,不可以转发给其他应用的地址。<wbr><wbr></wbr></wbr>

2、转发的地址可以用“相对地址”方式,也可以用“绝对地址”方式。但需要注意的是:用绝对地址方式时,应从应用名后(Context path)开始。例如:要转发到的地址为:http://192.168.5.100/tst/jsp/somewhere.jsp<wbr><wbr>(其中tst为应用名),对应的绝对地址为:“/jsp/somewhere.jsp”。这是很好理解的,因为转发只能转到本应用内的地址,所以绝对地址是没有必要包含应用名的。</wbr></wbr><wbr><wbr></wbr></wbr>

3、组件之间通过转发来分工协作,势必涉及数据的传递,可以通过request对象传递数据。request对象的setAttribute和getAttribute分别用于以“名称-对象对”的形式存取数据。

4、在一个组件转发给另外一个组件之前,通过response输出的响应内容是没有意义的。在转发之前的通过out对象输出的内容最终不会输出到浏览器,这是由于RequestDispatcher在转发之前清空了输出缓冲区。但如果在转发之前输出的信息超出了缓冲区,或者调用了out对象的flush()方法,此响应内容已经输出到了客户端(称之为响应信息已提交),此时如果实施转发操作会抛出运行时异常:java.lang.IllegalStateException。

二、重定向

重定向的含义可以由下图说明:

<wbr><wbr><wbr><wbr><wbr><wbr>浏览器向某组件发出请求信息,组件向浏览器发回一个重定向响应信息,该响应信息不包含具体的数据内容,只是在响应头信息中包含了需要重定向到的地址信息,该地址可以是任何有效的URL。浏览器收到该重定向响应后会自动的向响应信息头中所指示的地址发出请求。整个重定向的过程涉及两次“请求-响应”。</wbr></wbr></wbr></wbr></wbr></wbr>具体的重定向响应格式如下所示:

HTTP/1.1302Moved Temporarily

Server: Apache-Coyote/1.1

Location:http://192.168.5.100:8080/tst/jsp/somewhere.jsp

Content-Length: 0

Date: Mon, 30 Jun 2008 03:52:54 GMT

<wbr><wbr></wbr></wbr>

注意:重定向响应中包含重定向地址的部分。

重定向可以通过response的sendRedirect(String url)方法来实现,注意String类型的参数url表示重定向到的地址,需要注意的是,如果表示重定向到本应用内的一个绝对地址时,要从应用名前开始,例如:tst应用中的某个组件要重定向到本应用内的/jsp/somewhere.jsp,则重定向的绝对地址应该是:“/tst/jsp/somewhere.jsp”这一点和转发中的绝对地址表示是不同的。

关于重定向的具体操作,有如下几点需要注意:
1、使用response.sendRedirect时,前面不能有HTML输出。
这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
2、.response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。

三、本质区别

一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:

转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。

重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。

分享到:
评论

相关推荐

    servlet请求转发、重定向、包含

    servlet请求转发、请求重定向、请求包含 获取form数据

    Servlet转发与重定向

    通过网上总结的Servlet的转发与重定向的区别介绍。希望可以帮的上大家

    java servlet请求转发重定向

    java servlet请求转发重定向 适合于初学者更好的了解页面跳转和原理

    javaServlet请求转发和重定向.pdf

    javaServlet请求转发和重定向.pdf

    servlet使用及重定向.rar

    使用myEclipse + tomcat Servlet的简单例子,包括重定向,Session的简单使用 初学者使用......高手勿入 www.zhuyi123.cn助益信息网经常有新的信息 助益网

    USerLogin servlet 登录实例探究转发与重定向本质区别

    USerLogin servlet 登录实例探究转发与重定向本质区别

    JavaWeb中的 请求转发 和 重定向.docx

    请求转发:在最终的 servlet (TestServlet) 中,request和中转的那个servlet(ForwardServlet)中的request对象是同一个对象 重定向:在最终的 servlet (TestServlet) 中,request和中转的那个servlet(SendServlet...

    浅谈Servlet 实现网页重定向的方法

    本篇文章主要介绍了Servlet 实现重定向几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    JSPServlet的重定向技术综述

    JSPServlet的重定向技术综述 详细介绍

    JSP转发和重定向的区别分析

    1.RequestDispatcher.forward()――转发 是在服务器端起作用,当使用forward()时, Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的 form提交至a.jsp,在a.jsp用到了...

    Servlet+jsp.docx

    创建web工程还有代码是试练,请求方式+重定向+请求转发+cookie+session+jsp(四大作用域九大内置对象)

    servlet重定向详解(八)

    主要为大家详细介绍了servlet重定向的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    JSP和Servlet面试题

    7.Jsp的重定向和转发的流程有什么区别 重定向是客户端行为,转发是服务器端行为 重定向时服务器产生两次请求,转发产生一次请求,重定向时可以转发到项目以外的任何网址,转发只能在当前项目里转发 重定向会导致...

    XML Oracle Servlet 复习汇总(S2)

    7 Servlet:转发和重定向 8分 8 Servlet:连接池 5分 9 Servlet:servlet(代码题目) 6分 10 Servlet:jspuserbean 5分 11 Servlet:servlet(代码题目) 10分 12 Servlet:jstl标签(代码题目) 8分 13 Servlet:...

    servlet+jsp练手小项目

    适合初学者进行项目的练手,可以帮助我们熟悉servlet+jsp的项目流程,掌握转发,重定向,路径等问题,有助于后面框架的学习,而且项目并不复杂,主要是锻炼大家的思路,让我们可以熟悉servlet和jsp

    servlet实现简单登录验证

    servlet实现简单登录验证,最简单的实现,通过equals()方法然后重定向,主要是理解servlet的运行机制

    深入浅出Java 重定向和请求转发的区别

    &lt;span xss=removed&gt;import java.text.*; import java.util... import javax.servlet.*; import com.bjpowernode.exam.model.*; import com.bjpowernode.exam.manager.*; public class SearchS

    3.快捷的重定向方法

    所谓的重定向是将请求重新定个方向转到其他位置。例如,客户端访问AServlet,然后立刻自动访问BServlet。这个过程其实就是重定向。下面通过一张图来了解重定向,如图1-1所示:

    jsp servlet

    //转发和重定向是都是一瞬间就跳转到了要转发的页面 中间的内容基本没有时间显示 解决这个问题的方法如下: 包含转发 request.getRequestDispatcher("login.html").include(request.response); //就是将该页面所包含...

    Oracle dept表增删改查(Servlet 网页版)

    Oracle dept表增删改查(Servlet 网页版),请求转发,重定向

Global site tag (gtag.js) - Google Analytics