ChatGPT解决这个技术问题 Extra ChatGPT

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

这个问题在这里已经有了答案:使用 JSP 包含指令、JSP 包含操作和使用 JSP 标记文件包含文件有什么区别? (5 个回答) 8 年前关闭。

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

那么这两个标签之间的确切区别是什么?


i
informatik01

在一段可重复使用的代码中,我使用了 directive <%@include file="reuse.html"%>,而在第二段代码中,我使用了 standard action <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 文件后,您会看到相同的输出,并考虑 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 at translation time 的来源,但是 action 标签 插入了 reuse.html 的响应} 在运行时

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


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

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

动态包含将发出一个 request(使用请求调度程序),它将 执行 指示的页面,然后将页面的输出包含在调用页面的输出中,在<jsp:include 语句的位置。

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

<%
int i = 0;
%>

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


这种类型的答案是 SO 的真正礼物,它为其他人节省了几个小时(如果不是很多小时)。
U
Uchenna Nwanyanwu

jGuru

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


A
Ajay Takur

1) 何时使用包含指令?

为了防止在 web 应用程序的多个 jsp 中重复相同的输出逻辑,使用了 include 机制,即,为了提高表示逻辑的可重用性,使用了 include 指令

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

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

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

2) 何时使用包含操作?

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

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

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


很好的解释!在翻译时(静态)指令<%@ include file="file.jsp" %> OR 在运行时(操作)
A
Abhijeet Ashok Muneshwar

Java Revisited

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


t
talnicolas

一种是静态导入(<%=@ include...>"),另一种是动态导入(jsp:include)。它会影响例如您必须为包含的文件指定的路径。一点研究在谷歌上会告诉你更多。