2011-01-05 24 views
7

Tôi đang cố gắng ghi đè trình kết xuất cho h:selectBooleanCheckbox (vì lý do được giải thích here):JSF 2.0: Làm cách nào để ghi đè lên trình kết xuất cơ sở bằng trình tùy chỉnh?

Tuy nhiên, tôi thấy không thể đăng ký trình kết xuất của tôi. Tôi đã cố gắng tuyên bố nó trong tôi 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> 

Các giá trị Tôi túm lấy từ:

  • thành phần gia đình: javax.faces.component.html.HtmlSelectBooleanCheckbox
  • renderer-type: javax.faces.component.html.SelectBooleanCheckboxTag

Nhưng nó doesn 't làm việc.

Tôi cũng đã cố gắng một cách chi tiết tuyên bố RenderKit:

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

Nhưng như bạn thấy, tôi không thực sự biết được nơi để lấy giá trị cho render-kit-id hoặc nếu render-kit-class là đúng anyway.

Bên trong gói Mojarra có tệp jsf-ri-runtime.xml nhưng không khai báo trình kết xuất đồ họa. Nó chỉ tuyên bố một RenderKitFactory, theo đó tôi không trực tiếp tìm thấy bất cứ điều gì quan tâm.

Con trỏ?

Trả lời

10

Khai báo ban đầu <renderer> của bạn có vẻ ổn, vì vậy tôi đã thử nó ở đây.

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

} 

Nó hoạt động tốt. Tất cả đều được in để xuất bản. Vấn đề của bạn nằm ở một nơi khác. Tôi đã sử dụng Mojarra 2.0.3 trên Tomcat 7.0.5.

+0

Không liên quan đến vấn đề này, tại sao bạn lại sử dụng các giá trị không phải là boolean làm giá trị của một 'selectBooleanCheckbox'? Làm thế nào một đối tượng phi boolean đại diện cho một trạng thái boolean? – BalusC

+0

Hmm, bạn nói đúng, nó hoạt động. Tôi đã không thử nghiệm với các phương thức mã hóaXXX trước đây, tôi chỉ thiết lập điểm ngắt cho phương thức 'getConvertedValue' của trình kết xuất tùy chỉnh, mà không được gọi. Lý do cho rằng có thể là chủ đề của một câu hỏi hoàn toàn khác nhau, tuy nhiên. Dù sao, bạn có biết nếu có một danh sách cho các thành phần JSF, các kiểu kết xuất và gia đình của họ ở đâu đó, hay chúng ta phải luôn điều hướng đến các lớp của chúng và tìm kiếm các biến này? –

+0

Đó là sự kết hợp của bảng 8.1 trong thông số JSF 2.0 và ['COMPONENT_FAMILY'] (http://download.oracle.com/javaee/5/api/constant-values.html#javax.faces.component.UISelectBoolean.COMPONENT_FAMILY) giá trị trường không đổi trong tài liệu API JSF 2.0. Cuối cùng, chương 4.1.x của đặc tả JSF 2.0 có thể được tư vấn cho cả hai. – BalusC

2

tôi thêm kết xuất đồ họa để faces-config.xml tôi như vậy:

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

Bạn không cần phải (và không nên) tuyên bố một render lớp bộ mới trong kịch bản này.

+0

Có cần khai báo 'render-kit-id' khi ghi đè các giá trị mặc định không? Dường như làm việc mà không có nó ... không HTML_BASIC tham khảo "mặc định" RenderKit? –

+0

@Tuukka Mustonen - render-kit-id là tùy chọn cho RenderKit mặc định (có ví dụ trong thông số kỹ thuật). HTML_BASIC thực sự là id mặc định. – McDowell

+0

Ok, cảm ơn vì đã làm rõ! –

Các vấn đề liên quan