一个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参数。

最新文章

  1. 使用git status快速commit
  2. tomcat 9.0配置管理员用户名和密码
  3. 将mac上的项目上传到oschina,进行代码托管。
  4. Visual Studio无法查找或打开 PDB 文件解决办法
  5. POJ 1989
  6. IOS crash分析
  7. GDI+
  8. 关于django Models的个人理解和related_name的使用
  9. CSS3 3D笨蛋教程
  10. Linux常用命令详解(二) -- 查找常用命令
  11. Bootstrap3 排版-地址
  12. PHP为前端CSS和JS增加时间戳版本号
  13. JDBC 连接
  14. kubernetes的安装方法
  15. Canadian-dollar_RMB
  16. html 響應式web設計
  17. PreparedStatement与Statement区别
  18. Neural Network Basics
  19. pymysql和MySQLdb
  20. router-link params传参

热门文章

  1. 国外物联网平台(6):Electric Imp
  2. Sublime Text 2插件推荐
  3. 【转】开源视频录制库LandscapeVideoCamera
  4. Mysql避免重复插入记录方法
  5. C#调用OCX控件的常用方法[转]
  6. 在一个java类里,private int a; 什么时候要使用integer
  7. IO相关2(文件输入输出)
  8. MySQL 学习笔记(三):完整性和触发器设计
  9. P3185 [HNOI2007]分裂游戏
  10. 忘记commit也会造成select查询的性能问题