2009-03-05 9 views
11

मैंने अभी अपने कोड में एक बग पेश किया क्योंकि मुझे लगता है कि जेएसपी टैग लाइफसाइक्ल को गलत समझा गया है।जेएसपी टैग लाइफसाइकिल

टैग इस तरह से बग से पहले काम करता था: मैं टैग को कुछ संग्रह को एक विशेषता के रूप में पास करता हूं, और यह इसे एक तालिका के रूप में प्रदर्शित करता है। संग्रह नियंत्रक से जेएसपी में पारित किया गया था।

बग के बाद: मैंने संग्रह को सेट करने वाली विशेषता को हटा दिया। इसके बजाय, टैग में मैं जांचता हूं कि संग्रह शून्य है या नहीं, और फिर अनुरोध से नाम से इसे पकड़ें (नामकरण सम्मेलन का उपयोग करके)।

जिस चीज की मुझे उम्मीद नहीं थी: संग्रह शुरू में टैग में सेट होने के बाद, यह बाद के निष्पादन पर कभी भी शून्य नहीं होगा! इसे अभी भी टीएलडी में एक गैर-अपेक्षित विशेषता के रूप में परिभाषित किया गया था।

I अपेक्षित टैग निष्पादन के बीच पिछले मानों को पकड़ने के लिए नहीं है।

+0

विशेषता का दायरा क्या है? – cherouvim

उत्तर

12

आपने स्वयं से सवाल का जवाब दिया - यह पूल किया गया है।

ATag t = new ATag(); 
t.setPageContext(...); 
t.setParent(...); 
t.setAttribute1(value1); 
t.setAttribute2(value2); 
t.doStartTag(); 
t.doEndTag(); 
t.release(); 

यानी, आपके टैग उदाहरण doEndTag() में पुनः आरंभ कर देगा के रूप में एपीआई की आवश्यकता है: invocation sequence युक्त, क्या जावा कार्यान्वयन में लागू करने के लिए के लिए tag tutorial देखें वहाँ से लिंक किए गए पृष्ठ के साथ एक साथ,। (जूलियन क्रोनग द्वारा टिप्पणी के रूप में बदला गया, धन्यवाद)

ध्यान दें कि पूलिंग शायद कंटेनर निर्भर है, लेकिन अच्छी तरह से कानूनी है (और, एपीआई सेटअप के कारण, शायद हर जगह किया जाता है)।

1

तो उत्तर है: टैग जादुई पूल भूमि में पूल हो जाता है, और निष्पादन के बीच पुन: उपयोग किया जाता है। टैग स्पेक कहता है:

"निर्दिष्ट विशेषताओं/गुणों को सेट नहीं किया जाना चाहिए (एक सेटर विधि का उपयोग करके)।"

0

टॉमकैट 6 का निरीक्षण रिलीज() को केवल तभी लगाया जाता है जब कंटेनर बंद हो रहा हो। टैग हैंडलर इंस्टेंस सदस्यों को doEndTag() में इंस्टेंस स्थिति साफ़ करनी चाहिए। एपीआई डॉक्टर से:

"इस उदाहरण से जुड़े सभी इंस्टेंस स्थिति को रीसेट किया जाना चाहिए।"

देख TagSupport.doEndTag()

8

संक्षिप्त उत्तर: आप गुण अपने आप को श्रेय देने के लिए लिखने के लिए नहीं जा सकते। ऐसा करके, आप राज्य को अपनी ज़िम्मेदारी साफ करते हैं।

एक लंबे समय तक जवाब के लिए, JSP 2.0 Spec तय निम्नलिखित (पेज 2-51):

  • Setters सभी के लिए एक टैग का एक विशिष्ट घटना की गुण कहा जाता हो निर्दिष्ट
  • Setters नहीं हैंके लिए बुलाया गुण (डिफ़ॉल्ट मान को बरकरार रखने और आंतरिक स्थिति में एक अवैध मूल्य)
  • टैग हैंडलर का उपयोग केवल ओ द्वारा किया जा सकता है निर्दिष्ट के एक ही सेट के साथ ccurrences विशेषताओं

इन तीन अंक एक साथ की गारंटी है कि विशेषता गुण हमेशा सही ढंग से, प्रारंभ कर रहे हैं, जबकि अभी भी मूलभूत मूल्यों को बनाए रखना (एक निर्माता या एक गुण 'घोषणा में परिभाषित)। बदले में, यह केवल इस धारणा पर काम करता है कि केवल कंटेनर गुण गुणों (सेटर्स को कॉल करके) का उपयोग करता है।

पूर्णता के लिए के लिए:

  • release() एक टैग हैंडलर के कॉल के बीच आंतरिक स्थिति को रीसेट करने के लिए इस्तेमाल नहीं किया जाना चाहिए। यह केवल जीसी से पहले बुलाया जाने की गारंटी है और दीर्घकालिक संसाधनों को मुक्त करने के लिए इस्तेमाल किया जाना चाहिए।
  • यदि आप doStartTag() में इंस्टेंस चर को प्रारंभ करना चाहते हैं, तो सावधान रहें कि गुणों को ओवरराइट न करें, क्योंकि इस बिंदु पर सेटर्स को पहले से ही कंटेनर द्वारा बुलाया गया है। (देखें पेज 2-54 [2])
3

JSP 1.2 विनिर्देश TryCatchFinally इंटरफ़ेस जोड़ा

  • doEndTag() आरंभीकरण के लिए उपयोग करने के लिए है क्योंकि टैग एक अपवाद के मामले में कभी नहीं पुन: उपयोग किया जाना चाहिए सुरक्षित होना चाहिए। http://docs.oracle.com/javaee/1.4/api/javax/servlet/jsp/tagext/TryCatchFinally.html

    तो ऐसा लगता है कि आपको doStartTag() विधि में संसाधनों को आवंटित करना चाहिए और doFinally() विधि में सफाई करना चाहिए।

  • 0

    रिलीज विधि उस समय की अवधि है जब जेएसपी टैग का उपयोग समाप्त कर चुका है और टैग को रिलीज़ करने की अनुमति देने के लिए उपयोग किया जाता है।