`

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

阅读更多

1、定义

 

    1)forward():表示在服务器端从一个Servlet中将请求转发到另一个资源(Servlet、Jsp或Html等),本意是让第一个组件对请求做些预处理(或者什么都不做),而让另一组件处理并返回响应。

    2)include():表示在响应中包含另一个资源(Servlet、Jsp或Html等)的响应内容,最终被包含的页面产生的任何响应都将并入原来的response对象,然后一起输出到客户端。

 

2、关于状态码和响应头

 

    1)forward():调用者和被调用者设置的状态码和响应头都不会被忽略。

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

 

3、谁负责发回响应

 

    1)forward():表示转发,则控制权也同时交给了另一个组件,所以最终由另一组件返回响应。

    2)include():表示包含,则控制权还在自己身上,所以最终还是由自己返回响应。

 

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

   

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

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

 

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

 

    1)必须在响应被提交到客户端(刷新响应正文输出到流中)前调用forward(即在调用forward之前必须清空响应缓冲区),否则会抛出IllegalStateException异常。

    2)在forward之前,响应缓冲区中未提交的数据会被自动清除。所以容器将忽略原Servlet所有其他输出。

 

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

 

    1)在Servlet中使用ServletOutputStream和PrintWriter输出响应正文时,数据首先被写入到Servlet引擎提供的一个输出缓冲区中。直到满足以下条件之一时,Servlet引擎才会吧缓冲区中的内容真正发送到客户端。

        a)输出缓冲区被填满。

        b)Servlet已经写入了所有的响应内容。

        c)Servlet调用响应对象的flushBuffer()方法,强制地将缓冲区内的响应正文数据发送到客户端。

        d)Servlet调用ServletOutputStream或PrintWriter对象的flush()方法或close()方法。

 

    2)为了确保ServletOutputStream或PrintWriter输出的所有数据都能被提交给客户端,建议在所有数据都输出完毕后,调用ServletOutputStream或PrintWriter的close()方法。

 

    3)使用输出缓冲区后,Servlet引擎就可以将响应状态行、各响应头和响应正文严格按照HTTP消息的位置顺序进行调整后再输出到客户端。

 

    4)如果在提交响应到客户端时,输出缓冲区中已经装入了所有的响应内容,Servlet引擎将计算响应正文部分的大小并自动设置Content-Length头字段。

 

    5)缓冲区自动刷新(清出)功能。(注意是刷新(flush),而不是清除(flushBuffer))

 

        a)如果设置为自动刷新,则在缓冲区满或者使用flush()方法显式清出时,都会向客户端输出信息。

 

        b)如果设置为不自动刷新,则必须明确使用flush()方法清出数据,否则如果缓冲区满了的话,将会产生IOException异常。

 

    6)使用缓冲区能够减少数据传输的次数,提高程序的运行效率。但也有可能产生响应延迟的问题,因为在缓冲区满或使用flush()显示清出之前,数据并不会真正发送到客户端。

 

分享到:
评论

相关推荐

    JSP/Servlet Java面试逻辑题

    一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)。 session是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求...

    Servlet与JSP核心编程第2版

    13.3 使用jsp:forward转发请求 13.4 包含使用java插件的applet 第14章 javabean组件在jsp文档中的应用 14.1 使用bean的原因 14.2 bean是什么 14.3 bean的应用:基本任务 14.4 示例:stringbean 14.5 ...

    jsp servlet

    //但是由于请求资源传递不是连续的 它一次请求后寿命结束 为了延续它的寿命 在页面跳转时 我们不用重定向 我们使用转发 如下: //获得资源定位 然后将请求转发出去----首先将资源定位到list 然后将当前的request和...

    Java™ Servlet 规范.

    2.3.1 加载和实例化 ................................................................................................................................16 2.3.2 初始化 ........................................

    java面试宝典

    187、JAVA SERVLET API中forward() 与redirect()的区别? 44 189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is ...

    JAVA程序员面试题

    一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系) session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求 ...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    JSP技术知识点考查 jsp动态建站技术

    <jsp:forward>操作允许将请求转发到另一个JSP、servlet或静态资源文件 标签用来在JSP页面中创建一个JavaBean实例并指定他的名字以及作用范围 此操作和setBean一起协作,用来设置JavaBean的属性 操作是对操作的补充,...

    Servlet3.1规范(最终版) PDF

    Servlet3.1规范(最终版) JavaTM Servlet 规范 版本 3.1(最终版) Shing Wai Chan Rajiv Mordani [作者] 穆茂强 张开涛 [译者] 2012年6月翻译 2013年7月修订 目录 前言 ............................... 3 ...

    千方百计笔试题大全

    187、JAVA SERVLET API中forward() 与redirect()的区别? 44 189、Can a Java Thread be started from Servlet class, and what will be the implications? 45 190、What is ...

    javaEE j2ee 大学考试题库,j2ee开发面试题库-1

    1. 在 JSP 中,( )动作作用于将请求转发给其他 JSP 页面。 A. forward B. include C. sendRedirect D. response 2. 一个 servlet 的生命周期不包括( )方法。 A. init()方法 B. destroy()方法 C. service()方法...

    JavaWeb开发技术-JSP动作元素.pptx

    在JSP页面和文档中使用写入文本的模板 在JSP页面中,为了把其他资源的输出内容插入到当前JSP页面的输出内容中,JSP技术提供了<jsp:include>动作元素。其语法格式为: <jsp:include page="relativeURL" flush="true|...

    Java面试宝典2020修订版V1.0.1.doc

    13、JSP和Servlet中的请求转发分别如何实现? 35 14、JSP乱码如何解决? 36 15、session 和 application的区别? 36 16、jsp有哪些内置对象?作用分别是什么? 36 17、Jsp有哪些动作?作用分别是什么? 37 18、JSP中动态...

    超级有影响力霸气的Java面试题大全文档

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    javaWed笔记

    1. 使用通配符“*”拦截用户的所有请求。 Filter的元素用于配置过滤器拦截的资源信息,如果想让过滤器拦截所有...如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器将不会被调用。

    java 面试题 总结

    与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。...

    十三、JSP动作

    JSP动作包括: jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    2.6.2 使用请求转发的动作标识<jsp:forward> 2.6.3 子动作标.iR~使用 2.7 实战检验 2.7.1 输出九九乘法表 2.7.2 JSP中实现随机抽奖 2.8 疑难解惑 2.8.1 在JSP页面中编写中文之后不能保存 2.8.2 访问JSP页面出现乱码...

    jsp内置对象的用法

    config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象) 序号 方 法 说 明 ...

    Java面试宝典2010版

    6、SERVLET API中forward() 与redirect()的区别? 86 7、什么情况下调用doGet()和doPost()? 8、Request对象的主要方法: 87 9、forward 和redirect的区别 10、request.getAttribute() 和 request.getParameter() ...

Global site tag (gtag.js) - Google Analytics