一个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. Redis 一个很诡异的问题(部署)

    使用Redis并用window服务的方式 运行时.突然报错  在启动进程意外中止 解决方案: 调试了很久 发现居然是在 Logfile的配置中的问题. 错误的logfile logfile " ...

  2. html manifest 离线配置

    HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. 应用程序缓存为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载 ...

  3. 检查Windows上安装的.net版本

    cmd reg query "HKLM\Software\Microsoft\NET Framework Setup\NDP" /s /v version | findstr /i ...

  4. 安卓开发时访问google方法

    启动浏览器后15秒左右,浏览器的右上角就会出现图标 启用防火墙功能(右上角墙形图标),这时候程序就会去寻找网上代理,从而达到访问GOOGLE的效果,提示如果不访问google网站,可再点击一下关闭防火 ...

  5. sysbase 笔记

    Alter 在已有数据的表中新增一个字段: ALTER table ciecdb.ciec.eci_mansmfile ADD num int default 0;

  6. Mybatis 的动态 SQL 语句

    <if>标签 我们根据实体类的不同取值,使用不同的 SQL 语句来进行查询. 比如在 id 如果不为空时可以根据 id 查询, 如果 username 不同空时还要加入用户名作为条件.这种 ...

  7. ClickOnce发布包含某文件

    第一步.在文件上右键选择“属性”,“复制到输出目录”选择“始终复制”: 第二步.“生成操作”选择“选择”: 第三步.通过 项目右键属性-发布-应用程序文件 查看想要包含的文件是否包含进来了. 注:可以 ...

  8. js面对对象的几种方式

    1.对象的字面量    var obj = {} 2.创建实例对象    var obj = new Object(); 3.构造函数模式    function fn(){}, new fn(); ...

  9. 《Andrew Ng深度学习》笔记2

    神经网络基础 1.图计算 计算时有两种方法:正向传播和反向传播.正向传播是从底层到顶层的计算过程,逐步推出所求公式.反向传播是从顶层到底层,从已知的式子求出因变量的影响关系. 在这里用到的反向传播算法 ...

  10. 分享记录一批免费VIP视频解析接口,不定时更新!

    VIP视频接口的作用相信大家都懂,那么,由于接口的维护.开发具有不稳定性,失效率很高.这里收集一些目前可用的接口,如果不能用,请反馈给我删除,感谢大家! 电影<西虹市首富>优酷链接:htt ...