通过注释声明组件处理程序

时间:2014-07-31 09:10:01

标签: jsf custom-component jsf-2.2 taglib

我的自定义组件当前在自定义taglib.xml文件中声明,其中一些需要处理程序,例如:

<tag>
    <tag-name>mycomponent</tag-name>
    <component>
        <component-type>com.so.MyComponent</component-type>
        <renderer-type>com.so.MyComponentRenderer</renderer-type>
        <handler-class>com.so.MyComponentHandler</handler-class>
    </component>
</tag>

现在我想从新的基于JSF 2.2注释的声明中受益,写作:

@FacesComponent(value = MyComponent.COMPONENT_TYPE, tagName = "mycomponent", createTag = true)
public class MyComponent {

...但我无法弄清楚如何将组件处理程序附加到此类。是否有处理程序类的注释?

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

我也遇到了这个问题,尝试升级到JSF 2.2。我发现web-facelettaglibary_2_2.xsd有一个bug,与Mojarra 2.2。*实现不匹配。请参阅https://java.net/jira/browse/JAVASERVERFACES-3762

因此,如果需要为组件定义处理程序类,则仍需要在taglib文件中定义handler-class元素,如您在问题中指定的那样。此外,您必须将xsd架构降级为web-facelettaglibrary_2_0.xsd。

请注意,通过JSF 2.2扩展@FacesComponent并没有消除使用taglib文件的需要。组件处理程序类就是一个例子。根据需要标记标记属性是另一种。

最佳实践仍然要求所有组件在taglib文件中都有条目,以便正确记录它们以获取上下文帮助。由于taglib条目需要tag-name和component-type,因此不应使用@FacesComponent为每个组件定义它们。这将更容易出错。

因此,在您的示例中,您最好的选择是坚持使用:

@FacesComponent(MyComponent.COMPONENT_TYPE)
public class MyComponent {