JSP 中的 autoFlush 属性

autoFlush是 JSP page指令的属性,用于控制 JSP 内置对象out(JspWriter)的缓冲区满时是否自动刷新输出,与buffer属性配合使用(buffer定义缓冲区大小)。

核心细节:

  • 语法格式<%@ page autoFlush="true|false" buffer="size|none" %>

  • 默认值true(缓冲区满时自动刷新);

  • 关键概念

    • out对象的缓冲区:JSP 输出内容时,先写入内存缓冲区(默认 8KB),而非直接发送到客户端;
    • 刷新(flush):将缓冲区中的内容一次性发送到客户端,并清空缓冲区。

不同取值的行为:

autoFlush 值 缓冲区状态 行为描述
true(默认) 缓冲区未满 内容暂存缓冲区,直到缓冲区满 / 页面结束 / 手动调用out.flush()时发送;
true 缓冲区满 自动刷新缓冲区(发送内容 + 清空),无异常,继续执行;
false 缓冲区未满 与 true 一致;
false 缓冲区满 直接抛出java.io.IOException异常(缓冲区溢出),停止输出;
- buffer=”none”(无缓冲区) autoFlush 失效,所有内容直接输出到客户端(即使 autoFlush 设为 false);

注意事项:

  1. autoFlush="false"仅在需要严格控制输出时机(如文件下载、流式响应)时使用,需手动调用out.flush()避免缓冲区溢出;
  2. 缓冲区大小(buffer)可自定义(如16kb),但不宜过大(占用内存)或过小(频繁刷新影响性能);
  3. 若页面输出大量内容(如大数据报表),建议保持默认的autoFlush="true",避免异常。

示例:

1
2
3
4
5
6
7
8
9
<%@ page contentType="text/html;charset=UTF-8" buffer="4kb" autoFlush="false" %>
<%
// 循环输出大量内容,触发缓冲区溢出
for (int i = 0; i < 10000; i++) {
out.print("测试内容:" + i + "<br>");
// 若不手动flush,autoFlush=false时会抛异常
// out.flush();
}
%>