在一段可重复使用的代码中,我使用了 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 文件后,您会看到相同的输出,并考虑 directive 和 action 标记 之间是否有任何区别。但是如果您查看生成的两个 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
是静态包含,<jsp:include
是动态包含。将其视为宏和函数调用之间的区别(如果您熟悉这些术语)。另一种说法,静态包含与将包含文件的确切内容(“代码”)复制粘贴到 <%@ include
语句的位置完全相同(这正是 JSP 编译器将执行的操作) .
动态包含将发出一个 request(使用请求调度程序),它将 执行 指示的页面,然后将页面的输出包含在调用页面的输出中,在<jsp:include
语句的位置。
这里最大的区别在于,使用动态包含,包含的页面将在它自己的 pageContext 中执行。由于它是一个请求,因此您可以将参数发送到页面,就像您可以与任何其他请求一起发送参数一样。另一方面,静态包含只是一段将在调用页面的上下文中执行的代码。如果您多次静态包含同一个文件,则该文件中的代码将存在于调用页面上的多个位置,因此类似于
<%
int i = 0;
%>
会产生编译器错误(因为不能多次声明同一个变量)。
<%@include file="abc.jsp"%> 指令的作用类似于 C“#include”,拉入包含文件的文本并将其编译,就好像它是包含文件的一部分一样。包含的文件可以是任何类型(包括 HTML 或文本)。
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 指令包含的资源是在 jsp 翻译时加载的,而 include 动作包含的资源是在请求时加载的。在包含指令的情况下,在 jsp 文件再次编译之前,对包含资源的任何更改都将不可见。在包含操作的情况下,包含资源的任何更改都将在下一个请求中可见。 Include 指令是静态导入,而 include 动作是动态导入 Include 指令使用文件属性来指定要包含的资源,而 include 动作使用页面属性用于相同目的。
一种是静态导入(<%=@ include...>"),另一种是动态导入(jsp:include)。它会影响例如您必须为包含的文件指定的路径。一点研究在谷歌上会告诉你更多。
不定期副业成功案例分享
<jsp:include
是动态的 (JspRuntimeLibrary),<%@include
是静态的 (out.write)。<%@include
by is static(out.write
) 你的意思是任何写的东西,比如让我们说从请求中读取的 EL 将是动态的或静态的,请你在这里帮助我,谢谢,否则它将被视为字符串${someVar}
<%@include
用于全局变量共享目的,将<jsp:include
单独用于 jsp 范围变量,而不会出现命名冲突问题。虽然仅用于文本输出,但两者都是相同的。对于变量范围的使用,它们是完全不同的。