当前位置:   article > 正文

Servlet中请求转发时forward()和include()的区别_forword和include

forword和include

1 定义

  • forward()和include()都是RequestDispatcher类中的方法。一般通过ServletRequest的getRequestDispatcher(String var1)获取RequestDispatcher。
  • forward():表示在服务器端从一个Servlet中将请求转发到另一个资源(Servlet、Jsp或Html等),本意是让第一个组件对请求做些预处理(或者什么都不做),而让另一组件处理并返回响应。
  • include():表示在响应中包含另一个资源(Servlet、Jsp或Html等)的响应内容,最终被包含的页面产生的任何响应都将并入原来的response对象,然后一起输出到客户端。

2 关于状态码和响应头

  • forward():调用者和被调用者设置的状态码和响应头都不会被忽略。
  • include():被调用者(如被包含的Servlet)不能改变响应消息的状态码和响应头,即会忽略被调用者设置的状态码和响应头。

3 谁负责发回响应

  • forward():表示转发,则控制权也同时交给了另一个组件,所以最终由另一组件返回响应。
  • include():表示包含,则控制权还在自己身上,所以最终还是由自己返回响应。

4 请求转发后的代码是否执行?

  • forward():转发后还会返回主页面继续执行,但不可以继续输出响应信息。
  • include():转发后还会返回主页面继续执行,仍然可以继续输出响应信息。

5 关于forward(),引用JavaEE文档中的说明:

  • 必须在响应被提交到客户端(刷新响应正文输出到流中)前调用forward(即在调用forward之前必须清空响应缓冲区),否则会抛出IllegalStateException异常。
  • 在forward之前,响应缓冲区中未提交的数据会被自动清除。所以容器将忽略原Servlet所有其他输出。

6 补充说明:关于Servlet中的输出缓冲区

  • 在Servlet中使用ServletOutputStream和PrintWriter输出响应正文时,数据首先被写入到Servlet引擎提供的一个输出缓冲区中。直到满足以下条件之一时,Servlet引擎才会吧缓冲区中的内容真正发送到客户端。
    • 输出缓冲区被填满。
    • Servlet已经写入了所有的响应内容。
    • Servlet调用响应对象的flushBuffer()方法,强制地将缓冲区内的响应正文数据发送到客户端。
    • Servlet调用ServletOutputStream或PrintWriter对象的flush()方法或close()方法。
  • 为了确保ServletOutputStream或PrintWriter输出的所有数据都能被提交给客户端,建议在所有数据都输出完毕后,调用ServletOutputStream或PrintWriter的close()方法。
  • 使用输出缓冲区后,Servlet引擎就可以将响应状态行、各响应头和响应正文严格按照HTTP消息的位置顺序进行调整后再输出到客户端。
  • 如果在提交响应到客户端时,输出缓冲区中已经装入了所有的响应内容,Servlet引擎将计算响应正文部分的大小并自动设置Content-Length头字段。
  • 缓冲区自动刷新(清出)功能。(注意是刷新(flush),而不是清除(flushBuffer))
    • 如果设置为自动刷新,则在缓冲区满或者使用flush()方法显式清出时,都会向客户端输出信息。
    • 如果设置为不自动刷新,则必须明确使用flush()方法清出数据,否则如果缓冲区满了的话,将会产生IOException异常。
  • 使用缓冲区能够减少数据传输的次数,提高程序的运行效率。但也有可能产生响应延迟的问题,因为在缓冲区满或使用flush()显示清出之前,数据并不会真正发送到客户端。



作者:九尾喵的薛定谔
链接:https://www.jianshu.com/p/300e0327eac0
来源:简书

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号