2

我不太熟悉这在 JSP 中是如何工作的

但在

main.jsp 模板里面是这样的:

<%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %>
<jsp:include page="/jsp/common_head.jsp"/>

然后在 common_head.jsp 我们又得到了这个:

<%@ taglib uri="/WEB-INF/tld/c.tld" prefix="c" %>

这是必要的吗?

或者换句话说

taglib 声明是否传播到包含文件?

4

5 回答 5

5

是的,这是必要的。在第一次执行之前,每个 JSP 文件都会被单独转换/翻译/编译成一个独立的Servlet类。所有标签都将被翻译成“真正的”Java 代码/方法。如果您不声明标记库,那么 JSP 编译器不知道它需要为特定标记生成/调用哪些 Java 代码/方法。

例如,在 Tomcat 的情况下,查看/work所有已编译 JSP 的文件夹。查看他们的来源,一切都会清楚。

于 2009-11-05T20:09:49.857 回答
5

<jsp:include page="/jsp/common_head.jsp"/>

... 标签是一个动态包含,意味着它动态调用 common_head.jsp 页面,该页面独立于包含页面进行编译。因此应该需要 taglib 指令。

另一方面,如果您要使用 include指令进行静态包含

<%@ include file="/jsp/common_head.jsp" %>

...该文件将被复制粘贴并与包含它的页面一起编译。那么应该不需要 taglib 指令。

在任何情况下,您可能希望包含 taglib 只是为了获得您在开发期间使用的标签的编辑器支持。

请注意,静态文件是静态包含的,即使带有 jsp:include 标记

包括指令:http: //java.sun.com/products/jsp/syntax/1.2/syntaxref129.html#997991

jsp包括:http: //java.sun.com/products/jsp/syntax/1.2/syntaxref1214.html

于 2009-11-05T20:26:34.137 回答
2

当您包含动态资源时,该资源是“独立的”,因此它应该包含您正在使用的任何标签库。另一个问题是你是否使用这些标签......

于 2009-11-05T19:56:25.110 回答
0

是的,它是 JSP 编译所必需的。您也可以使用下面的 taglib 代替 c.tld。

<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

希望这会有所帮助

于 2019-01-18T06:42:27.860 回答
-3

在其他模板系统中,定义通常会被继承。我不明白你为什么必须再次使用它

于 2009-11-05T20:09:38.430 回答