对于自定义的JSF组件Foo,需要添加如下taglib.xml。哪个 JSF impl (mojarra) 版本支持注释而不是 XML?
taglib.xml
<facelet-taglib ...>
<namespace>http://xmlns.example.com/</namespace>
<tag>
<description>foo</description>
<tag-name>foo</tag-name>
<component>
<component-type>com.example.component.HtmlFoo</component-type>
<renderer-type>com.example.component.Foo</renderer-type>
</component>
</tag>
</facelet-taglib>
@FacesComponent(createTag=true, namespace="http://xmlns.example.com/", tagName="foo")
public class HtmlFoo extends UIComponent {
public HtmlFoo() {
setRendererType("com.example.component.Foo");
}
public String getFamily() {
return "com.example.component.data";
}
// ...
}
public class HtmlFooTag extends UIComponentELTag {
@Override
public String getComponentType() {
return "com.example.component.HtmlFoo";
}
@Override
public String getRendererType() {
return "com.example.component.Foo";
}
// ...
}
@FacesRenderer(
componentFamily="com.example.component.data",
rendererType="com.example.component.Foo")
public class HtmlFooRenderer extends Renderer {
//...
}
使用标签:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:g="http://xmlns.example.com/">
// ...
<g:foo .../>
</html>
错误:
<g:foo> Tag Library supports namespace: http://xmlns.example.com/, but no tag was defined for name: foo
HtmlFooTag 没有注解。它是如何连接到组件 HtmlFoo 的?
自 JSF 2.2 起就支持它,无论实现如何(尽管如此,任何实现都必须遵守规范)。自 JSF 2.2 以来,JSF 2.0 中引入的
@FacesComponent
注释获得了一个 createTag
属性,您可以将其设置为 true
以跳过 XML 样板文件,以及可选的 namespace
和 tagName
属性。您可以在组件的构造函数中设置默认渲染器。
换句话说:
@FacesComponent(createTag=true, namespace="http://xmlns.example.com/", tagName="foo")
public class HtmlFoo extends UIComponent {
public HtmlFoo() {
setRendererType("com.example.component.Foo");
}
// ...
}