【问题标题】:jsf custom component declaring mandatory attributejsf自定义组件声明强制属性
【发布时间】:2014-02-06 09:13:11
【问题描述】:

我想在 JSF 中创建一个自定义组件,并且已经创建了它。现在我想为我在 XHTML 文件中使用的那个自定义标记创建属性,并使其成为强制性的。 我创建了一个从 UIOutput 类扩展的组件 MyJSFComponent。我如何强制要求某些属性?

【问题讨论】:

    标签: jsf custom-component


    【解决方案1】:

    您不会在UIComponent 方面这样做,而是在.taglib.xmlTagHandler 方面这样做。

    .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");
        }
    
    }
    

    这会对属性的存在进行真正的运行时检查。

    【讨论】:

    • 目前我正在使用 UIOutput 来呈现一些值。 footruejava.lang.String 可以和 UIOutput 组件一起使用吗?
    • 抱歉,我不明白为什么会出现问题。你是说你甚至没有尝试过吗?为什么不呢?
    • 谢谢巴鲁.. 它有效。我认为组件类型和 dhandler 类是相同的,并且正在按此进行更改。最后,当我意识到两者都指向两个不同的类时,我就成功了。感谢您的支持。
    • 不客气。由于您是新来的,请不要忘记在回答(最)有助于理解和解决具体问题时将其标记为已接受。另见How does accepting an answer work?
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2011-05-14
    • 2013-07-30
    • 2015-01-02
    • 1970-01-01
    • 2017-11-07
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多