组件类型名称对于自定义组件是否必须是唯一的?

时间:2016-07-03 14:32:40

标签: jsf jsf-2.2 custom-component

我是自定义组件主题的新手,从JSF 2.2开始

但是,我首先考虑使用JSF2.0

的情况

考虑一下代码段:

@FacesComponent(value = "components.WelcomeComponent1", createTag = true)
public class WelcomeComponent extends UIComponentBase {

}

请注意value = "components.WelcomeComponent1"

在UI线框中引用它 -

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:t="http://xmlns.jcp.org/jsf/component">
    <h:head>
        <title></title>
    </h:head>
    <h:body>       
        <t:welcomeComponent value="Welcome" to="Rafael Nadal"/>
    </h:body>
</html>

考虑第二种情况,第一种情况是同名,但在不同的包中使用不同的组件类型名称

@FacesComponent("components.WelcomeComponent")
public class WelcomeComponent extends UIComponentBase {
          // code goes here
}

请注意"components.WelcomeComponent"

WEB_INF 中的

taglib.xml     

    <namespace>http://atp.welcome.org/welcome</namespace>

    <tag>
        <tag-name>welcome</tag-name>
        <component>
            <component-type>components.WelcomeComponent</component-type>
        </component>

        <attribute>
            <name>id</name>
            <type>java.lang.String</type>
            <description>Component id</description>
            <required>false</required>
        </attribute>


    </tag>

</facelet-taglib>

并引用后者 -

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:t="http://atp.welcome.org/welcome">
    <h:head>
        <title></title>
    </h:head>
    <h:body>
        <t:welcome value="Welcome" to=""/>        
    </h:body>
</html>

上述两个示例都是同一个网络应用程序的一部分。工作得很好。 但是,如果我在第二种情况下更改组件类型名称,使其与第一种情况相同,

@FacesComponent("components.WelcomeComponent1")

我知道 -

  

警告:此页面调用XML命名空间   http://xmlns.jcp.org/jsf/component用前缀t声明但没有   该命名空间存在taglibrary

显然,taglib.xml中声明的条目/标签是首选。

因此,组件类型名称在每种情况下都必须唯一。正确?

我非常清楚http://xmlns.jcp.org/jsf/component引入了名称空间JSF2.2

1 个答案:

答案 0 :(得分:2)

简短回答是,它应该是唯一的。 JSF将其视为自定义组件的名称(与@ManagedBean类似)。基本上,component-type允许Application实例使用定义的组件类型和UIComponent方法创建createComponent()子类(您和所有其他自定义组件)的新实例。