2011-01-05 23 views
7

Próbuję przesłonić renderujący dla h:selectBooleanCheckbox (z powodów wyjaśnionych here):JSF 2.0: Jak zastąpić renderowania bazowe niestandardowymi?

Jednak uważam, że to niemożliwe, aby zarejestrować renderujący. Próbowałem deklarowania go w moim 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> 

Wartości złapałem od:

  • komponent-family: javax.faces.component.html.HtmlSelectBooleanCheckbox
  • renderujący typu: javax.faces.component.html.SelectBooleanCheckboxTag

Ale to nie robi nie działa.

Próbowałem też --long deklarowania RenderKit:

<description>Custom renderers</description> 
<render-kit-id>???</render-kit-id> 
<render-kit-class>com.sun.faces.renderkit.RenderKitImpl</render-kit-class> 

Ale jak widać, ja naprawdę nie wiem, gdzie chwycić wartość render-kit-id lub jeśli render-kit-class jest poprawna i tak.

pakiet Wewnątrz Mojarra istnieje plik jsf-ri-runtime.xml ale nie deklarują renderujących. Deklaruje tylko RenderKitFactory, pod którym nie znajduję niczego interesującego.

Wskaźniki?

Odpowiedz

10

Początkowej oświadczenie <renderer> wygląda dobrze, więc próbowałem go tutaj.

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); 
    } 

} 

Działa dobrze. Wszystko zostanie wydrukowane na standardowe wyjście. Twój problem leży gdzieś indziej. Używałem Mojarra 2.0.3 na Tomcat 7.0.5.

+0

niezwiązane z problemem, dlaczego kiedykolwiek użyć nie-wartości logicznych jako wartość 'selectBooleanCheckbox'? W jaki sposób obiekt nie będący boolowskim może reprezentować stan logiczny? – BalusC

+0

Hmm, masz rację, to działa. Nie testowałem wcześniej metodami encodeXXX, właśnie ustawiłem punkt przerwania na moją metodę 'getConvertedValue', która nie jest wywoływana. Przyczyna tego może być jednak przedmiotem zupełnie innego pytania. W każdym razie, czy wiesz, że istnieje lista elementów JSF, ich typy renderowania i rodziny gdzieś, czy musimy zawsze nawigować do ich klas i wyszukiwać te zmienne? –

+0

To połączenie z tabeli 8.1 do 2.0 JSF specyfikacji i [ 'COMPONENT_FAMILY'] (http://download.oracle.com/javaee/5/api/constant-values.html#javax.faces.component.UISelectBoolean.COMPONENT_FAMILY) stała wartość pola w dokumencie JSF 2.0 API. Ostatecznie można zapoznać się z rozdziałem 4.1.x specyfikacji JSF 2.0 dla obu. – BalusC

2

dodam renderujące do mojego faces-config.xml tak:

<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 --> 

Nie trzeba (i nie powinien) deklaruje nową klasę zestaw renderowania w tym scenariuszu.

+0

Czy trzeba zadeklarować 'render-kit-id' przy nadpisywaniu domyślnych? Wydaje się działać bez niego ... czy HTML_BASIC odwołuje się do "domyślnego" RenderKit? –

+0

@Tuukka Mustonen - render-kit-id jest opcjonalny dla domyślnego zestawu RenderKit (istnieje przykład w specyfikacji). HTML_BASIC jest rzeczywiście domyślnym identyfikatorem. – McDowell

+0

OK, dzięki za wyjaśnienie! –

Powiązane problemy