【发布时间】:2014-02-06 09:13:11
【问题描述】:
我想在 JSF 中创建一个自定义组件,并且已经创建了它。现在我想为我在 XHTML 文件中使用的那个自定义标记创建属性,并使其成为强制性的。 我创建了一个从 UIOutput 类扩展的组件 MyJSFComponent。我如何强制要求某些属性?
【问题讨论】:
标签: jsf custom-component
我想在 JSF 中创建一个自定义组件,并且已经创建了它。现在我想为我在 XHTML 文件中使用的那个自定义标记创建属性,并使其成为强制性的。 我创建了一个从 UIOutput 类扩展的组件 MyJSFComponent。我如何强制要求某些属性?
【问题讨论】:
标签: jsf custom-component
您不会在UIComponent 方面这样做,而是在.taglib.xml 或TagHandler 方面这样做。
在.taglib.xml 文件中,您只需将<required>true</required> 条目添加到属性。
<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");
}
}
这会对属性的存在进行真正的运行时检查。
【讨论】: