<h:inputText>
コンポーネントのplaceholder
属性を処理するレンダラーを作成しようとしています。 JSF 2.0 strips out needed HTML5 attributesを読んだ後、私はこの道に向かいましたが、それは正しいようです。ここに私のカスタムレンダラはJSF 2.0 UIInputコンポーネントへのカスタム属性(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);
}
}
だとこのレンダラーが
<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
属性を処理し、それを挿入して、処理をスーパーに委任することです。間違った場所に属性を挿入しているため、上記のコードは機能しません。 writer.startElement('input')
が実行された後に挿入する必要があります。ただし、startElementはスーパーのencodeBegin()
メソッドのどこかで発生している必要があります。では、カスタム属性(この場合は「プレースホルダ」)を挿入して実行フローを続行するにはどうすればよいですか?
NB:上記のコードは、私が意図する入力コンポーネントにはplaceholder
属性を追加しません。入力の親に書き込みます(実際にはコンポーネント自体が実際に作成される前に属性を書き込もうとしています)。現在のコンポーネントに属性を適用します)。
これははるかに実用的で最良の答えです! :) – Nikhil
お返事ありがとうございます。これは公平な回答ですが、コードにはバグがあります。 get(attribute)の戻り値はObjectであり、これはブール値(例えば 'required'属性を考慮する)です。 (String)キャストを完全に削除し、return-typeをObjectとして設定します。 –
これは ''親と ''子では機能しません。 JSFは ' '要素の代わりに''要素に' required'属性を置きます。私はJSFが好きですか? –