`

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()显示清出之前,数据并不会真正发送到客户端。

 

分享到:
评论

相关推荐

    servlet请求转发、重定向、包含

    Servlet请求转发、重定向和包含是Servlet中处理客户端请求的重要技术,它们都涉及到如何有效地管理用户请求和页面跳转,但各自有不同的特性和应用场景。 1. **请求转发(Request Forward)** - 请求转发是在服务器...

    servlet-api中文文档

    4. JSP动作标签:如`<jsp:include>`, `<jsp:forward>`, `<jsp:params>`等,它们用于动态地插入内容、转发请求或者传递参数。 总结来说,这个压缩包中的内容涵盖了Servlet API的核心概念和JSP的基本元素,对于理解和...

    jsp,servlet,filter温故知新

    **JSP、Servlet与Filter详解** 在Web开发领域,Java技术是不可或缺的一部分,其中JSP(JavaServer Pages)...在实际项目中,合理利用Filter可以提高应用的安全性和性能,而JSP和Servlet则负责处理用户交互和业务逻辑。

    Servlet API(中文)

    除了这些基本接口,Servlet API还包含其他关键类,例如`Filter`和`FilterChain`,它们用于实现过滤器,可以拦截、修改或转发请求和响应。`DispatcherType`枚举定义了请求的不同调度类型,如FORWARD、INCLUDE、ERROR...

    Servlet容器在请求对象中设置的属性

    例如,`javax.servlet.forward.request_uri`和`javax.servlet.include.request_uri`属性分别表示原始请求的URL(在转发和包含操作后保持不变)和当前请求URL(可能被转发或包含操作改变)。这些属性可以帮助开发者...

    javax.servlet jar包---解决找不到javax.servlet.*等问题

    - `DispatcherType`: 定义了不同的请求调度类型,如REQUEST、FORWARD、INCLUDE等。 3. **使用javax.servlet.jsp.jar** `javax.servlet.jsp` jar包是JavaServer Pages (JSP) API的一部分,它提供了将HTML和Java...

    JavaWeb请求转发和请求包含实现过程解析

    JavaWeb开发中,请求转发(Request Forwarding)和请求包含(Request Including)是两种常见的页面间交互技术。它们都是在服务器端内部进行操作,而与客户端浏览器的交互方式有所不同,尤其是与URL重定向(Redirect...

    servlet函数介绍及其api中文

    `forward(ServletRequest request, ServletResponse response)`方法用于实现请求转发。 7. **include()方法** `RequestDispatcher`的`include()`方法能将请求包含在当前响应中,通常用于在多个资源之间共享处理...

    Servlet中文2API.docx

    `forward()`方法用于将当前请求转发给服务器上的另一个资源,这通常发生在Servlet已经处理了部分请求,但需要其他组件(如另一个Servlet或静态资源)来完成剩下的工作。`forward()`会改变请求的URL路径以反映目标...

    JSP和Servlet公司培训课件

    - **加载与实例化:** 当服务器启动或第一次接收到Servlet请求时,Servlet容器会加载Servlet类并创建实例。 - **初始化:** 实例化后,调用`init()`方法进行初始化。 - **服务:** 对每个请求,Servlet容器创建一...

    Java Servlet 中文API档.doc

    7. **ServletException和UnavailableException类**:ServletException是Servlet中常见的异常类型,表示在处理请求过程中发生了错误。UnavailableException则用于表示Servlet暂时或永久无法提供服务。 Java Servlet ...

    servlet分发控制器

    5. `doProcess`方法根据请求信息决定如何分发请求,例如,通过`RequestDispatcher`的`forward`或`include`方法将请求转发给其他资源,或者直接调用业务逻辑类进行处理。 6. 业务逻辑处理完成后,可能需要更新数据...

    servlet-api_servlet_

    8. **DispatcherType枚举**:定义了不同类型的请求调度,如REQUEST、FORWARD、INCLUDE、ERROR等。 9. **AsyncContext接口**:支持异步处理,允许Servlet在不阻塞线程的情况下处理请求。 学习Servlet API不仅可以...

    Servlet和ssh方面的面试题

    - 使用`RequestDispatcher`的`forward()`和`include()`方法进行请求转发和包含。 5. **Filter和Listener** - Filter:Servlet过滤器允许在请求到达Servlet之前或响应离开Servlet之后拦截请求和响应。它们通过实现...

    Head First Servlet JSP

    4. **转发与重定向**:掌握RequestDispatcher的forward()和sendRedirect()方法的区别和使用场景。 5. **会话管理**:了解HttpSession接口,如何创建、跟踪和销毁用户的会话。 6. **JSP语法**:学习JSP基本结构,...

    Servlet与JSP之间的关系

    在实际开发中,常常使用Servlet来处理请求,调用JavaBean(Java类,封装业务逻辑)进行业务处理,然后通过`forward()`或`include()`方法将控制权交给JSP,由JSP生成最终的HTML响应给客户端。这种模式符合MVC(Model-...

    jsp/servlet基础课件

    **JSP(JavaServer Pages)和Servlet是Java Web开发中的两个核心技术,它们在构建动态Web应用程序方面发挥着关键作用。本课件旨在帮助初学者掌握这两项技术的基础知识,为后续深入学习打下坚实基础。** **JSP简介:...

    JSP和SERVLET笔试常遇到的一些问题

    JSP(JavaServer Pages)和Servlet是Java Web开发中两个核心的技术,它们主要用于构建动态网站。下面将详细阐述这两个概念以及它们在笔试中常遇到的问题。 1. JSP内置对象: - request:代表HttpServletRequest对象...

    JSPServlet新手学习资料

    1. **加载和实例化**:当Servlet容器首次接收到对Servlet的请求时,会加载Servlet类并创建一个Servlet实例。 2. **初始化**:通过调用Servlet的`init()`方法进行初始化,配置Servlet的初始状态。 3. **服务**:...

    韩顺平servlet和jsp课堂笔记

    3. **JSP动作**:如<jsp:include>、<jsp:forward>、等,它们在页面翻译成Servlet源码时起作用,控制页面动态行为。 4. **脚本元素**:包括声明(declarations)、表达式(expressions)、脚本块(scriptlets)和JSP...

Global site tag (gtag.js) - Google Analytics