<jsp:包含页面 = ...>和<%@ 包含文件 = ...>?
这两个标记都包含来自一个页面的内容在另一个页面中。
那么这两个标签之间到底有什么区别呢?
这两个标记都包含来自一个页面的内容在另一个页面中。
那么这两个标签之间到底有什么区别呢?
在一段可重用的代码中,我使用指令,在第二段代码中,我使用标准操作。<%@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>\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
reuse.html
如果您仔细想想,每个操作标记都会有额外的性能影响()。这意味着您可以保证始终拥有最新的内容,但这会增加性能成本。<jsp:include>
这两者之间有着巨大的差异。如前所述,是静态包含,是动态包含。可以将其视为宏和函数调用之间的差异(如果您熟悉这些术语)。另一种说法是,静态包含与将包含文件(“代码”)的确切内容复制粘贴到语句位置完全相同(这正是 JSP 编译器将要执行的操作)。<%@ include
<jsp:include
<%@ include
动态包含将发出一个请求(使用请求分派器),该请求将执行指示的页面,然后将该页面的输出包含在调用页面的输出中,以代替语句。<jsp:include
这里最大的区别在于,对于动态包含,包含的页面将在它自己的页面Context中执行。由于这是一个请求,因此您可以像发送参数以及任何其他请求一样向页面发送参数。另一方面,静态包含只是在调用页的上下文中执行的一段代码。如果静态地多次包含同一文件,则该文件中的代码将存在于调用页上的多个位置,如下所示
<%
int i = 0;
%>
将生成编译器错误(因为同一变量不能声明多次)。