我正在尝试创建一个自定义组件来扩展 PrimeFaces。
我在 test 命名空间下有一个名为 textInput 的简单组件,它简单地调用 PrimeFaces textInput 组件并打印出传递给名为 fieldClass 的属性的值以及传递的任何属性的名称
如果我将 fieldClass 作为字符串传递:
<test:textInput id="foo" fieldClass="field-foo" />
这是结果
fieldClass = field-foo
[com.sun.faces.facelets.MARK_ID, fieldClass]
如果我将 fieldClass 作为表达式传递
<ui:param name="bar" value="field-foo"/>
<test:textInput id="foo" fieldClass="#{bar}" />
fieldClass 消失
fieldClass = NONE
[com.sun.faces.facelets.MARK_ID]
我如何真正掌握传递给组件的属性?
自定义组件使用的类如下:
test.components.ExtendInputTextRenderer
package test.components;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.FacesRenderer;
import org.primefaces.component.inputtext.*;
@FacesRenderer(
componentFamily=ExtendInputText.COMPONENT_FAMILY,
rendererType=ExtendInputTextRenderer.RENDERER_TYPE
)
public class ExtendInputTextRenderer extends InputTextRenderer {
public static final String RENDERER_TYPE = "com.example.ExtendInputTextRenderer";
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws java.io.IOException {
ResponseWriter writer = context.getResponseWriter();
Map attrs = component.getAttributes();
String fieldClass = attrs.containsKey("fieldClass") ? (String) attrs.get("fieldClass").toString() : "NONE";
writer.write("fieldClass = " + fieldClass + "<br/>");
writer.write(attrs.keySet().toString() + "<br/>");
super.encodeEnd(context, component);
}
}
test.components.ExtendInputText
package test.components;
import javax.faces.component.FacesComponent;
import org.primefaces.component.inputtext.InputText;
@FacesComponent(ExtendInputText.COMPONENT_TYPE)
public class ExtendInputText extends InputText {
public static final String COMPONENT_FAMILY = "com.example";
public static final String COMPONENT_TYPE = "com.example.ExtendInputText";
@Override
public String getFamily() {
return COMPONENT_FAMILY;
}
@Override
public String getRendererType() {
return ExtendInputTextRenderer.RENDERER_TYPE;
}
}