我是自定义组件主题的新手,从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"
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
。
答案 0 :(得分:2)
简短回答是是,它应该是唯一的。 JSF将其视为自定义组件的名称(与@ManagedBean
类似)。基本上,component-type允许Application
实例使用定义的组件类型和UIComponent
方法创建createComponent()
子类(您和所有其他自定义组件)的新实例。