2011-02-28 9 views
12

जब मैं जेनेरिक सर्टलेट को डीकंपाइल करता हूं और init() को चेक करता हूं, तो मुझे निम्न कोड दिखाई देता है।सर्वलेट की init() विधि के लिए क्या उपयोग किया जाता है?

public void init(ServletConfig servletconfig) 
    throws ServletException 
{ 
    config = servletconfig; 
    init(); 
} 

public void init() 
    throws ServletException 
{ 
} 

वास्तव में यहां वास्तव में क्या करना है? क्या मैं कुछ भूल रहा हूँ ?

+2

प्रश्न से संबंधित: अधिकांश servletcontainers खुले स्रोत हैं। आप अपने सर्वलेट कंटेनर के स्रोत कोड को अपने होमपेज से डाउनलोड कर सकते हैं। इसमें सर्वलेट एपीआई शामिल है। मैन्युअल रूप से इसे संकुचित करने की कोई आवश्यकता नहीं है :) – BalusC

+0

@ बालुससी आप कर सकते हैं, लेकिन यह एक कठिन प्रक्रिया है। जल्दी के लिए "यह जांचें कि यह क्या करता है" मैं डिकंपिलेशन भी पसंद करता हूं। – Bozho

+3

@ बोझो: अपूर्ण स्रोतों में javadocs शामिल नहीं है। यह शायद एक कठिन कामकाजी कार्य हो सकता है, लेकिन उसके बाद आप केवल अपने आईडीई में स्रोत शामिल कर सकते हैं और आपको कभी भी "अज्ञात स्रोत" पृष्ठ का सामना करना पड़ता है और/या प्रत्येक छोटी कक्षा को अलग-अलग डिमप्लाइल नहीं करना पड़ता है। – BalusC

उत्तर

8

javadoc से::

/** 
* 
* A convenience method which can be overridden so that there's no need 
* to call <code>super.init(config)</code>. 
* 
* <p>Instead of overriding {@link #init(ServletConfig)}, simply override 
* this method and it will be called by 
* <code>GenericServlet.init(ServletConfig config)</code>. 
* The <code>ServletConfig</code> object can still be retrieved via {@link 
* #getServletConfig}. 
* 
* @exception ServletException if an exception occurs that 
*     interrupts the servlet's 
*     normal operation 
* 
*/ 

तो यह कुछ नहीं करता है और सिर्फ एक सुविधा है उदाहरण के लिए, आप दो सर्वलेट्स है।

+2

हम सर्वलेट कन्स्ट्रक्टर के अंदर सभी प्रारंभिक/इनिट कोड क्यों नहीं डाल सकते? असल में, मेरी पुस्तक इस सवाल से पूछती है - 'एक init() विधि क्यों है? दूसरे शब्दों में, सर्वलेट को intializing के लिए पर्याप्त कन्स्ट्रक्टर क्यों नहीं है? Init() विधि' में आप किस प्रकार का कोड डाल देंगे। –

+2

_Well, जेडीके 1.0 में (जिसके लिए सर्लेट मूल रूप से लिखे गए थे), गतिशील रूप से लोड किए गए जावा क्लास (जैसे servlets) के लिए रचनाकार तर्क स्वीकार नहीं कर सके। इसलिए, एक नया सर्वलेट स्वयं और उसके पर्यावरण के बारे में कोई जानकारी प्रदान करने के लिए, सर्वर को सर्वलेट की init() विधि को कॉल करना था और एक ऑब्जेक्ट के साथ पास करना था जो ServletConfig इंटरफ़ेस_ - जावा क्रेटफोर्ड के साथ जेसन हंटर द्वारा जावा सर्वलेट प्रोग्रामिंग लागू करता है – Kay

12

हां, यह कुछ भी नहीं करता है। यह अमूर्त हो सकता था, लेकिन फिर प्रत्येक सर्वलेट को इसे लागू करने के लिए मजबूर किया जाएगा। इस तरह, डिफ़ॉल्ट रूप से, init() पर कुछ भी नहीं होता है, और प्रत्येक सर्वलेट इस व्यवहार को ओवरराइड कर सकता है।

public PropertiesServlet extends HttpServlet { 

    private Properties properties; 

    @Override 
    public void init() { 
     // load properties from disk, do be used by subsequent doGet() calls 
    } 
} 

और

public AnotherServlet extends HttpServlet { 

    // you don't need any initialization here, 
    // so you don't override the init method. 
} 
+0

लेकिन जब तक init() विधि को कॉल नहीं किया जाता है तब तक कोई अनुरोध नहीं किया जाता है। अगर इनिट विधि में कुछ नहीं होता है, तो बिंदु क्या है? – vinoth

+4

आपका सर्वलेट इसे ओवरराइड कर सकता है और निर्दिष्ट कर सकता है कि – Bozho

+1

@ बोझो - हम सर्वलेट कन्स्ट्रक्टर के अंदर सभी प्रारंभिक/इनिट कोड क्यों नहीं डाल सकते? असल में, मेरी पुस्तक इस सवाल से पूछती है - 'एक init() विधि क्यों है? दूसरे शब्दों में, सर्वलेट को intializing के लिए पर्याप्त कन्स्ट्रक्टर क्यों नहीं है? Init() विधि' में आप किस प्रकार का कोड डाल देंगे। –

3

कंस्ट्रक्टर के पास ServletConfig तक पहुंच नहीं हो सकती है क्योंकि कंटेनर ने init(ServletConfig config) विधि नहीं कहा है।

init() विधि GenericServlet से विरासत में मिली है जिसमें इसकी संपत्ति के रूप में ServletConfig है। HttpServlet और HttpServlet को बढ़ाकर आप जो भी कस्टम सर्लेट लिखते हैं, वह ServletConfig हो जाता है।

और GenericServletServletConfig लागू करता है जिसमें getServletContext विधि है। इसलिए आपके कस्टम सर्लेट init विधि दोनों में से पहुंच होगी।

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