如果你只是重写 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 Type 和Component Class。
如果您在寻找标准组件,MyFaces Documentation 列出了 Component type 和 UIComponent class 以扩展标准标签(Component type 和 UIComponent class 对于 Mojarra 也是相同的)。