2014-04-30 7 views
5

मुझे एक कस्टम घटक के साथ समस्याएं आ रही हैं जिसमें मैं लिख रहा हूं कि यह किसी नेस्टेड नियंत्रण प्रदान नहीं करेगा। घटक एक साधारण लेआउट नियंत्रण है, जो एक्सटेंशन लाइब्रेरी में एप्लिकेशनलाउट नियंत्रण से बहुत कम अनुकूलित है। XPage कोड इस तरह दिखता है:कस्टम घटक नेस्टेड घटकों को प्रदर्शित नहीं करेगा

<px:exampleControl id="exampleControl1">  
    <xp:span styleClass="mySpan">Inner Text</xp:span> 
</px:exampleControl> 

उदाहरण नियंत्रण नियंत्रण प्रदान करेगा लेकिन घोंसला वाला स्पैन नहीं होगा। मेरे बुनियादी रेंडरर कोड है:

public class ExampleRenderer extends Renderer { 

@Override 
    public void encodeBegin(FacesContext context, UIComponent component) 
    throws IOException { 

    ResponseWriter writer = context.getResponseWriter(); 
    writer.startElement("div", component); 
    writer.writeAttribute("class", "custom-banner", null); 
    writer.endElement("div"); 
    writer.startElement("div", component); 
    writer.writeAttribute("class", "main-body", null);  

    } 

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

@Override 
public void encodeChildren(FacesContext context, UIComponent component) { 
    try { 
     super.encodeChildren(context, component);  
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

    @Override 
    public void encodeEnd(FacesContext context, UIComponent component) 
    throws IOException { 
    ResponseWriter writer = context.getResponseWriter(); 
    writer.endElement("div"); 
    writer.startElement("div", component); 
    writer.writeAttribute("class", "custom-footer", null);  
    writer.endElement("div"); 
    } 
} 

मैं भी एक विशेष समारोह प्रस्तुत करना एक्सटेंशन लाइब्रेरी दाता (AbstractApplicationLayoutRenderer.java में उपयोगिता कार्यों), लेकिन component.getChildCount() हमेशा 0.

रिटर्न से उधार का उपयोग करने का प्रयास किया

तो घोंसला वाले नियंत्रण क्यों नहीं हैं और मुझे क्या याद आ रही है?

+2

क्या आपने Renderer.encodeChildren को देखा था? AFAIK यह कुछ भी नहीं करता है - यही कारण है कि आपको इसे ओवरराइट करने की आवश्यकता है, इसलिए "सुपर" पर कॉल कुछ भी नहीं करता है। कम से कम आपको rendersChildren [true] को सेट करने की आवश्यकता है (http://docs.oracle.com/cd/E17802_01/j2ee/j2ee/javaserverfaces/1.1_01/docs/api/javax/faces/render/Renderer.html#encodeChildren % 28javax.faces.context.FacesContext,% 20javax.faces.component.UIComponent% 29) – stwissel

उत्तर

7

मुझे अंत में यह पता चला। रेंडरर कोड लाल हेरिंग का थोड़ा सा था क्योंकि स्टीफन (स्ट्विसेल) ने टिप्पणी की थी, रेंडरर.नकोड चिल्ड्रेन कुछ भी नहीं करता है। कई ExtLib घटकों के स्रोत को देखते हुए, उनमें से कोई भी इसका उपयोग नहीं करता है।

मेरे द्वारा किए गए परिवर्तन एक्सटेंशन वर्ग के लिए था। कीथ स्ट्रिकलैंड के ब्लॉग (http://www.keithstric.com/A55BAC/keithstric.nsf/default.xsp?documentId=82770C11FA7B9B21852579C100581766) पढ़ने और com.ibm.xsp.extlib.component.layout.UIVarPublisherBase की जांच करने के बाद, मैंने FacesComponent इंटरफ़ेस को कार्यान्वित किया। विशेष रूप से, मैं buildContents विधि को कॉल करना चाहता था जो FacesComponentBuilder को आमंत्रित करता है। FacesComponent के लिए JavaDoc इस FacesComponent के बारे में क्या कहना है:

buildContents घटक बच्चों और पहलुओं का निर्माण, डिफ़ॉल्ट कार्यान्वयन आमतौर पर है: builder.buildAll (संदर्भ, इस सच);

package com.example.component; 

import javax.faces.FacesException; 
import javax.faces.component.UIComponentBase; 
import javax.faces.context.FacesContext; 

import com.ibm.xsp.component.FacesComponent; 
import com.ibm.xsp.page.FacesComponentBuilder; 

public class CustomLayout extends UIComponentBase implements FacesComponent { 

public CustomLayout(){ 
    super(); 
    setRendererType("com.example.applicationlayout"); 
} 

@Override 
public String getFamily() { 
    return "com.example.applicationlayout"; 
} 

public void buildContents(FacesContext context, FacesComponentBuilder builder) 
     throws FacesException {  
    builder.buildAll(context, this, true); 
} 

public void initAfterContents(FacesContext context) throws FacesException { 

} 

public void initBeforeContents(FacesContext context) throws FacesException  

} 
} 

अब यह के रूप में मैं चाहता था काम करने के लिए लगता है: // includeFacets = सच

मेरे विस्तार वर्ग इस तरह देख समाप्त हो गया।

एक तरफ, ExtLib (UIWidgetContainer और UIList विशेष रूप से) में अन्य ऑब्जेक्ट्स FacesComponent को लागू किए बिना अपने बच्चों को प्रस्तुत करने के विभिन्न तरीकों के हैं। शायद एक ब्लॉग पोस्ट की आवश्यकता है।

+2

खुश है कि आपने इसे समझ लिया और मैं मदद करने में सक्षम था। मैंने पहले जवाब देने की कोशिश की लेकिन प्रमाणीकरण के मुद्दे थे। – keithstric

संबंधित मुद्दे