<jsp:include page = ... > 和 <%@ include file = ... > 有啥区别? [复制]

Posted

技术标签:

【中文标题】<jsp:include page = ... > 和 <%@ include file = ... > 有啥区别? [复制]【英文标题】:What is the difference between <jsp:include page = ... > and <%@ include file = ... >? [duplicate]<jsp:include page = ... > 和 <%@ include file = ... > 有什么区别? [复制] 【发布时间】:2011-12-14 08:38:48 【问题描述】:

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

那么这两个标签到底有什么区别

【问题讨论】:

【参考方案1】:

在一段可重复使用的代码中,我使用directive &lt;%@include file="reuse.html"%&gt;,在第二段中我使用standard action &lt;jsp:include page="reuse.html" /&gt;

设可重用文件中的代码为:

<html>
<head>
    <title>reusable</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
    <img src="candle.gif"  /> <br />
    <p><b>As the candle burns,so do I</b></p>
</body>

运行这两个 JSP 文件后,您会看到相同的输出,并考虑 directiveaction 标记 之间是否有任何区别。但是如果你看一下这两个 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 的来源在翻译时,但是 action 标签 插入了响应reuse.html 在运行时

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

【讨论】:

您能否更具体地说明哪个包含结果在哪个输出中?您提到您的第二个包含使用指令(@include)。然后在第一个输出结果中,您提到您使用了指令(@include),但在第二个输出结果中,您还说它来自第二个包含(根据您之前的解释,它是@include)。 如果其他人对此答案感到困惑:&lt;jsp:include 是动态的 (JspRuntimeLibrary),&lt;%@include 是静态的 (out.write)。 @eis in &lt;%@include by is static(out.write) 你的意思是任何写的东西,比如让我们说从请求中读取的 EL 将是动态的或静态的,请你在这里帮我谢谢或它将被视为字符串$someVar @eis 是对的,不太清楚答案是什么! 这个答案很擅长源码解释!!!我可以将&lt;%@include 用于全局变量共享目的,将&lt;jsp:include 单独用于jsp 范围变量,而不会出现命名冲突问题。虽然仅用于文本输出,但两者都是相同的。对于变量范围的使用,它们是完全不同的。【参考方案2】:

jGuru:

&lt;%@include file="abc.jsp"%&gt; 指令的作用类似于 C "#include", 拉入包含文件的文本并像编译它一样编译它 是包含文件的一部分。包含的文件可以是任何类型 (包括 HTML 或文本)。

标记将文件编译为单独的 JSP 文件,并在编译后的 JSP 中嵌入对它的调用。

一些 JSP 引擎支持非标准标签 <!--#include file="data.inc"-->(NCSA 或 .shtml 样式)和 <%@ vinclude="data.inc" %>(JRun 样式),但这些在 JSP 规范,因此不能依赖。

另请参阅 JSP 常见问题解答中的此问题。

【讨论】:

【参考方案3】:

Java Revisited

    include 指令包含的资源在 jsp 翻译期间加载,而 include 操作包含的资源在请求期间加载。 在包含指令的情况下,在 jsp 文件再次编译之前,对包含资源的任何更改都将不可见。在包含操作的情况下,包含资源的任何更改都将在下一个请求中可见。 include 指令是静态导入,而 include 动作是动态导入 include 指令使用文件属性来指定要包含的资源,而包含操作使用页面属性用于相同目的。

【讨论】:

【参考方案4】:

1) 什么时候使用include指令

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

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

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

简单来说就是对jsp引擎的静态指令,即把“abc.jsp”的全部源代码复制到当前页面中

2) 何时使用包含操作

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

include标签功能类似于servlet编程的request dispatcher的include机制

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

【讨论】:

很好的解释!在翻译时(静态)指令 OR 在运行时(动作)【参考方案5】:

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

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

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

<%
int i = 0;
%>

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

【讨论】:

这种类型的答案是 SO 的真正礼物,它可以为其他人节省几个小时。【参考方案6】:

一个是静态导入 ("),另一个是动态导入 (jsp:include)。它将影响例如您必须为包含文件指定的路径。对 Google 进行一些研究会告诉您更多信息。

【讨论】:

以上是关于<jsp:include page = ... > 和 <%@ include file = ... > 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

jsp基础语言-jsp指令

IT兄弟连 JavaWeb教程 JSP静态包含和动态包含的区别

初识Jsp,JavaBean,Servlet以及一个简单mvc模式的登录界面

JSP常用指令

Jsp页面中动态的引入另一个jsp,jsp:include路径是变量的实现

jsp常用指令