如何在一个名称空间下捆绑几个JSF2复合组件库

时间:2012-01-16 15:27:43

标签: jsf-2 namespaces taglib composite-component

我们有一堆JSF 1.2 facelets组件(ui:composition)。它们被组织在不同的文件夹中......

facelets
   /tags
      /inputfields
      /layout
      /core
      /...

它们在一个名称空间下的标记库描述符中注册:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
    "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
    "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">

<facelet-taglib>
    <namespace>http://www.ourcompany.de/jsf</namespace>

    <tag>
        <tag-name>desktop</tag-name>
        <source>./facelets/tags/layout/desktop.xhtml</source>
    </tag>

    <tag>
        <tag-name>inputField</tag-name>
        <source>./facelets/tags/inputfields/inputField.xhtml</source>
    </tag>

        ...
</facelet-taglib>

我们希望它们成为JSF 2复合组件,并希望将它们组织在单独的文件夹中。按照惯例,JSF 2将它们作为复合组件提供,如果它们被移动到/resources文件夹中。但是,必须为每个子文件夹使用不同的名称空间才能使用视图中的组件。

不幸的是,类似下面的内容不起作用,因为只能声明一个复合库名称:

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

    <namespace>http://ourcompany.de/jsftags</namespace>    
    <composite-library-name>components/input</composite-library-name>
    <composite-library-name>components/core</composite-library-name>
    <composite-library-name>components/layout</composite-library-name>
</facelet-taglib>

有没有办法为所有复合组件使用相同的命名空间而不将它们移动到一个文件夹中?

1 个答案:

答案 0 :(得分:0)

您可以将组件移动到几个由文件夹名称命名的servlet 3.0 Web片段,例如输入或核心。每个片段都有一个子文件夹META-INF/resources/yourBaseFolderName。将片段组合到一个Web应用程序中时,容器会将内容合并到一个可由公共命名空间寻址的文件夹中。