一个http请求的流转,其实主要涉及到五部分的内容,第一部分就是request所包含的参数,也就是request.getAttribute能获取的东西;第二部分是request所携带的内容实体,这部分实体是由浏览器通过post发送过来的,可以通过request.getInputStream获得输入流之后通过输入流读取;第三部分是requese和response的各种头(对应到http的请求头和响应头)以及请求类型、响应状态码等;第四部分是request的各种path(ContextPath、ServletPath等,对应到http的请求行);第五部分是response的返回实体,可以通过response.getOutpuStream和response.getWriter来获取输出流之后由输出流向浏览器发送内容。

request除了有一个getAttribute之外,还有一个getParameter,getParameter专门用于获取表单信息,而且获取的都是字符串类型。虽然他也能随着请求转发而被转发,但是一般不常用,我们还是习惯于通过setAttribute来传递信息,一方面是因为他是获取表单数据,而表单数据一般都会在第一个Servlet就被处理掉,所以表单数据不需要被传递,另一方面是因为他只能获取字符串,而我们希望传递的是各种解析后的具体类型的参数,而不是字符串。

请求转发是通过RequestDispathcer来进行的,它有两个方法,一个是forward,另一个是include。二者的区别就是对上面提到的五部分内容的转发不一样。

1、首先说说他们的共性,共性体现在request携带的资源和参数上面,二者皆可以使得两个Servlet中request的资源和参数共享,也就是说在任何一个Servlet中setAttribute的参数,在另一个Servlet中都可以通过getAttribute拿到(资源是只读的,所以不存在改变,但也是共享的),并且都可以通过getParameter获取表单参数。出了这一点之外,其他的任何内容的对待方式,forward和include都不一样。

2、forward是把post过来的信息和request的各种Attribute以及Parameter都转发到目标Servlet,并且把状态码和各种path都调整成和目标Servlet相一致。但是会把response的缓存清理,也就是说它的资源不会被转发出去。转发之后再往response里写入数据或者改变response的状态,也不会起作用了。

3、include和forward不一样,它的作用是为了获取被include目标资源的response资源内容。除此之外,response不会得到任何改变,在include目标资源对response状态的任何改变,都不会得到效果。注意,在被inlude的资源中,可以继续include其他资源,这样后续的资源也会被写入到response实体缓存中。如果在include的目标资源中forward,则之前所有的response实体资源都会被清楚,只携带request参数和request资源,流程被跳转到第三个Servlet。

总结下来就是:forward只携带request的参数和Post过来的request资源,把流程转到了目标Servlet,其他的一切都和目标Servlet一致,就好像一开始就访问的是目标Servlet一样;include是只想把目标Servlet中的response实体资源拿过来,并让目标资源设置一些request参数。

HttpServlet的请求转发理解的更多相关文章

  1. SpringMVC源码剖析(四)- DispatcherServlet请求转发的实现

    SpringMVC完成初始化流程之后,就进入Servlet标准生命周期的第二个阶段,即“service”阶段.在“service”阶段中,每一次Http请求到来,容器都会启动一个请求线程,通过serv ...

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

    深入浅出Java 重定向和请求转发的区别 <span style="font-family:FangSong_GB2312;font-size:18px;">impor ...

  3. 【Servlet】深入浅出JavaServlet重定向和请求转发

    import java.text.*; import java.util.*; import java.io.*; import javax.servlet.http.*; import javax. ...

  4. 2.SpringMVC源码分析:DispatcherServlet的初始化与请求转发

    一.DispatcherServlet的初始化 在我们第一次学Servlet编程,学java web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根 ...

  5. Java Web中请求转发和请求包含

    1.都是在一个请求中跨越多个Servlet 2.多个Servlet在一个请求中,他们共享request对象.就是在AServle中setAttribute()保存数据在BServlet中由getAtt ...

  6. servlet中请求转发(forword)与重定向(sendredirect)的区别

    摘自:http://www.cnblogs.com/CodeGuy/archive/2012/02/13/2349970.html 通俗易懂 servlet请求转发与重定向的区别: request.s ...

  7. 请求转发:MVC设计模式、细节、请求域属性的编程实例、请求重定向和请求转发的区别

      请求转发:MVC设计模式.细节.请求域属性的编程实例.请求重定向和请求转发的区别 MVC设计模式将一次请求的响应过程分成三个功能模块(一般称之为层)来协同完成,这三个模块分别是Model(模型层) ...

  8. HttpServletRequest、request常用方法、request常见应用、请求转发、RequestDispatcher

        HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. ...

  9. 7.java的请求转发和请求重定向

    1.请求重定向:是客户端的行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变,一次新的转发. 2.请求转发:是服务器的行 ...

随机推荐

  1. 今天遇到的传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确的解决方案

    传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确.参数 3 ("@UserName"): 数据类型 0xE7 的数据长度或元数据长度无效. 今天在做数据同步的时候遇 ...

  2. angular 重定向路由

    const routes: Routes = [ { path: '', redirectTo: '/home', pathMatch: 'full' }, { path: 'home', compo ...

  3. JVM锁实现探究2:synchronized深探

    本文来自网易云社区 作者:马进 这里我们来聊聊synchronized,以及wait(),notify()的实现原理. 在深入介绍synchronized原理之前,先介绍两种不同的锁实现. 一.阻塞锁 ...

  4. 原码、反码、补码及位操作符,C语言位操作

    计算机中的所有数据均是以二进制形式存储和处理的.所谓位操作就是直接把计算机中的二进制数进行操作,无须进行数据形式的转换,故处理速度较快. 1.原码.反码和补码 位(bit) 是计算机中处理数据的最小单 ...

  5. 【转】C# String 与 Char[] 数组 相互转换

    源地址:http://blog.csdn.net/razilfelix/article/details/52289663 string 转换成 Char[] string ss = "abc ...

  6. Windowns DOS For 循环实例

    update_all.bat代码示例: @echo off echo ***************************************************************** ...

  7. 浅谈 cxx rope

    一般说的浅谈是永远不会短的 然后$qwq$本宝宝并不想讲实现原理 会用就行了呗 然后方便起见,本文规定数组$a$的第$1$位为$a[0]$ 并且本文的所有$debug$为了方便看到我们$rope$长度 ...

  8. [Swift]八大排序算法(七):归并排序

    排序分为内部排序和外部排序. 内部排序:是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存 ...

  9. webstorm激活服务器地址

    2017.1.4版本可用 http://idea.imsxm.com/

  10. request对象常用方法

    String getParameter(String name)根据表单组件名称获取提交数据 Sring[] getParameterValues(String name)获取表单组件对应多个值时的请 ...