包含页面… …和<%@ include file = …>之间有什么区别?
两个标签都包含来自另一个页面的内容。
那么这两个标签之间的确切区别是什么?
在一段可重复使用的代码中,我使用指令<%@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
,您将看到不同之处。在使用该directive
时,您将看到以下内容:
out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <title>reusable</title>\r\n"); out.write(" <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n"); out.write(" </head>\r\n"); out.write(" <body>\r\n"); out.write(" <img src=\"candle.gif\" height=\"100\" width=\"50\"/> <br />\r\n"); out.write(" <p><b>As the candle burns,so do I</b></p>\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n");
这就是你将在第二个JSP文件中看到的标签:
org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false);
所以现在你知道include指令在翻译的时候插入了reuse.html
的源码,但是action标签在运行时插入了reuse.html的响应。
如果你仔细想想,每一个动作标签( jsp:include file
)都会带来额外的性能提升。 这意味着您可以保证您将始终拥有最新的内容,但会增加性能成本。
有一个巨大的差异。 如前所述, <%@ include
是一个静态include, <jsp:include
是一个dynamicinclude。 把它看作是macros和函数调用之间的差别(如果你熟悉这些术语)。 静态包含的另一种方式与在<%@ include
语句的位置上复制包含文件(“代码”)的确切内容完全相同(这正是JSP编译器将做。
一个dynamic包含将会发出一个请求 (使用请求分派器)来执行指定的页面,然后在调用页面的输出中包含页面的输出,而不是<jsp:include
语句。
这里最大的区别是,使用dynamic包含,包含的页面将在它自己的pageContext中执行。 而且,由于这是一个请求,所以可以像发送参数一样向其他请求发送参数。 另一方面,静态包含只是在调用页面的上下文中执行的一段代码。 如果您多次静态地包含同一文件,那么该文件中的代码将存在于调用页面上的多个位置,如此类似
<% int i = 0; %>
会产生一个编译器错误(因为同一个variables不能被声明多次)。
jGuru :
<%@include file="abc.jsp"%>
指令的作用与C"#include"
相似,拉入包含文件的文本,并将其编译为包含文件的一部分。 包含的文件可以是任何types(包括HTML或文本)。<jsp:include page =“abc.jsp”>标签将文件编译为一个单独的JSP文件,并在编译的JSP中embedded一个调用。
一些JSP引擎支持非标准标记
<!--#include file="data.inc"-->
(<!--#include file="data.inc"-->
或.shtml-style)和<%@ vinclude="data.inc" %>
样式),但这些在JSP规范中没有定义,因此不能被依赖。请参阅JSP常见问题解答中的这个问题。
1)何时使用include指令 ?
为了防止跨web应用的多个jsp的相同输出逻辑的重复,使用包括机制,即,提高表示逻辑的可用性,包括指令被使用
<%@ include file="abc.jsp" %>
当jsp引擎接收到上述指令时,它会检索abc.jsp的源代码,并在当前的jsp中内联复制。 在复制当前页面的翻译之后
简单地说就是静态指令,即将“abc.jsp”的整个源代码复制到当前页面
2)何时使用包含动作 ?
include标签不包含所包含页面的源代码到当前页面,而是包含页面在运行时生成的输出包含在当前页面响应中
包括标签function类似于servlet编程请求调度程序的包含机制
include标签是运行时指令,即jsp引擎,而不是将整个代码复制到当前页面,从当前页面调用“abc.jsp”方法
一个是静态导入(<%= @ include …>“),另一个是dynamic导入(jsp:include),它会影响你要包含的文件的path。在谷歌会告诉你更多。
Java重访
- include指令包含的资源在jsp编译期间被加载,而include操作包含的资源在请求时被加载。
- 在include指令的情况下,对包含资源的任何更改都将不可见,直到jsp文件再次编译。 在包含操作的情况下,包含资源的任何更改将在下一个请求中可见。
- 包含指令是静态导入,而包含动作是dynamic导入
- 包含指令使用文件属性指定要包含的资源,而包含操作使用页面属性用于同一目的。