欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

include指令与include动作区别.

程序员文章站 2024-03-20 21:09:28
...
<jsp:include page=""/>
<%@ include file="" %>
这两个的区别已经被人问过很多次..

https://www.ibm.com/developerworks/cn/java/j-jsp04293/
https://www.ibm.com/developerworks/cn/java/j-jsp04153/
[quote]flush 属性

您可能已注意到 jsp:include 代码示例中的 flush 属性。顾名思义, flush 指示在读入包含内容之前是否清空任何现有的缓冲区。JSP 1.1 中需要 flush 属性,因此,如果代码中不用它,会得到一个错误。但是,在 JSP 1.2 中, flush 属性缺省为 false。由于清空大多数时候不是一个重要的问题,因此,我的建议是:对于 JSP 1.1,将 flush 设置为 true;而对于 JSP 1.2 及更高版本,将其设置为关闭。
[/quote]

[quote]jsp:include 是如何工作的

如果您有点爱刨根问底,那么可能十分想知道 jsp:include 标记的行为为什么与 include 伪指令不同。道理其实十分简单: jsp:include 包含的是所包含 URI 的 响应,而不是 URI 本身。这意味着:对所指出的 URI 进行 解释,因而包含的是 生成的响应。如果页面是 HTML,那么将得到一点也没有变化的 HTML。但是,如果是 Perl 脚本、Java servlet 或者 CGI 程序,那么得到的将是从该程序解释而得的结果。虽然页面通常就是 HTML,但实际程序恰好是达到目的的手段。而且,由于每次请求页面的时候都会进行解释,因此从来不会象使用 include 伪指令时那样高速缓存结果。虽然这只是很小的变动,但它却导致了您所见到的行为中的全部差异。
[/quote]

----------------------------------------------------------------
理解两者发生的时期,得先理解下JSP的生命周期
JSP生命周期:
转换:JSP文件-->SERVLET文件
编译:SERVLET文件-->CLASS文件
----(这两个也可以合并为翻译阶段)
装载:将类文件装载到内存中
创建:创建一个SERVLET实例对象
初始化:调用jspInit()方法,最终也就是调用servlet中的init方法
服务:调用_jspService()方法,最终调用servlet中的service方法
销毁:调用jspDestroy()方法,最终调用servlet类的destroy()方法

-------------------------------------------------------
included.jsp被包含文件 includepage.jsp使用指令文件 includeaction.jsp使用动作文件
include指令,included文件先被包含到includepage中,再去转换.
被包含页面的内容解析发生在编译时期.
最后只是生成java文件与class文件各一个.includepage_jsp.java和includepage_jsp.class
包含页面一经编译内容就不会再改变,如果要改变,就得重新编译JSP文件


而include动作,被包含文件与包含文件各自独立转换.会生成四个文件.
在包含文件中,使用
 org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "included.jsp", out, true);

在运行时再引用被包含文件的内容.
就是说被包含页面的内容解析发生在运行时期.内容也可以随时改变.

-------------------------------------------------------------
再总结下:
@include 解析工作发生在编译时期.一旦编译内容就不再改变,除非重新编译
:inlcude 发生在运行时期.内容随时可以改变.不需再编译.