JSF 2.0:基本レンダラーをカスタムレンダラーでオーバーライドするにはどうすればよいですか?
質問
レンダラーをオーバーライドしようとしています h:selectBooleanCheckbox
(説明した理由により、 ここ):
しかし、レンダラーを登録することができないことがわかりました。私の中で宣言してみました faces-config.xml
:
<render-kit>
<renderer>
<component-family>javax.faces.SelectBoolean</component-family>
<renderer-type>javax.faces.Checkbox</renderer-type>
<renderer-class>com.myapp.CustomCheckboxRenderer</renderer-class>
</renderer>
</render-kit>
私が取得した値:
- コンポーネントファミリー:
javax.faces.component.html.HtmlSelectBooleanCheckbox
- レンダラタイプ:
javax.faces.component.html.SelectBooleanCheckboxTag
しかし、うまくいきません。
また、冗長に宣言してみました RenderKit
:
<description>Custom renderers</description>
<render-kit-id>???</render-kit-id>
<render-kit-class>com.sun.faces.renderkit.RenderKitImpl</render-kit-class>
しかし、ご覧のとおり、どこで価値を掴めばいいのかわかりません render-kit-id
または、 render-kit-class
とにかく正しいです。
Mojarra パッケージ内にはファイルがあります jsf-ri-runtime.xml
ただし、レンダラーは宣言されていません。宣言するだけです RenderKitFactory
, 、その下には直接興味深いものは見つかりません。
ポインタ?
解決
あなたの初期<renderer>
宣言は罰金に見える、私はここでそれを試してみましたので。
package com.myapp;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.sun.faces.renderkit.html_basic.CheckboxRenderer;
public class CustomCheckboxRenderer extends CheckboxRenderer {
public CustomCheckboxRenderer() {
System.out.println("CustomCheckboxRenderer <init>");
}
@Override
public void decode(FacesContext context, UIComponent component) {
System.out.println("CustomCheckboxRenderer decode()");
super.decode(context, component);
}
@Override
public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
System.out.println("CustomCheckboxRenderer encodeBegin()");
super.encodeBegin(context, component);
}
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
System.out.println("CustomCheckboxRenderer encodeEnd()");
super.encodeEnd(context, component);
}
}
これは、罰金に動作します。すべてのstdoutに出力されます。あなたの問題は、どこか別の場所にあります。私は、Tomcat 7.0.5上クロサギ科2.0.3を使用していた。
他のヒント
私はそうのように私のfaces-config.xml
にレンダラーを追加します:
<faces-config>
<!--elided-->
<render-kit>
<render-kit-id>HTML_BASIC</render-kit-id>
<renderer>
<display-name>MyRenderer</display-name>
<component-family>javax.faces.Output</component-family>
<renderer-type>foo.MyRenderer</renderer-type>
<renderer-class>foo.MyRenderer</renderer-class>
<!-- TODO: attributes for tooling -->
あなたがする必要はありません(といけない)このシナリオでは、新しいレンダリングキットのクラスを宣言します。
所属していません StackOverflow