2009-03-17 43 views
5

Tôi có một lớp thẻ mở rộng UIComponent và UIOutput. Trong lớp này tôi có encodeBegin và encodeEnd mà tôi có thể sử dụng contextWriter của tôi để xuất ra bất kỳ thẻ html kinda nào tôi muốn bằng cách sử dụng writer.startElement ("div", myComponent) và vân vân.Làm cách nào để thêm các thành phần JSF hiện có vào các thành phần tùy chỉnh của riêng tôi?

Vấn đề của tôi bây giờ là tôi cần chèn ví dụ thay vì sử dụng writer.startElement. Tôi có thể làm điều này bằng cách làm getChildren(). Add (HtmlCommandButton button = new HtmlCommandButton()); nhưng khi làm như vậy tôi không thể xuất ra thành phần mà tôi muốn chúng xuất hiện, như tôi có thể với write.startElement.

Có ai có bất kỳ giải pháp tốt nào về cách tôi có thể tận dụng các thẻ richfaces, thẻ JSF và tương tự trong thẻ thuật ngữ của riêng tôi không? Nói tóm lại những gì tôi thực sự muốn làm là bên encodeBegin tôi:

writer.startElement("a4j:commandButton", myComponent); 
writer.writeAttribite("action", "#{Handler.myAction}", null); 
writer.endElement("a4j:commandButton"); 

Thanks bởi trước

Trả lời

3

Bạn không thể sử dụng ResponseWriter như bạn muốn. Hai cách tôi có thể nghĩ về cách thêm điều khiển con theo lập trình là thông qua thuộc tính ràng buộc (see this answer) hoặc tại nơi điều khiển thường được tạo (trong JSP, nằm trong số tag class).

Có hai cách để các thành phần JSF chứa các điều khiển khác: như trẻ em hoặc như các khía cạnh được đặt tên. Các thành phần luôn kiểm soát cách chúng biểu hiện các khía cạnh của chúng; nếu họ là để làm cho con cái của họ, họ phải trả lại đúng cho getRendersChildren.

Đây là mã chưa được kiểm tra, nhưng trình tự đi một cái gì đó như thế này:

@Override 
    public boolean getRendersChildren() { 
    return true; 
    } 

    @Override 
    public void encodeBegin(FacesContext context) 
     throws IOException { 
    // should really delegate to a renderer, but this is only demo code 
    ResponseWriter writer = context.getResponseWriter(); 
    writer.startElement("span", this); 
    String styleClass = getStyleClass(); 
    writer 
     .writeAttribute("class", styleClass, "styleClass"); 

    UIComponent headerComponent = getFacet("header"); 
    if (headerComponent != null) { 
     headerComponent.encodeAll(context); 
    } 

    writer.startElement("hr", null); 
    } 

    @Override 
    public void encodeChildren(FacesContext context) 
     throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    for (UIComponent kid : getChildren()) { 
     kid.encodeAll(context); 
     writer.startElement("br", null); 
    } 
    } 

    @Override 
    public void encodeEnd(FacesContext context) 
     throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    writer.endElement("span"); 
    } 
+0

Người đàn ông tuyệt vời. Tôi chỉ cần kiểm tra điều này. MyComponent.encodeAll (ngữ cảnh) chính xác là những gì tôi đang tìm kiếm. Cảm ơn nhiều! –

1

Không thực sự là một câu trả lời, nhiều hơn một đoán, nhưng có lẽ bạn có thể mở rộng một trong các điều khiển Facelets?

Cách khác, hoặc sử dụng trực tiếp facelets - dường như chính xác những gì bạn muốn thực sự mặc dù tôi đã không sử dụng nó bản thân mình. Hoặc bạn có thể thêm các điều khiển UIOutput nơi bạn muốn HTML xuất hiện và thiết lập giá trị của mỗi HTML bạn muốn xuất hiện - đây chính xác là những gì f: verbatim thực hiện dưới mui xe, hoặc vì vậy có vẻ như nhìn vào mã nguồn:)

+0

Có Im đã mở rộng UIOutput. Im không chắc chắn những gì tôi sẽ mở rộng cho tôi khả năng sản xuất các thành phần khác thay vì chỉ xuất ra các thẻ. Cảm ơn bạn đã trả lời. –

+0

Tôi đã xem xét một số điều khiển và chỉnh sửa câu hỏi. Tôi đã thực hiện không có gì bạn không thể làm cho mình với Google và các khuôn mặt và facelets nguồn thực sự mặc dù! –

+0

Tuyệt vời. Tôi sẽ thử điều này càng sớm càng tốt (có thể trong vòng 48 giờ vì Im không làm việc hai ngày này). Cảm ơn bạn rất nhiều vì đã dành thời gian của bạn –

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