覆盖标准组件的默认值/实现

时间:2015-01-21 16:40:07

标签: jsf-2

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

假设我有常规的<h:outputText>组件,我想更改escape属性的默认值。我是否可以在不创建自己的组件的情况下执行此操作,覆盖outputText并将<my:outputText>放在任何地方?我很乐意继续使用<h:>

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

1 个答案:

答案 0 :(得分:2)

如果您只是覆盖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;
    }
}

面-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来说也是如此。