.tld 文件中声明的自定义 JSF 组件在 JSP 中有效,但在 Facelets 中无效

Custom JSF component declared in .tld file works in JSP but not in Facelets

我有一个在 .tld 文件中注册的自定义 JSF 组件。当我如下声明它时,它在 JSP 中工作正常:

<%@taglib uri="http://example.com/ui" prefix="ex"%>

但是,当我尝试如下声明时,它在 Facelets 中不起作用:

<html xmlns:ex="http://example.com/ui">

如何在 Facelets 中也使用我的自定义 JSF 组件?

JSP 和 Facelets 是完全不同的视图技术。 JSP 基于 Servlet,而 Facelets 基于 XML。您不能在另一个上重复使用 tags/taglibs。 JSP 的 *.tld 个文件是 Facelets 的 *.taglib.xml 个文件。

这是一个启动示例,说明 JSF 2.0 的 Facelets taglib 文件的外观:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">

    <namespace>http://example.com/ui</namespace>

    <tag>
        <tag-name>foo</tag-name>
        <component>
            <component-type>com.example.Foo</component-type>
        </component>
    </tag>
</facelet-taglib>

如果您有 JAR 文件风格的组件库,只需将其放入 /META-INF 文件夹即可。它将被自动发现。但是,如果您将这些自定义组件耦合到 WAR 本身,则将其放入 /WEB-INF 文件夹并通过以下上下文参数将其注册到 web.xml 中:

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/example-ui.taglib.xml</param-value>
</context-param>

如果您打算选择 JSF 2.2 作为最低要求,请按如下方式更新 taglib 的根声明:

<facelet-taglib
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd"
    version="2.2">

另请参阅:

请注意,自 2009 年起,JSP 已被弃用为 JSF 的视图技术。因此,如果您打算构建一个新的自定义组件库,使其 JSP 兼容将完全是浪费精力,因为没有任何理智的 JSF 开发人员会使用它。此外,几乎所有 JSF 2.x 组件库不再支持 JSP。