【问题标题】:Overriding standard components default values / implementation覆盖标准组件默认值/实现
【发布时间】:2015-01-21 16:40:06
【问题描述】:

我想知道是否可以覆盖标准 JSF 组件或 Primefaces 组件而不必为它们拥有自己的命名空间?

假设我有常规的<h:outputText> 组件,我想更改转义属性的默认值。我可以在不必创建自己的组件、覆盖 outputText 并将<my:outputText> 到处放置的情况下做到这一点吗?我很乐意继续使用<h:>

现在我正在渲染器类中设置一些值,因为它更容易,但我不想这样做。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    如果你只是重写 Component-Class,你仍然可以使用旧标签:

    此示例将值 foo-bar 更改为 BAR_FOO

    page.xhtml:

    <h:outputText value="foo-bar" />
    

    自定义组件类:

    package org.example.myComponents;
    import javax.faces.component.html.HtmlOutputText;
    public class DefaultOutput extends HtmlOutputText {
        @Override
        public Object getValue() {
            Object value = super.getValue();
            if(value != null && value instanceof String) {
                String val = (String) value;
                if(val.equals("foo-bar")) {
                    value = "BAR_FOO";
                    setValue(value);
                }
            }
            return value;
        }
    }
    

    faces-config.xml

    <component> 
        <component-type>javax.faces.HtmlOutputText</component-type> 
        <component-class>org.example.myComponents.DefaultOutput</component-class> 
    </component>
    

    浏览器中的输出:

    BAR_FOO
    

    在自定义组件类中,您可以覆盖您想要提供默认值的方法。 我用它在p:calendar 上设置默认值,我也调用了setter,因为我的默认值的计算相当昂贵:

    @Override
    public String getPattern() {
        String pattern = (String) getStateHelper().eval(PropertyKeys.pattern);
        if(pattern == null) {
            pattern = getLocaleBean().getInputDateFormatPattern();
            setPattern(pattern);
        }
        return pattern;
    }
    

    我不会打电话给super.getPattern(),因为在某些情况下这会给我一个 Primefaces-Default-Value。相反,我直接访问了getStateHelper().eval


    如何知道,为特定组件标签扩展的组件类型和类是什么?

    如果你使用 PrimefacesCompnents 很容易,Primefaces User Guide 描述了每个组件的Component TypeComponent Class

    如果您在寻找标准组件,MyFaces Documentation 列出了 Component typeUIComponent class 以扩展标准标签(Component typeUIComponent class 对于 Mojarra 也是相同的)。

    【讨论】:

    • Hmmm.... 来自原始问题:“现在我正在渲染器类中设置一些值,因为它更容易,但我不想这样做。”
    • 你必须像这个组件一样扩展一个渲染器类并注册它。我认为提问者的意思是“比带有自定义标签 (&lt;my:outputText&gt;) 的自定义组件更容易”。有了这个灵魂,他仍然可以使用&lt;h:&gt;
    • 可能是,但如果 OP 知道如何做到这一点,我想知道为什么您提到的解决方案没有被尝试...让我们等待 ;-)
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 2022-06-23
    • 2019-03-19
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多