JSF自定义组件声明必需属性

3

我想在JSF中创建一个自定义组件,并已经创建了它。现在我想为在XHTML文件中使用的自定义标签创建属性,并将它们设为强制性。

我已经创建了一个扩展自UIOutput类的组件MyJSFComponent。如何使某些属性成为强制性的呢?

1个回答

2
在UIComponent方面,你不需要这样做,而是在.taglib.xml或TagHandler方面进行。
在.taglib.xml文件中,您可以只需将 true 条目添加到属性中。
<attribute>
    <name>foo</name>
    <required>true</required>
    <type>java.lang.String</type>
</attribute>

然而,是否会出现错误取决于工具(编辑器)的支持。JSF/Facelets在运行时不会检查它。例如,Eclipse在自动完成标签时会自动内联属性,但是可以随后将其删除并且不会出现错误。

更可靠的执行方法是使用ComponentHandler类,该类提供getRequiredAttribute()方法,如果缺失则会抛出TagException异常。然后,您可以在.taglib.xml文件中注册此处理程序,如下所示:

<component>
    <component-type>com.example.SomeComponent</component-type>
    <handler-class>com.example.SomeComponentHandler</handler-class>
</component>

其中,处理程序类基本上看起来像这样:
public class SomeComponentHandler extends ComponentHandler {

    public SomeComponentHandler(ComponentConfig config) {
        super(config);
        getRequiredAttribute("foo");
    }

}

这会在运行时对属性的存在进行实际检查。

目前我正在使用UIOutput来呈现一些值。可以将此用于UIOutput组件吗?<attribute> <name>foo</name> <required>true</required> <type>java.lang.String</type> </attribute> - user2354566
抱歉,我不明白为什么这会成为一个问题。你是说你甚至没有尝试过吗?为什么不呢? - BalusC
谢谢Balu,它起作用了。我以为组件类型和处理程序类是相同的,并根据此进行更改。最终当我意识到两者指向两个不同的类时,我才能够实现它。感谢您的支持。 - user2354566

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接