PrimeFaces を拡張するカスタム コンポーネントを作成しようとしています。
test 名前空間の下に textInput という単純なコンポーネントがあります。このコンポーネントは、PrimeFaces の textInput コンポーネントを呼び出すだけで、fieldClass という名前の属性に渡された値と、渡された属性の名前を出力します。
fieldClass を文字列として渡す場合:
<test:textInput id="foo" fieldClass="field-foo" />
これが結果です
fieldClass = フィールド foo
[com.sun.faces.facelets.MARK_ID、fieldClass]
fieldClass を式として渡す場合
<ui:param name="bar" value="field-foo"/>
<test:textInput id="foo" fieldClass="#{bar}" />
fieldClass が消える
fieldClass = なし
[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;
}
}