一个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. 关于Flag 老是忘掉的东西

    OrderState enums = OrderState.CustomerCanceled | OrderState.CustomerOrdered | OrderState.CustomerQue ...

  2. small cell 在安防领域的应用探讨

    在安防领域,最核心的问题是:如何有效区分“内部人员”与“外部人员”.所谓“有效”包含两点意思,一是安全,尽可能地过滤出“外部人员”.二是效率,即尽可能无干扰地或较小干扰地使“内部人员”通过.所有的安全 ...

  3. 使用C#代码发送邮件,不完整的demo

    作为一只入行不久的小菜鸟,最近接触到利用C#代码发送邮件,做了一点小的demo练习.首先,需要配置,这边我做的是QQ邮箱的相关的练习,练习之前,首先应该解决的问题肯定是关于服务器的配置,这边偷一个懒, ...

  4. Unity本地持久化类Playerprefs使用详解

    一.PlayerPrefs是什么? PlayerPrefs是Unity3d提供了一个用于数据本地持久化保存与读取的类.工作原理十分简单,就是以key-value的形式将数据保存在本地,然后在代码中可以 ...

  5. C#三层架构搭建

    一.简介 主要分为:界面层(User Interface layer),业务逻辑层(Business Logic Layer),数据访问层(Data access layer) 1.作用 界面层(UI ...

  6. VSCode调试设置

    tasks.json { "version": "0.1.0", "isShellCommand": true, "args&qu ...

  7. ObjectARX对话框添加颜色下拉组合框

    建立Arx基本对话框,最好是基于CAcUidialog类. 首先添加combox控件更改一下属性: 先修改Owner Draw为Fixed,再更改Has Strings 为true Has Strin ...

  8. Java中的Random()函数-----转载

    Java中的Random()函数 (2013-01-24 21:01:04) 转载▼ 标签: java random 随机函数 杂谈 分类: Java 今天在做Java练习的时候注意到了Java里面的 ...

  9. Python第四次作业

    设计题1: 设计一个本月份日历,输出格式如下: 要求: 1.初始化start_day,end_day两个日期 from datetime import datetime start_day=datet ...

  10. 最小生成树问题:Kruskal算法 AND Prim算法

    Kruskal算法: void Kruskal ( ) {     MST = { } ;                           //边的集合,最初为空集     while( Edge ...