如何在 JSF 2.2 中创建包含自定义标记和复合组件的干净标记库 (.jar)?

How can I create a clean tag library (.jar) containing custom tags and composite components in JSF 2.2?

我阅读了有关如何在网络应用程序中创建复合组件和自定义标签的各种博客文章和 Whosebug 文章,并且一切正常。我现在正在尝试将所有内容移动到可重用的 JAR 文件中。

mylib.jar 层次结构:

src/main/java
    com.example.MyComposite.java
src/main/resources/
    META-INF
        faces-config.xml
        my.taglib.xml
    META-INF/resources/components
        myComposite.xhtml
    META-INF/tags
        myTag.xhtml

my.taglib.xml:

<facelet-taglib version="2.2"
            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">

    <namespace>http://www.example.com/components</namespace>

    <tag>
        <tag-name>myTag</tag-name>
        <source>
                tags/myTag.xhtml
        </source>
    </tag>

    <tag>
        <tag-name>myComposite</tag-name>
        <component>
            <resource-id>
                components/myComposite.xhtml
            </resource-id>
        </component>
    </tag>
</facelet-taglib>

我将其构建为 jar 并在我的网络应用程序中使用,自定义标签和复合组件都运行良好。我花了 100 种不同的层次结构组合来让它工作。

我的问题是我不喜欢我似乎必须将自定义标签放在一个地方 (/tags) 而将复合组件放在另一个地方 (/resources/components)。此外,我必须引用带有 source 标签的自定义标签和带有 component/resource-id[= 的复合组件29=] 标签。例如,我尝试将 myTag.xhtml 放入 /resources/components 并使用资源 ID 引用它,但是当我尝试使用它时我得到了 NPE。

那么标签和组件是否必须在不同的目录中?我只需要忍受这种等级制度吗?

您可以将 <composite-library-name> 单独用于复合材料,以减少复合材料不必要的 <tag> 样板文件。至于标记文件,您可以将它们放在 /resources/tags 中并相应地更改 <source> 以便文件夹结构更加统一。

src/main/java
 `-- com/example/MyComposite.java

src/main/resources
 `-- META-INF
      |-- resources
      |    |-- components
      |    |    `-- myComposite.xhtml
      |    `-- tags
      |         `-- myTag.xhtml
      |-- faces-config.xml
      `-- my.taglib.xml
<facelet-taglib version="2.2"
            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">

    <namespace>http://www.example.com/components</namespace>
    <composite-library-name>components</composite-library-name>

    <tag>
        <tag-name>myTag</tag-name>
        <source>resources/tags/myTag.xhtml</source>
    </tag>
</facelet-taglib>

另请参阅:

  • Change composite-component's namespace