这两个标签都包含了从一个页面到另一个页面的内容
那么这两个标签之间的确切区别是什么呢?在一段可重用的代码中,我使用指令 <%@include file="reuse.html"%>
,在第二段代码中,我使用标准操作 <jsp:include page="reuse.html" />
。
让可重用文件中的代码如下:
<html>
<head>
<title>reusable</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<img src="candle.gif" height="100" width="50"/> <br />
<p><b>As the candle burns,so do I</b></p>
</body>
在运行这两个JSP文件之后,您将看到相同的输出,并考虑指令和操作标记之间是否有任何区别。但是,如果您查看这两个JSP文件生成的servlet
,您将看到差异。
下面是当你使用指令:
时你会看到的结果out.write("<html>rn");
out.write(" <head>rn");
out.write(" <title>reusable</title>rn");
out.write(" <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">rn");
out.write(" </head>rn");
out.write(" <body>rn");
out.write(" <img src="candle.gif" height="100" width="50"/> <br />rn");
out.write(" <p><b>As the candle burns,so do I</b></p>rn");
out.write(" </body>rn");
out.write("</html>rn");
这是您将在第二个JSP文件中看到的用于标准操作的内容:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false);
那么现在你知道include指令在翻译时插入reuse.html
的源代码,但是动作标签在运行时插入reuse.html
的响应。
仔细想想,每个动作标记 (<jsp:include>
)都会对性能造成额外的影响。这意味着您可以保证始终拥有最新的内容,但这会增加性能成本。
差别很大。如前所述,<%@ include
是一个静态包含,<jsp:include
是一个动态包含。可以把它看作宏和函数调用之间的区别(如果您熟悉这些术语)。另一种说法是,静态包含与将包含的文件("代码")的确切内容复制粘贴到<%@ include
语句的位置(这正是JSP编译器将要做的事情)完全相同。
动态包含将发出请求(使用请求调度程序),该请求将执行指定的页面,然后将该页的输出包含在调用页面的输出中,以代替<jsp:include
语句。
这里最大的区别是,对于动态包含,被包含的页面将在它自己的pageContext中执行。由于这是一个请求,所以您可以将参数发送到页面,就像您可以将参数与任何其他请求一起发送一样。另一方面,静态包含只是在调用页的上下文中执行的一段代码。如果静态地包含同一个文件多次,那么该文件中的代码将存在于调用页面的多个位置,例如
<%
int i = 0;
%>
会产生编译错误(因为同一个变量不能声明多次)。
jGuru:
jsp:include page="abc.jsp">标记将文件编译为单独的JSP文件,并在编译后的JSP中嵌入对它的调用。
<%@include file="abc.jsp"%>
指令的作用类似于c"#include"
,拉入包含的文件的文本并编译它,就好像它是包含文件的一部分。包含的文件可以是任何类型(包括HTML或文本)。一些JSP引擎支持非标准标记
<!--#include file="data.inc"-->
(NCSA-,或. shhtml风格)和<%@ vinclude="data.inc" %>
(jrun风格),但是它们没有在JSP规范,因此不能依赖。请参阅JSP FAQ中的这个问题。
1)何时使用包括指令 ?
为了防止在web应用的多个jsp中重复相同的输出逻辑,使用了include机制。,为了提高表示逻辑的可重用性,使用了include指令
<%@ include file="abc.jsp" %>
当JSP引擎接收到上述指令时,它将检索abc.jsp的源代码,并将其复制到当前JSP中。复制完成后,为当前页执行翻译
简单地说它是静态指令的jsp引擎ie。,"abc.jsp"的整个源代码被复制到当前页面
2)何时使用包含动作 ?include标记不将被包含页的源代码包含到当前页中,而是将被包含页在运行时生成的输出包含到当前页响应
include标签功能类似于servlet编程中请求调度程序的include机制
include标签是对JSP引擎的运行时指令。,不是将整个代码复制到当前页面,而是从当前页面
Java Revisited
- include指令包含的资源在jsp转换时加载,而include动作包含的资源在请求时加载。
- 在包含指令的情况下,包含资源的任何更改在jsp文件再次编译之前都是不可见的。而在include操作的情况下,所包含的资源的任何更改将在下一个请求中可见。
- Include指令是静态导入,而Include动作是动态导入
- Include指令使用file属性来指定要包含的资源,而Include动作使用page属性来达到相同的目的。
一个是静态导入(<%=@ include…>"),另一个是动态导入(jsp:include)。比如,它会影响到你要为包含文件指定的路径。在Google上搜索一下就会知道更多。