问题

这个问题在这里已有答案:

  • 使用JSP include指令包含文件,JSP包含操作和使用JSP标记文件之间的区别是什么? 5个答案

两个标签都包含一个页面中的内容。

那么这两个标签之间的差异是什么?


#1 热门回答(98 赞)

在一个可重复使用的代码中,我使用了指令<%@include file="reuse.html"%>,在第二个代码中我使用了tag<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"/> 
<p><b>As the candle burns,so do I</b></p> </body>

运行两个JSP文件后,你会看到相同的输出,并认为是否在指令和标签之间存在任何差异。但是如果你看一下两个JSP文件的generatedservlet,你会发现它们之间存在差异。这是你在使用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\"/> 
\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文件中看到的used标记:

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "reusable.html", out, false);

所以现在你知道include指令插入了reuse.htmlat转换时间的源,但是action标签在运行时插入了reuse.html的响应。

如果你考虑一下,每个动作标签都会有额外的性能损失(jsp:include file)。这意味着你可以保证始终拥有最新内容,但这会增加性能成本。


#2 热门回答(52 赞)

这是一个巨大的差异。如前所述,<%@ include是静态包含,<jsp:include是动态包含。可以将其视为宏和函数调用之间的区别(如果你熟悉这些术语)。放置它的另一种方式,静态包含与复制粘贴所包含文件的精确内容("代码")在<%@ include语句的位置完全相同(这正是JSP编译器将要执行的操作。

动态包含将生成请求(使用请求调度程序)willexecute指示的页面,然后在调用页面的输出中包含页面的输出,代替<jsp:include语句。

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

<%
int i = 0;
%>

会产生编译错误(因为同一个变量不能多次声明)。


#3 热门回答(34 赞)

jGuru

<%@ include file ="abc.jsp"%>指令的作用类似于C"#include",拉入包含文件的文本并将其编译为好像是包含文件的一部分。包含的文件可以是任何类型(包括HTML或文本)。 <jsp:include page ="abc.jsp">标记将文件编译为单独的JSP文件,并在编译的JSP中嵌入对它的调用。一些JSP引擎支持非标准标记<! - #include file ="data.inc" - >(NCSA-或.shtml-style)和<%@ vinclude ="data.inc"%>(JRun -style),但这些没有在JSP规范中定义,因此不能依赖。另请参阅JSP FAQ中的这个问题。


原文链接