<jsp:include page =“...”>和&lt;%@ include file = ...&gt;有什么区别?</jsp:include>

时间:2011-10-24 18:12:42

标签: java jsp

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

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

6 个答案:

答案 0 :(得分:102)

在一段可重复使用的代码中,我使用指令<%@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文件中看到的used标记:

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

现在您知道include指令在转换时插入reuse.html的源,但action标记在运行时插入了reuse.html的响应。

如果您考虑一下,每个操作标记(jsp:include file)都会产生额外的性能影响。这意味着您可以保证始终拥有最新内容,但这会增加性能成本。

答案 1 :(得分:53)

有很大的不同。如前所述,<%@ include是静态包含,<jsp:include是动态包含。可以将其视为宏和函数调用之间的区别(如果您熟悉这些术语)。放置它的另一种方式,静态包含与在<%@ include语句的位置复制粘贴所包含文件(“代码”)的确切内容完全相同(这正是JSP编译器的内容)会做的。

动态包含将发出请求(使用请求调度程序)执行指示的页面,然后在调用的输出中包含页面的输出页面,代替<jsp:include声明。

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

<%
int i = 0;
%>

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

答案 2 :(得分:37)

jGuru

  

<%@include file="abc.jsp"%>指令的行为类似于C "#include",   拉入包含文件的文本并将其编译为就像它一样   是包含文件的一部分。包含的文件可以是任何类型   (包括HTML或文本)。

     

&lt; jsp:include page =“abc.jsp”&gt; tag将文件编译为单独的   JSP文件,并在编译的JSP中嵌入对它的调用。

     

某些JSP引擎支持非标准标记<!--#include file="data.inc"-->(NCSA-或.shtml-style)和<%@ vinclude="data.inc" %>(JRun-style),但这些标记未在   JSP规范因此无法依赖。

     

请参阅JSP FAQ中的这个问题。

答案 3 :(得分:28)

1)何时使用 include指令

为了防止在Web应用程序的多个jsp上重复相同的输出逻辑,使用包含机制,即促进表示逻辑包含指令的重用性

  <%@ include file="abc.jsp" %>

当jsp引擎接收到上述指令时,它检索abc.jsp的源代码并在当前jsp中复制相同的内联。复制后,为当前页面执行翻译

简单地说它是jsp引擎的静态指令即,“abc.jsp”的整个源代码被复制到当前页面

2)何时使用包含操作

include标签不包含当前页面中包含的页面的源代码,而是包含页面在运行时生成的输出包含在当前页面响应中

include标记功能类似于servlet编程请求调度程序的包含机制

include标签是对jsp引擎的运行时指令,即,将整个代码复制到当前页面,从当前页面调用“abc.jsp”进行方法调用

答案 4 :(得分:1)

一个是静态导入(&lt;%= @ include ...&gt;“),另一个是动态导入(jsp:include)。它会影响你必须为你所包含的路径指定的路径对谷歌的一点研究会告诉你更多。

答案 5 :(得分:1)

Java Revisited

  1. include指令包含的资源在jsp转换时加载,而include action包含的资源在请求时加载。
  2. 在包含指令的情况下,包含资源的任何更改都将不可见,直到jsp文件再次编译为止。在包含操作的情况下,包含资源的任何更改都将在下一个请求中显示。
  3. Include指令是静态导入,而include action是动态导入
  4. 包含指令使用文件属性指定要包含的资源,同时包含动作使用页面属性。