<jsp:包含页面 = ...>和<%@ 包含文件 = ...>?

2022-08-31 09:33:15

这两个标记都包含来自一个页面的内容在另一个页面中。

那么这两个标签之间到底有什么区别呢?


答案 1

在一段可重用的代码中,我使用指令,在第二段代码中,我使用标准操作<%@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.htmlreuse.html

如果您仔细想想,每个操作标记都会有额外的性能影响()。这意味着您可以保证始终拥有最新的内容,但这会增加性能成本。<jsp:include>


答案 2

这两者之间有着巨大的差异。如前所述,是静态包含,是动态包含。可以将其视为宏和函数调用之间的差异(如果您熟悉这些术语)。另一种说法是,静态包含与将包含文件(“代码”)的确切内容复制粘贴到语句位置完全相同(这正是 JSP 编译器将要执行的操作)。<%@ include<jsp:include<%@ include

动态包含将发出一个请求(使用请求分派器),该请求将执行指示的页面,然后将该页面的输出包含在调用页面的输出中,以代替语句。<jsp:include

这里最大的区别在于,对于动态包含,包含的页面将在它自己的页面Context中执行。由于这是一个请求,因此您可以像发送参数以及任何其他请求一样向页面发送参数。另一方面,静态包含只是在调用页的上下文中执行的一段代码。如果静态地多次包含同一文件,则该文件中的代码将存在于调用页上的多个位置,如下所示

<%
int i = 0;
%>

将生成编译器错误(因为同一变量不能声明多次)。