虽然 include
非常适于将静态内容并入 Web 页面,但对于动态内容却不尽如人意。在试图重新装入高速缓存文件时发现了这一问题。与大多数页眉文件及页脚文件不同,动态内容变化频繁,必须时刻更新。
JSP include
伪指令的不足之处有一个是:它会导致 Web 浏览器高速缓存所有页面。在处理诸如页脚、版权声明或一组静态链接之类的静态组件时,这是有意义的。这些文件不会改变,因此没有理由让 JSP 解释器不断地重新轮询其中的数据。凡是可能的地方,都应该实现高速缓存,因为它改善了应用程序的性能。
但是,有时侯,进行高速缓存会得不偿失。如果提入的内容来自使用动态数据(如 Weblog 或数据库驱动的 JSP 文件)的程序,甚至如果所包含的内容是经常变化的 HTML(如时间戳记),那么每当装入 Web 页面时,都需要显示这些文件或程序的最新版本。遗憾的是,JSPinclude
伪指令并不具备这一功能。在测试和开发周期中,在浏览器中禁用高速缓存通常能够解决这一问题。但是,对于实际使用的应用程序而言,性能是任何设计决策过程中的一项重要因素,禁用高速缓存并不是一种可行的长远之计。更好的解决方案是使用 jsp:include
标记。
jsp:include
只不过是一个不同于 include
的伪指令而已。 jsp:include
的优点在于:它 总是会检查所含文件中的变化。过一会儿我们将研究这一新标记的工作方式。但首先看一下两种 include
各自的代码,以便能够看到二者之间的异同。
清单 2 显示了一个简单页面,它使用了原始的 JSP include
伪指令。
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>JSP include element test</title>
</head>
<body>
This content is statically in the main JSP file.<br />
<%@ include file="included.html" %>
</body>
</html>
]]>
清单 3 是同一个页面,只不过这里转成使用 jsp:include
标记。
<![CDATA[
<%@ page language="java" contentType="text/html" %>
<html>
<head>
<title>JSP include element test</title>
</head>
<body>
This content is statically in the main JSP file.<br />
<jsp:include page="included.html" flush="true" />
</body>
</html>
]]>
flush 属性
您可能已注意到 jsp:include
代码示例中的 flush
属性。顾名思义, flush
指示在读入包含内容之前是否清空任何现有的缓冲区。JSP 1.1 中需要 flush
属性,因此,如果代码中不用它,会得到一个错误。但是,在 JSP 1.2 中,flush
属性缺省为 false。由于清空大多数时候不是一个重要的问题,因此,我的建议是:对于 JSP 1.1,将 flush
设置为 true;而对于 JSP 1.2 及更高版本,将其设置为关闭。