0

我正在 SpringBoot 下创建一个自定义标记库。我的 taglib 标签是:

<%@taglib prefix="ttl" uri="/WEB-INF/tags/resourceBundle.tld" %>

我根据许多可用的来源创建了一个 TLD 文件并将其放在 /WEB-INF/tags/resourceBundle.tld 中,这里是带有 uri 标记的部分

<taglib>
    <uri>/WEB-INF/tags/resourceBundle.tld</uri>
    ...

但是当我引用标记库时收到此错误消息:

org.apache.jasper.JasperException: Invalid tld file: [/WEB-INF/tags/resourceBundle.tld], see JSP specification section 7.3.1 for more details

但是,我不相信它会被读取,因为它在 TagLibraryInfoImpl::generateTldResourcePath()@281 中被确定为无效:

    if (uri.endsWith(".jar")) {
       // snip
    } else if (uri.startsWith("/WEB-INF/lib/") || uri.startsWith("/WEB-INF/classes/") ||
            (uri.startsWith("/WEB-INF/tags/") && uri.endsWith(".tld")&& !uri.endsWith("implicit.tld"))) {
        err.jspError("jsp.error.tld.invalid_tld_file", uri);
    }

代码在最后一个 err.jspError 行结束:

        err.jspError("jsp.error.tld.invalid_tld_file", uri);

基本上,如果 URI 以“/WEB-INF/tags”开头(正如许多消息来源所说是强制性的)并以“.tld”结尾,但不是“implicit.tld”,那么 tld 文件是“无效的”——这个结论甚至无需打开文件即可到达。

我已更改 <%@taglib%> uri 以引用不存在的文件,并通过代码(上图)从同一路径获取相同的错误消息。

我已经阅读了许多关于该主题的文章并查看了一个使用自定义标记库的旧项目(但它使用了 ANT 和 Spring,我使用的是 Maven 和 SpringBoot),我不知道如何识别我的标记库。

有人可以告诉我我做错了什么吗?

4

1 回答 1

0

JSP 2.1 规范指出:

TLD 文件不应放置在 /WEB-INF/classes 或 /WEB-INF/lib 中,并且不得放置在 /WEB-INF/tags或其子目录中,除非命名为implicit.tld

我建议使用另一个目录。

于 2021-11-08T20:44:06.107 回答