【问题标题】:JSF2: How are the *.taglib.xml files discovered in jsf-impl.jar?JSF2:如何在 jsf-impl.jar 中发现 *.taglib.xml 文件?
【发布时间】:2013-09-26 11:56:11
【问题描述】:

jsf-impl.jar(可在mvnrepository.com 上找到)中,*.taglib.xml 文件位于目录com/sun/faces/metadata/taglib/ 中。

我不明白在这种情况下它们是如何被发现的,因为JSF 2 specification 的第 10.3.2 章说:

10.3.2 Facelet 标签库机制

...

运行时必须支持 Facelet 标记库描述符的两种发现模式

  • 通过 web.xml 中的声明,如第 11.1.3 节“应用程序配置参数”中所述

  • 通过自动发现,将标记库描述符文件放置在 Web 应用程序类路径上的 jar 中,命名文件以使其以 “.taglib.xml” 结尾,不带引号,并将文件放置在 META-INF目录中的 jar 文件。

...

在这里,它们不在目录META-INF 中,那么它是如何工作的呢?

注意:在META-INF 中,它们是一些.tld 文件,但我对它们不感兴趣,因为我不是使用JSP 作为视图,而是使用Facelets。

【问题讨论】:

    标签: jsf-2 facelets taglib


    【解决方案1】:

    它没有为此使用taglib.xml。它通过在启动期间执行的com.sun.faces.application.ApplicationAssociate 中的com.sun.faces.facelets.tag.jsf.html.HtmlLibrary 以编程方式注册它们。以下是 Mojarra 2.2.1 中的相关行(从Grepcode 复制粘贴):

    954        c.addTagLibrary(new CoreLibrary());
    955        c.addTagLibrary(new CoreLibrary(CoreLibrary.XMLNSNamespace));
    956        c.addTagLibrary(new HtmlLibrary());
    957        c.addTagLibrary(new HtmlLibrary(HtmlLibrary.XMLNSNamespace));
    958        c.addTagLibrary(new UILibrary());
    959        c.addTagLibrary(new UILibrary(UILibrary.XMLNSNamespace));
    960        c.addTagLibrary(new JstlCoreLibrary());
    961        c.addTagLibrary(new JstlCoreLibrary(JstlCoreLibrary.IncorrectNamespace));
    962        c.addTagLibrary(new JstlCoreLibrary(JstlCoreLibrary.XMLNSNamespace));
    963        c.addTagLibrary(new PassThroughAttributeLibrary());
    964        c.addTagLibrary(new PassThroughElementLibrary());
    965        c.addTagLibrary(new FunctionLibrary(JstlFunction.class, FunctionLibrary.Namespace));
    966        c.addTagLibrary(new FunctionLibrary(JstlFunction.class, FunctionLibrary.XMLNSNamespace));
    967        if (isDevModeEnabled()) {
    968            c.addTagLibrary(new FunctionLibrary(DevTools.class, DevTools.Namespace));
    969            c.addTagLibrary(new FunctionLibrary(DevTools.class, DevTools.NewNamespace));
    970        }
    971        c.addTagLibrary(new CompositeLibrary());
    972        c.addTagLibrary(new CompositeLibrary(CompositeLibrary.XMLNSNamespace));
    

    【讨论】:

    • 您知道是否有理由以编程方式执行此操作,而不是使用taglib.xml
    • 原因是因为它是一个容器 JAR,而不是一个用户 JAR。 taglib.xml 仅适用于 /WEB-INF/lib 中用户提供的 JAR。
    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多