我想知道是否可以覆盖标准的JSF组件或Primefaces组件,而不必拥有自己的命名空间?
假设我有常规的<h:outputText>
组件,我想更改escape属性的默认值。我是否可以在不创建自己的组件的情况下执行此操作,覆盖outputText并将<my:outputText>
放在任何地方?我很乐意继续使用<h:>
。
现在我在渲染器类中设置了一些值,因为它更容易,但我宁愿不这样做。
答案 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 Type
和Component Class
。
如果您要查找标准组件,MyFaces Documentation列表Component type
和UIComponent class
将扩展为标准代码(Component type
和UIComponent class
对于Mojarra来说也是如此。