2009-03-17 11 views
5

मेरे पास एक टैग क्लास है जो UIComponent और UIOutput को बढ़ाती है। इस कक्षा में मेरे पास एन्कोड है और एन्कोड है जिसमें मैं अपने संदर्भ का उपयोग कर सकता हूं, किसी भी प्रकार का एचटीएमएल टैग आउटपुट करने के लिए मैं लेखक को भी लिखना चाहता हूं। स्टार्ट एलीमेंट ("div", myComponent) और इसी तरह।मौजूदा जेएसएफ घटकों को अपने स्वयं के कस्टम घटकों में कैसे जोड़ना है?

मेरी समस्या यह है कि मुझे उदाहरण के लिए डालने की आवश्यकता है उदाहरण के लिए .startElement। मैं getChildren() जोड़कर ऐसा कर सकता हूं। (एचटीएमएल कॉमांड बटन बटन = नया एचटीएमएल कमांड बटन()); लेकिन ऐसा करने पर ऐसा लगता है कि मैं उस घटक को आउटपुट नहीं कर सकता जहां मैं उन्हें दिखाना चाहता हूं, जैसे मैं लिख सकता हूं .startElement।

क्या किसी के पास कोई अच्छा समाधान है कि मैं कैसे समृद्ध टैग, जेएसएफ टैग और अपनी खुद की टैग लाइब्रेरी में समान लाभ उठा सकता हूं? संक्षेप में क्या मैं वास्तव में क्या करना चाहते हैं जाएगा मेरी encodeBegin अंदर है: एक अनुमान के अधिक अग्रिम

उत्तर

3

आप ResponseWriter का उपयोग नहीं कर सकते हैं जैसा आप चाहते हैं। दो तरीकों से मैं सोच सकता हूं कि बाल नियंत्रण को प्रोग्रामेटिक रूप से कैसे जोड़ना है बाध्यकारी विशेषता (see this answer) या उस स्थान पर जहां नियंत्रण आमतौर पर बनाया जाता है (जेएसपी में, जो tag class में है)।

जेएसएफ घटकों के अन्य नियंत्रणों के लिए दो तरीके हैं: बच्चों या नामित पहलुओं के रूप में। घटक हमेशा नियंत्रित करते हैं कि वे अपने पहलुओं को कैसे प्रस्तुत करते हैं; अगर वे अपने बच्चों को प्रस्तुत करना चाहते हैं, तो उन्हें getRendersChildren के लिए सच होना चाहिए।

यह अपरीक्षित कोड है, लेकिन इस क्रम कुछ इस तरह चला जाता है:

@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

उत्कृष्ट आदमी। मुझे बस इसका परीक्षण करना पड़ा। MyComponent.encodeAll (संदर्भ) वही था जो मैं खोज रहा था। आपका बहुत बहुत धन्यवाद! –

1

नहीं वास्तव में एक जवाब से

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

धन्यवाद, है, लेकिन हो सकता है आप facelets नियंत्रणों में से एक का विस्तार कर सकता है?

वैकल्पिक रूप से, या तो सीधे चेहरे का उपयोग करें - जो वास्तव में वही है जो आप वास्तव में चाहते हैं हालांकि मैंने इसे स्वयं नहीं उपयोग किया है। या आप यूआईयूयूपुट नियंत्रण जोड़ सकते हैं जहां आप HTML को दिखाना चाहते हैं और प्रत्येक के मान को उस HTML पर सेट करें जिसे आप दिखाना चाहते हैं - यह वही है जो f: verbatim हुड के नीचे होता है, या ऐसा लगता है कि यह स्रोत कोड को देखने से लगता है: -)

+0

हाँ मैं पहले से ही UIOutput विस्तार। मुझे यकीन नहीं है कि मैं क्या बढ़ाऊंगा जो मुझे केवल टैग आउटपुट करने के बजाय अन्य घटकों को आउटपुट करने की क्षमता देता है। जवाब के लिए धन्यवाद। –

+0

मैंने कुछ नियंत्रणों पर चारों ओर देखा है और सवाल संपादित किया है। मैंने कुछ भी नहीं किया है जो आप Google और चेहरे और चेहरे के स्रोतों के साथ खुद को नहीं कर सकते हैं! –

+0

उत्कृष्ट। मैं जितनी जल्दी हो सके कोशिश करूँगा (शायद 48 घंटों के भीतर क्योंकि मैं इन दो दिनों में काम नहीं करता हूं)। आपके समय के लिए बहुत बहुत धन्यवाद –

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