它们的区别主要为以下几点:
jsp:include 动作 | include指令 | |
语法 | <jsp:inlcude page="relative-path-to-resource"/> | <%@ include file="relative-path-to-resource" %> |
被包含发生时间 | 请求页面时 | jsp页面转为servlet时 |
被包含内容 | jsp页面的output(一般为html) | jsp页面的源码 |
对应servlet数目 | 两个 (包含页面和被包含页面各自 对应一个servlet) | 一个 (只有包含页面对应的servlet 即主页面的servlet) |
被包含页面设置的 resposne header 信息, 能否影响 到包含页面? | 不能,各自对应不同的servlet。 | 能,对应同一个servlet。 |
被包含页面定义的 属性和方法信息, 能否被包含页面使用? | 不能,各自对应不同的servlet。 | 能,对应同一个servlet。 |
当被包含页面发生 变化时, 包含页面是否需要更新? | 不需要, 因为被包含的是jsp页面的结果(html)。 | 需要,因为包含的是jsp的源码, 需要重新进行jsp到servlet 的转换。 |
相应的servelt代码 | RequestDispatcher的include方法 | 无 |
补充说明(1):
其中的relative-path-to-resource,如果不是以"/"开始,则是相对于当前包含文件的相对路径。
如果是以"/"开始,则是相对于当前Web应用程序的根目录相对路径。
另外,由于include指令对于包含页面的难维护性,所以一般推荐使用include动作,
除非有特殊需求,如需要访问被包含页面中定义的属性和方法。
补充说明(2):
jsp转化为servlet场景
jsp转化为servlet | 编译servlet | servlet装载到server内存 | 调用jspInit方法 | 调用_jspService方法 | |
编写jsp页面后保存 | |||||
第一次请求 | 执行 | 执行 | 执行 | 执行 | 执行 |
第二次请求 | 不执行 | 不执行 | 不执行 | 不执行 | 执行 |
重启服务器 | |||||
第三次请求 | 不执行 | 不执行 | 执行 | 执行 | 执行 |
第四次请求 | 不执行 | 不执行 | 不执行 | 不执行 | 执行 |
编辑jsp页面后保存 | |||||
第五次请求 | 执行 | 执行 | 执行 | 执行 | 执行 |
第六次请求 | 不执行 | 不执行 | 不执行 | 不执行 | 执行 |