placeholder
コンポーネントの属性を処理するレンダラーを作成しようとしてい<h:inputText>
ます。JSF 2.0を読んだ後、私はこのパスに向かいました。必要なHTML5属性を取り除き、それは正しいようです。これが私のカスタムレンダラーです
public class InputRenderer extends com.sun.faces.renderkit.html_basic.TextRenderer{
@Override
public void encodeBegin(FacesContext context, UIComponent component)
throws IOException {
System.out.println("Rendering :"+component.getClientId());
String placeholder = (String)component.getAttributes().get("placeholder");
if(placeholder != null) {
ResponseWriter writer = context.getResponseWriter();
writer.writeAttribute("placeholder", placeholder, "placeholder");
}
super.encodeBegin(context, component);
}
@Override
public void decode(FacesContext context, UIComponent component) {
super.decode(context, component);
}
@Override
public void encodeEnd(FacesContext context, UIComponent component)
throws IOException {
super.encodeEnd(context, component);
}
}
そして、このレンダラーは、facesconfigに次のように登録されます。
<render-kit>
<renderer>
<component-family>javax.faces.Input</component-family>
<renderer-type>javax.faces.Text</renderer-type>
<renderer-class>com.example.renderer.InputRenderer</renderer-class>
</renderer>
</render-kit>
これは問題なく登録され、問題はありません。
私の意図は、placeholder
属性を処理して挿入し、処理をsuperに委任することです。間違った場所に属性を挿入しているため、上記のコードは機能しません。実行後に挿入する必要がありますwriter.startElement('input')
。ただし、startElementはスーパーのencodeBegin()
メソッドのどこかで発生している必要があります。では、カスタム属性(この場合は「プレースホルダー」)を挿入してから実行フローを続行するにはどうすればよいですか?
注意:上記のコードはplaceholder
属性を追加しますが、意図する入力コンポーネントには追加しません。入力の親に書き込みます(コンポーネント自体が実際にストリームに書き込まれる前に属性を書き込もうとしているため、属性を現在のコンポーネントに適用します)